{
  "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": "customers.spec.js",
      "file": "customers.spec.js",
      "column": 0,
      "line": 0,
      "specs": [],
      "suites": [
        {
          "title": "Customer Management — Smoke",
          "file": "customers.spec.js",
          "line": 35,
          "column": 6,
          "specs": [
            {
              "title": "page returns 200",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 350,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:38:28",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 28,
                          "line": 38
                        },
                        "snippet": "  36 |   test('page returns 200', async ({ page }) => {\n  37 |     const resp = await page.goto(BASE_URL);\n> 38 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  39 |   });\n  40 |\n  41 |   test('manifest.json returns 200', async ({ page }) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 28,
                            "line": 38
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n  36 |   test('page returns 200', async ({ page }) => {\n  37 |     const resp = await page.goto(BASE_URL);\n> 38 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  39 |   });\n  40 |\n  41 |   test('manifest.json returns 200', async ({ page }) => {\n    at /var/www/360lm/tests/customers.spec.js:38:28"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:09:14.545Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Management-—-Smoke-page-returns-200-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Management-—-Smoke-page-returns-200-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 28,
                        "line": 38
                      }
                    },
                    {
                      "workerIndex": 1,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 391,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:38:28",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 28,
                          "line": 38
                        },
                        "snippet": "  36 |   test('page returns 200', async ({ page }) => {\n  37 |     const resp = await page.goto(BASE_URL);\n> 38 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  39 |   });\n  40 |\n  41 |   test('manifest.json returns 200', async ({ page }) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 28,
                            "line": 38
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n  36 |   test('page returns 200', async ({ page }) => {\n  37 |     const resp = await page.goto(BASE_URL);\n> 38 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  39 |   });\n  40 |\n  41 |   test('manifest.json returns 200', async ({ page }) => {\n    at /var/www/360lm/tests/customers.spec.js:38:28"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:09:15.984Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Management-—-Smoke-page-returns-200-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Management-—-Smoke-page-returns-200-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 28,
                        "line": 38
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-e9d6297e3101affe9128",
              "file": "customers.spec.js",
              "line": 36,
              "column": 3
            },
            {
              "title": "manifest.json returns 200",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 394,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:43:28",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 28,
                          "line": 43
                        },
                        "snippet": "  41 |   test('manifest.json returns 200', async ({ page }) => {\n  42 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 43 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  44 |   });\n  45 |\n  46 |   test('HTML carries current customers SW version', async () => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 28,
                            "line": 43
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n  41 |   test('manifest.json returns 200', async ({ page }) => {\n  42 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 43 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  44 |   });\n  45 |\n  46 |   test('HTML carries current customers SW version', async () => {\n    at /var/www/360lm/tests/customers.spec.js:43:28"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:09:17.508Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-eb985-e-manifest-json-returns-200-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-eb985-e-manifest-json-returns-200-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 28,
                        "line": 43
                      }
                    },
                    {
                      "workerIndex": 3,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 363,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:43:28",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 28,
                          "line": 43
                        },
                        "snippet": "  41 |   test('manifest.json returns 200', async ({ page }) => {\n  42 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 43 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  44 |   });\n  45 |\n  46 |   test('HTML carries current customers SW version', async () => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 28,
                            "line": 43
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n  41 |   test('manifest.json returns 200', async ({ page }) => {\n  42 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 43 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  44 |   });\n  45 |\n  46 |   test('HTML carries current customers SW version', async () => {\n    at /var/www/360lm/tests/customers.spec.js:43:28"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:09:19.032Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-eb985-e-manifest-json-returns-200-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-eb985-e-manifest-json-returns-200-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 28,
                        "line": 43
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-0df5c1370fbf06584ea1",
              "file": "customers.spec.js",
              "line": 41,
              "column": 3
            },
            {
              "title": "HTML carries current customers SW version",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 4,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 64,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/customers-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/customers-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:50:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 50
                        },
                        "snippet": "  48 |     const resp = await ctx.get(BASE_URL);\n  49 |     const html = await resp.text();\n> 50 |     expect(html).toMatch(/customers-v\\d+/);\n     |                  ^\n  51 |     expect(html).toContain('Customer Management');\n  52 |     await ctx.dispose();\n  53 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 50
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/customers-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  48 |     const resp = await ctx.get(BASE_URL);\n  49 |     const html = await resp.text();\n> 50 |     expect(html).toMatch(/customers-v\\d+/);\n     |                  ^\n  51 |     expect(html).toContain('Customer Management');\n  52 |     await ctx.dispose();\n  53 |   });\n    at /var/www/360lm/tests/customers.spec.js:50:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:09:20.458Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-8e11e-urrent-customers-SW-version-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 50
                      }
                    },
                    {
                      "workerIndex": 5,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 65,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/customers-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/customers-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:50:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 50
                        },
                        "snippet": "  48 |     const resp = await ctx.get(BASE_URL);\n  49 |     const html = await resp.text();\n> 50 |     expect(html).toMatch(/customers-v\\d+/);\n     |                  ^\n  51 |     expect(html).toContain('Customer Management');\n  52 |     await ctx.dispose();\n  53 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 50
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/customers-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  48 |     const resp = await ctx.get(BASE_URL);\n  49 |     const html = await resp.text();\n> 50 |     expect(html).toMatch(/customers-v\\d+/);\n     |                  ^\n  51 |     expect(html).toContain('Customer Management');\n  52 |     await ctx.dispose();\n  53 |   });\n    at /var/www/360lm/tests/customers.spec.js:50:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:09:21.519Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-8e11e-urrent-customers-SW-version-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 50
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-6157cb5a036f2a3a80a8",
              "file": "customers.spec.js",
              "line": 46,
              "column": 3
            },
            {
              "title": "page returns 200",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 202,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 449,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:38:28",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 28,
                          "line": 38
                        },
                        "snippet": "  36 |   test('page returns 200', async ({ page }) => {\n  37 |     const resp = await page.goto(BASE_URL);\n> 38 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  39 |   });\n  40 |\n  41 |   test('manifest.json returns 200', async ({ page }) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 28,
                            "line": 38
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n  36 |   test('page returns 200', async ({ page }) => {\n  37 |     const resp = await page.goto(BASE_URL);\n> 38 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  39 |   });\n  40 |\n  41 |   test('manifest.json returns 200', async ({ page }) => {\n    at /var/www/360lm/tests/customers.spec.js:38:28"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:26:03.155Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Management-—-Smoke-page-returns-200-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Management-—-Smoke-page-returns-200-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 28,
                        "line": 38
                      }
                    },
                    {
                      "workerIndex": 203,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 349,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:38:28",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 28,
                          "line": 38
                        },
                        "snippet": "  36 |   test('page returns 200', async ({ page }) => {\n  37 |     const resp = await page.goto(BASE_URL);\n> 38 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  39 |   });\n  40 |\n  41 |   test('manifest.json returns 200', async ({ page }) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 28,
                            "line": 38
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n  36 |   test('page returns 200', async ({ page }) => {\n  37 |     const resp = await page.goto(BASE_URL);\n> 38 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  39 |   });\n  40 |\n  41 |   test('manifest.json returns 200', async ({ page }) => {\n    at /var/www/360lm/tests/customers.spec.js:38:28"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:26:04.960Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Management-—-Smoke-page-returns-200-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Management-—-Smoke-page-returns-200-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 28,
                        "line": 38
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-f165b2460984b233e429",
              "file": "customers.spec.js",
              "line": 36,
              "column": 3
            },
            {
              "title": "manifest.json returns 200",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 204,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 296,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:43:28",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 28,
                          "line": 43
                        },
                        "snippet": "  41 |   test('manifest.json returns 200', async ({ page }) => {\n  42 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 43 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  44 |   });\n  45 |\n  46 |   test('HTML carries current customers SW version', async () => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 28,
                            "line": 43
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n  41 |   test('manifest.json returns 200', async ({ page }) => {\n  42 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 43 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  44 |   });\n  45 |\n  46 |   test('HTML carries current customers SW version', async () => {\n    at /var/www/360lm/tests/customers.spec.js:43:28"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:26:06.435Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-eb985-e-manifest-json-returns-200-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-eb985-e-manifest-json-returns-200-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 28,
                        "line": 43
                      }
                    },
                    {
                      "workerIndex": 205,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 513,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:43:28",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 28,
                          "line": 43
                        },
                        "snippet": "  41 |   test('manifest.json returns 200', async ({ page }) => {\n  42 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 43 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  44 |   });\n  45 |\n  46 |   test('HTML carries current customers SW version', async () => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 28,
                            "line": 43
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n  41 |   test('manifest.json returns 200', async ({ page }) => {\n  42 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 43 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  44 |   });\n  45 |\n  46 |   test('HTML carries current customers SW version', async () => {\n    at /var/www/360lm/tests/customers.spec.js:43:28"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:26:08.178Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-eb985-e-manifest-json-returns-200-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-eb985-e-manifest-json-returns-200-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 28,
                        "line": 43
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-371a4afb2e803856f388",
              "file": "customers.spec.js",
              "line": 41,
              "column": 3
            },
            {
              "title": "HTML carries current customers SW version",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 206,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 73,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/customers-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/customers-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:50:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 50
                        },
                        "snippet": "  48 |     const resp = await ctx.get(BASE_URL);\n  49 |     const html = await resp.text();\n> 50 |     expect(html).toMatch(/customers-v\\d+/);\n     |                  ^\n  51 |     expect(html).toContain('Customer Management');\n  52 |     await ctx.dispose();\n  53 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 50
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/customers-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  48 |     const resp = await ctx.get(BASE_URL);\n  49 |     const html = await resp.text();\n> 50 |     expect(html).toMatch(/customers-v\\d+/);\n     |                  ^\n  51 |     expect(html).toContain('Customer Management');\n  52 |     await ctx.dispose();\n  53 |   });\n    at /var/www/360lm/tests/customers.spec.js:50:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:26:09.953Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-8e11e-urrent-customers-SW-version-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 50
                      }
                    },
                    {
                      "workerIndex": 207,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 59,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/customers-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/customers-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:50:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 50
                        },
                        "snippet": "  48 |     const resp = await ctx.get(BASE_URL);\n  49 |     const html = await resp.text();\n> 50 |     expect(html).toMatch(/customers-v\\d+/);\n     |                  ^\n  51 |     expect(html).toContain('Customer Management');\n  52 |     await ctx.dispose();\n  53 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 50
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/customers-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  48 |     const resp = await ctx.get(BASE_URL);\n  49 |     const html = await resp.text();\n> 50 |     expect(html).toMatch(/customers-v\\d+/);\n     |                  ^\n  51 |     expect(html).toContain('Customer Management');\n  52 |     await ctx.dispose();\n  53 |   });\n    at /var/www/360lm/tests/customers.spec.js:50:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:26:10.934Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-8e11e-urrent-customers-SW-version-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 50
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-73420dd91226c3c7f835",
              "file": "customers.spec.js",
              "line": 46,
              "column": 3
            }
          ]
        },
        {
          "title": "Customer Management — HTML Structure",
          "file": "customers.spec.js",
          "line": 59,
          "column": 6,
          "specs": [
            {
              "title": "three core screens present",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 6,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 11,
                      "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\"id=\\\"s-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"s-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:68:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 68
                        },
                        "snippet": "  66 |\n  67 |   test('three core screens present', () => {\n> 68 |     expect(html).toContain('id=\"s-list\"');\n     |                  ^\n  69 |     expect(html).toContain('id=\"s-detail\"');\n  70 |     expect(html).toContain('id=\"s-form\"');\n  71 |     expect(html).toContain('id=\"s-pipeline\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 68
                          },
                          "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\"id=\\\"s-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  66 |\n  67 |   test('three core screens present', () => {\n> 68 |     expect(html).toContain('id=\"s-list\"');\n     |                  ^\n  69 |     expect(html).toContain('id=\"s-detail\"');\n  70 |     expect(html).toContain('id=\"s-form\"');\n  71 |     expect(html).toContain('id=\"s-pipeline\"');\n    at /var/www/360lm/tests/customers.spec.js:68:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:09:22.578Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-8c9d9--three-core-screens-present-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 68
                      }
                    },
                    {
                      "workerIndex": 7,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 11,
                      "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\"id=\\\"s-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"s-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:68:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 68
                        },
                        "snippet": "  66 |\n  67 |   test('three core screens present', () => {\n> 68 |     expect(html).toContain('id=\"s-list\"');\n     |                  ^\n  69 |     expect(html).toContain('id=\"s-detail\"');\n  70 |     expect(html).toContain('id=\"s-form\"');\n  71 |     expect(html).toContain('id=\"s-pipeline\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 68
                          },
                          "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\"id=\\\"s-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  66 |\n  67 |   test('three core screens present', () => {\n> 68 |     expect(html).toContain('id=\"s-list\"');\n     |                  ^\n  69 |     expect(html).toContain('id=\"s-detail\"');\n  70 |     expect(html).toContain('id=\"s-form\"');\n  71 |     expect(html).toContain('id=\"s-pipeline\"');\n    at /var/www/360lm/tests/customers.spec.js:68:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:09:23.590Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-8c9d9--three-core-screens-present-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 68
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-5f8e39fdb938cceeea27",
              "file": "customers.spec.js",
              "line": 67,
              "column": 3
            },
            {
              "title": "summary tiles present",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 8,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 11,
                      "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\"id=\\\"t-total\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"t-total\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:75:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 75
                        },
                        "snippet": "  73 |\n  74 |   test('summary tiles present', () => {\n> 75 |     expect(html).toContain('id=\"t-total\"');\n     |                  ^\n  76 |     expect(html).toContain('id=\"t-business\"');\n  77 |     expect(html).toContain('id=\"t-individual\"');\n  78 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 75
                          },
                          "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\"id=\\\"t-total\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  73 |\n  74 |   test('summary tiles present', () => {\n> 75 |     expect(html).toContain('id=\"t-total\"');\n     |                  ^\n  76 |     expect(html).toContain('id=\"t-business\"');\n  77 |     expect(html).toContain('id=\"t-individual\"');\n  78 |   });\n    at /var/www/360lm/tests/customers.spec.js:75:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:09:24.576Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-b84ff-cture-summary-tiles-present-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 75
                      }
                    },
                    {
                      "workerIndex": 9,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 16,
                      "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\"id=\\\"t-total\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"t-total\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:75:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 75
                        },
                        "snippet": "  73 |\n  74 |   test('summary tiles present', () => {\n> 75 |     expect(html).toContain('id=\"t-total\"');\n     |                  ^\n  76 |     expect(html).toContain('id=\"t-business\"');\n  77 |     expect(html).toContain('id=\"t-individual\"');\n  78 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 75
                          },
                          "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\"id=\\\"t-total\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  73 |\n  74 |   test('summary tiles present', () => {\n> 75 |     expect(html).toContain('id=\"t-total\"');\n     |                  ^\n  76 |     expect(html).toContain('id=\"t-business\"');\n  77 |     expect(html).toContain('id=\"t-individual\"');\n  78 |   });\n    at /var/www/360lm/tests/customers.spec.js:75:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:09:25.915Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-b84ff-cture-summary-tiles-present-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 75
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-522ecc727dc24c2c7563",
              "file": "customers.spec.js",
              "line": 74,
              "column": 3
            },
            {
              "title": "bottom nav has 3 tabs (List, Pipeline, Add)",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 10,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 13,
                      "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\"id=\\\"nav-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"nav-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:81:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 81
                        },
                        "snippet": "  79 |\n  80 |   test('bottom nav has 3 tabs (List, Pipeline, Add)', () => {\n> 81 |     expect(html).toContain('id=\"nav-list\"');\n     |                  ^\n  82 |     expect(html).toContain('id=\"nav-pipeline\"');\n  83 |     expect(html).toContain('id=\"nav-add\"');\n  84 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 81
                          },
                          "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\"id=\\\"nav-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  79 |\n  80 |   test('bottom nav has 3 tabs (List, Pipeline, Add)', () => {\n> 81 |     expect(html).toContain('id=\"nav-list\"');\n     |                  ^\n  82 |     expect(html).toContain('id=\"nav-pipeline\"');\n  83 |     expect(html).toContain('id=\"nav-add\"');\n  84 |   });\n    at /var/www/360lm/tests/customers.spec.js:81:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:09:27.190Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-aa480-s-3-tabs-List-Pipeline-Add--android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 81
                      }
                    },
                    {
                      "workerIndex": 11,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 14,
                      "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\"id=\\\"nav-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"nav-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:81:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 81
                        },
                        "snippet": "  79 |\n  80 |   test('bottom nav has 3 tabs (List, Pipeline, Add)', () => {\n> 81 |     expect(html).toContain('id=\"nav-list\"');\n     |                  ^\n  82 |     expect(html).toContain('id=\"nav-pipeline\"');\n  83 |     expect(html).toContain('id=\"nav-add\"');\n  84 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 81
                          },
                          "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\"id=\\\"nav-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  79 |\n  80 |   test('bottom nav has 3 tabs (List, Pipeline, Add)', () => {\n> 81 |     expect(html).toContain('id=\"nav-list\"');\n     |                  ^\n  82 |     expect(html).toContain('id=\"nav-pipeline\"');\n  83 |     expect(html).toContain('id=\"nav-add\"');\n  84 |   });\n    at /var/www/360lm/tests/customers.spec.js:81:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:09:28.410Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-aa480-s-3-tabs-List-Pipeline-Add--android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 81
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-62ac64c1180bdbb6c4d9",
              "file": "customers.spec.js",
              "line": 80,
              "column": 3
            },
            {
              "title": "7 detail tabs declared",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 12,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 15,
                      "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\"data-tab=\\\"info\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"data-tab=\\\"info\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at forEach (/var/www/360lm/tests/customers.spec.js:88:34)\n    at /var/www/360lm/tests/customers.spec.js:88:8",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 34,
                          "line": 88
                        },
                        "snippet": "  86 |   test('7 detail tabs declared', () => {\n  87 |     ['info','contacts','addresses','jobs','offers','deals','comms']\n> 88 |       .forEach(t => expect(html).toContain(`data-tab=\"${t}\"`));\n     |                                  ^\n  89 |   });\n  90 |\n  91 |   test('15 customer form fields present', () => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 34,
                            "line": 88
                          },
                          "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\"data-tab=\\\"info\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  86 |   test('7 detail tabs declared', () => {\n  87 |     ['info','contacts','addresses','jobs','offers','deals','comms']\n> 88 |       .forEach(t => expect(html).toContain(`data-tab=\"${t}\"`));\n     |                                  ^\n  89 |   });\n  90 |\n  91 |   test('15 customer form fields present', () => {\n    at forEach (/var/www/360lm/tests/customers.spec.js:88:34)\n    at /var/www/360lm/tests/customers.spec.js:88:8"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:09:29.574Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-7578e-ture-7-detail-tabs-declared-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 34,
                        "line": 88
                      }
                    },
                    {
                      "workerIndex": 13,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 10,
                      "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\"data-tab=\\\"info\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"data-tab=\\\"info\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at forEach (/var/www/360lm/tests/customers.spec.js:88:34)\n    at /var/www/360lm/tests/customers.spec.js:88:8",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 34,
                          "line": 88
                        },
                        "snippet": "  86 |   test('7 detail tabs declared', () => {\n  87 |     ['info','contacts','addresses','jobs','offers','deals','comms']\n> 88 |       .forEach(t => expect(html).toContain(`data-tab=\"${t}\"`));\n     |                                  ^\n  89 |   });\n  90 |\n  91 |   test('15 customer form fields present', () => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 34,
                            "line": 88
                          },
                          "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\"data-tab=\\\"info\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  86 |   test('7 detail tabs declared', () => {\n  87 |     ['info','contacts','addresses','jobs','offers','deals','comms']\n> 88 |       .forEach(t => expect(html).toContain(`data-tab=\"${t}\"`));\n     |                                  ^\n  89 |   });\n  90 |\n  91 |   test('15 customer form fields present', () => {\n    at forEach (/var/www/360lm/tests/customers.spec.js:88:34)\n    at /var/www/360lm/tests/customers.spec.js:88:8"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:09:30.672Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-7578e-ture-7-detail-tabs-declared-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 34,
                        "line": 88
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-30c06fcd1c909206d225",
              "file": "customers.spec.js",
              "line": 86,
              "column": 3
            },
            {
              "title": "15 customer form fields present",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 14,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 11,
                      "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\"id=\\\"f-name\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"f-name\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at forEach (/var/www/360lm/tests/customers.spec.js:94:66)\n    at /var/www/360lm/tests/customers.spec.js:94:39",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 66,
                          "line": 94
                        },
                        "snippet": "  92 |     ['f-name','f-proprietor','f-display','f-gstin','f-pan','f-phone','f-email',\n  93 |      'f-website','f-industry','f-group','f-territory','f-source','f-currency',\n> 94 |      'f-terms','f-aliases','f-notes'].forEach(id => expect(html).toContain(`id=\"${id}\"`));\n     |                                                                  ^\n  95 |   });\n  96 |\n  97 |   test('lookup datalists present', () => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 66,
                            "line": 94
                          },
                          "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\"id=\\\"f-name\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  92 |     ['f-name','f-proprietor','f-display','f-gstin','f-pan','f-phone','f-email',\n  93 |      'f-website','f-industry','f-group','f-territory','f-source','f-currency',\n> 94 |      'f-terms','f-aliases','f-notes'].forEach(id => expect(html).toContain(`id=\"${id}\"`));\n     |                                                                  ^\n  95 |   });\n  96 |\n  97 |   test('lookup datalists present', () => {\n    at forEach (/var/www/360lm/tests/customers.spec.js:94:66)\n    at /var/www/360lm/tests/customers.spec.js:94:39"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:09:31.694Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-71b96-ustomer-form-fields-present-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 66,
                        "line": 94
                      }
                    },
                    {
                      "workerIndex": 15,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 11,
                      "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\"id=\\\"f-name\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"f-name\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at forEach (/var/www/360lm/tests/customers.spec.js:94:66)\n    at /var/www/360lm/tests/customers.spec.js:94:39",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 66,
                          "line": 94
                        },
                        "snippet": "  92 |     ['f-name','f-proprietor','f-display','f-gstin','f-pan','f-phone','f-email',\n  93 |      'f-website','f-industry','f-group','f-territory','f-source','f-currency',\n> 94 |      'f-terms','f-aliases','f-notes'].forEach(id => expect(html).toContain(`id=\"${id}\"`));\n     |                                                                  ^\n  95 |   });\n  96 |\n  97 |   test('lookup datalists present', () => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 66,
                            "line": 94
                          },
                          "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\"id=\\\"f-name\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  92 |     ['f-name','f-proprietor','f-display','f-gstin','f-pan','f-phone','f-email',\n  93 |      'f-website','f-industry','f-group','f-territory','f-source','f-currency',\n> 94 |      'f-terms','f-aliases','f-notes'].forEach(id => expect(html).toContain(`id=\"${id}\"`));\n     |                                                                  ^\n  95 |   });\n  96 |\n  97 |   test('lookup datalists present', () => {\n    at forEach (/var/www/360lm/tests/customers.spec.js:94:66)\n    at /var/www/360lm/tests/customers.spec.js:94:39"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:09:32.725Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-71b96-ustomer-form-fields-present-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 66,
                        "line": 94
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-cc9a0fe79859a1118ed0",
              "file": "customers.spec.js",
              "line": 91,
              "column": 3
            },
            {
              "title": "lookup datalists present",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 11,
                      "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\"id=\\\"dl-industries\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"dl-industries\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:98:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 98
                        },
                        "snippet": "   96 |\n   97 |   test('lookup datalists present', () => {\n>  98 |     expect(html).toContain('id=\"dl-industries\"');\n      |                  ^\n   99 |     expect(html).toContain('id=\"dl-groups\"');\n  100 |     expect(html).toContain('id=\"dl-territories\"');\n  101 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 98
                          },
                          "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\"id=\\\"dl-industries\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n   96 |\n   97 |   test('lookup datalists present', () => {\n>  98 |     expect(html).toContain('id=\"dl-industries\"');\n      |                  ^\n   99 |     expect(html).toContain('id=\"dl-groups\"');\n  100 |     expect(html).toContain('id=\"dl-territories\"');\n  101 |   });\n    at /var/www/360lm/tests/customers.spec.js:98:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:09:33.822Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-0e8d8-re-lookup-datalists-present-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 98
                      }
                    },
                    {
                      "workerIndex": 17,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 10,
                      "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\"id=\\\"dl-industries\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"dl-industries\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:98:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 98
                        },
                        "snippet": "   96 |\n   97 |   test('lookup datalists present', () => {\n>  98 |     expect(html).toContain('id=\"dl-industries\"');\n      |                  ^\n   99 |     expect(html).toContain('id=\"dl-groups\"');\n  100 |     expect(html).toContain('id=\"dl-territories\"');\n  101 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 98
                          },
                          "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\"id=\\\"dl-industries\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n   96 |\n   97 |   test('lookup datalists present', () => {\n>  98 |     expect(html).toContain('id=\"dl-industries\"');\n      |                  ^\n   99 |     expect(html).toContain('id=\"dl-groups\"');\n  100 |     expect(html).toContain('id=\"dl-territories\"');\n  101 |   });\n    at /var/www/360lm/tests/customers.spec.js:98:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:09:34.841Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-0e8d8-re-lookup-datalists-present-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 98
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-b7a0df22874b33a82d1c",
              "file": "customers.spec.js",
              "line": 97,
              "column": 3
            },
            {
              "title": "lead modal + opp modal present",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 18,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 12,
                      "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\"id=\\\"modal-lead\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"modal-lead\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:104:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 104
                        },
                        "snippet": "  102 |\n  103 |   test('lead modal + opp modal present', () => {\n> 104 |     expect(html).toContain('id=\"modal-lead\"');\n      |                  ^\n  105 |     expect(html).toContain('id=\"modal-opp\"');\n  106 |     expect(html).toContain('id=\"modal-contact\"');\n  107 |     expect(html).toContain('id=\"modal-address\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 104
                          },
                          "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\"id=\\\"modal-lead\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  102 |\n  103 |   test('lead modal + opp modal present', () => {\n> 104 |     expect(html).toContain('id=\"modal-lead\"');\n      |                  ^\n  105 |     expect(html).toContain('id=\"modal-opp\"');\n  106 |     expect(html).toContain('id=\"modal-contact\"');\n  107 |     expect(html).toContain('id=\"modal-address\"');\n    at /var/www/360lm/tests/customers.spec.js:104:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:09:35.869Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-531b9-ead-modal-opp-modal-present-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 104
                      }
                    },
                    {
                      "workerIndex": 19,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 12,
                      "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\"id=\\\"modal-lead\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"modal-lead\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:104:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 104
                        },
                        "snippet": "  102 |\n  103 |   test('lead modal + opp modal present', () => {\n> 104 |     expect(html).toContain('id=\"modal-lead\"');\n      |                  ^\n  105 |     expect(html).toContain('id=\"modal-opp\"');\n  106 |     expect(html).toContain('id=\"modal-contact\"');\n  107 |     expect(html).toContain('id=\"modal-address\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 104
                          },
                          "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\"id=\\\"modal-lead\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  102 |\n  103 |   test('lead modal + opp modal present', () => {\n> 104 |     expect(html).toContain('id=\"modal-lead\"');\n      |                  ^\n  105 |     expect(html).toContain('id=\"modal-opp\"');\n  106 |     expect(html).toContain('id=\"modal-contact\"');\n  107 |     expect(html).toContain('id=\"modal-address\"');\n    at /var/www/360lm/tests/customers.spec.js:104:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:09:36.900Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-531b9-ead-modal-opp-modal-present-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 104
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-8df24b41a5fbf04a1cce",
              "file": "customers.spec.js",
              "line": 103,
              "column": 3
            },
            {
              "title": "three core screens present",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 208,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 9,
                      "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\"id=\\\"s-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"s-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:68:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 68
                        },
                        "snippet": "  66 |\n  67 |   test('three core screens present', () => {\n> 68 |     expect(html).toContain('id=\"s-list\"');\n     |                  ^\n  69 |     expect(html).toContain('id=\"s-detail\"');\n  70 |     expect(html).toContain('id=\"s-form\"');\n  71 |     expect(html).toContain('id=\"s-pipeline\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 68
                          },
                          "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\"id=\\\"s-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  66 |\n  67 |   test('three core screens present', () => {\n> 68 |     expect(html).toContain('id=\"s-list\"');\n     |                  ^\n  69 |     expect(html).toContain('id=\"s-detail\"');\n  70 |     expect(html).toContain('id=\"s-form\"');\n  71 |     expect(html).toContain('id=\"s-pipeline\"');\n    at /var/www/360lm/tests/customers.spec.js:68:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:26:11.973Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-8c9d9--three-core-screens-present-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 68
                      }
                    },
                    {
                      "workerIndex": 209,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 10,
                      "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\"id=\\\"s-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"s-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:68:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 68
                        },
                        "snippet": "  66 |\n  67 |   test('three core screens present', () => {\n> 68 |     expect(html).toContain('id=\"s-list\"');\n     |                  ^\n  69 |     expect(html).toContain('id=\"s-detail\"');\n  70 |     expect(html).toContain('id=\"s-form\"');\n  71 |     expect(html).toContain('id=\"s-pipeline\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 68
                          },
                          "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\"id=\\\"s-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  66 |\n  67 |   test('three core screens present', () => {\n> 68 |     expect(html).toContain('id=\"s-list\"');\n     |                  ^\n  69 |     expect(html).toContain('id=\"s-detail\"');\n  70 |     expect(html).toContain('id=\"s-form\"');\n  71 |     expect(html).toContain('id=\"s-pipeline\"');\n    at /var/www/360lm/tests/customers.spec.js:68:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:26:13.056Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-8c9d9--three-core-screens-present-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 68
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-f73b7e5e85b88318561a",
              "file": "customers.spec.js",
              "line": 67,
              "column": 3
            },
            {
              "title": "summary tiles present",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 210,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 8,
                      "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\"id=\\\"t-total\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"t-total\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:75:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 75
                        },
                        "snippet": "  73 |\n  74 |   test('summary tiles present', () => {\n> 75 |     expect(html).toContain('id=\"t-total\"');\n     |                  ^\n  76 |     expect(html).toContain('id=\"t-business\"');\n  77 |     expect(html).toContain('id=\"t-individual\"');\n  78 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 75
                          },
                          "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\"id=\\\"t-total\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  73 |\n  74 |   test('summary tiles present', () => {\n> 75 |     expect(html).toContain('id=\"t-total\"');\n     |                  ^\n  76 |     expect(html).toContain('id=\"t-business\"');\n  77 |     expect(html).toContain('id=\"t-individual\"');\n  78 |   });\n    at /var/www/360lm/tests/customers.spec.js:75:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:26:14.055Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-b84ff-cture-summary-tiles-present-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 75
                      }
                    },
                    {
                      "workerIndex": 211,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 14,
                      "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\"id=\\\"t-total\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"t-total\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:75:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 75
                        },
                        "snippet": "  73 |\n  74 |   test('summary tiles present', () => {\n> 75 |     expect(html).toContain('id=\"t-total\"');\n     |                  ^\n  76 |     expect(html).toContain('id=\"t-business\"');\n  77 |     expect(html).toContain('id=\"t-individual\"');\n  78 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 75
                          },
                          "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\"id=\\\"t-total\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  73 |\n  74 |   test('summary tiles present', () => {\n> 75 |     expect(html).toContain('id=\"t-total\"');\n     |                  ^\n  76 |     expect(html).toContain('id=\"t-business\"');\n  77 |     expect(html).toContain('id=\"t-individual\"');\n  78 |   });\n    at /var/www/360lm/tests/customers.spec.js:75:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:26:14.963Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-b84ff-cture-summary-tiles-present-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 75
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-efa840ec357d99650046",
              "file": "customers.spec.js",
              "line": 74,
              "column": 3
            },
            {
              "title": "bottom nav has 3 tabs (List, Pipeline, Add)",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 212,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 9,
                      "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\"id=\\\"nav-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"nav-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:81:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 81
                        },
                        "snippet": "  79 |\n  80 |   test('bottom nav has 3 tabs (List, Pipeline, Add)', () => {\n> 81 |     expect(html).toContain('id=\"nav-list\"');\n     |                  ^\n  82 |     expect(html).toContain('id=\"nav-pipeline\"');\n  83 |     expect(html).toContain('id=\"nav-add\"');\n  84 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 81
                          },
                          "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\"id=\\\"nav-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  79 |\n  80 |   test('bottom nav has 3 tabs (List, Pipeline, Add)', () => {\n> 81 |     expect(html).toContain('id=\"nav-list\"');\n     |                  ^\n  82 |     expect(html).toContain('id=\"nav-pipeline\"');\n  83 |     expect(html).toContain('id=\"nav-add\"');\n  84 |   });\n    at /var/www/360lm/tests/customers.spec.js:81:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:26:15.942Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-aa480-s-3-tabs-List-Pipeline-Add--desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 81
                      }
                    },
                    {
                      "workerIndex": 213,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 11,
                      "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\"id=\\\"nav-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"nav-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:81:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 81
                        },
                        "snippet": "  79 |\n  80 |   test('bottom nav has 3 tabs (List, Pipeline, Add)', () => {\n> 81 |     expect(html).toContain('id=\"nav-list\"');\n     |                  ^\n  82 |     expect(html).toContain('id=\"nav-pipeline\"');\n  83 |     expect(html).toContain('id=\"nav-add\"');\n  84 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 81
                          },
                          "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\"id=\\\"nav-list\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  79 |\n  80 |   test('bottom nav has 3 tabs (List, Pipeline, Add)', () => {\n> 81 |     expect(html).toContain('id=\"nav-list\"');\n     |                  ^\n  82 |     expect(html).toContain('id=\"nav-pipeline\"');\n  83 |     expect(html).toContain('id=\"nav-add\"');\n  84 |   });\n    at /var/www/360lm/tests/customers.spec.js:81:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:26:16.924Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-aa480-s-3-tabs-List-Pipeline-Add--desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 81
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-6cabb518a8e5a9312eeb",
              "file": "customers.spec.js",
              "line": 80,
              "column": 3
            },
            {
              "title": "7 detail tabs declared",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 214,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 9,
                      "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\"data-tab=\\\"info\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"data-tab=\\\"info\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at forEach (/var/www/360lm/tests/customers.spec.js:88:34)\n    at /var/www/360lm/tests/customers.spec.js:88:8",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 34,
                          "line": 88
                        },
                        "snippet": "  86 |   test('7 detail tabs declared', () => {\n  87 |     ['info','contacts','addresses','jobs','offers','deals','comms']\n> 88 |       .forEach(t => expect(html).toContain(`data-tab=\"${t}\"`));\n     |                                  ^\n  89 |   });\n  90 |\n  91 |   test('15 customer form fields present', () => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 34,
                            "line": 88
                          },
                          "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\"data-tab=\\\"info\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  86 |   test('7 detail tabs declared', () => {\n  87 |     ['info','contacts','addresses','jobs','offers','deals','comms']\n> 88 |       .forEach(t => expect(html).toContain(`data-tab=\"${t}\"`));\n     |                                  ^\n  89 |   });\n  90 |\n  91 |   test('15 customer form fields present', () => {\n    at forEach (/var/www/360lm/tests/customers.spec.js:88:34)\n    at /var/www/360lm/tests/customers.spec.js:88:8"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:26:17.877Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-7578e-ture-7-detail-tabs-declared-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 34,
                        "line": 88
                      }
                    },
                    {
                      "workerIndex": 215,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 10,
                      "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\"data-tab=\\\"info\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"data-tab=\\\"info\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at forEach (/var/www/360lm/tests/customers.spec.js:88:34)\n    at /var/www/360lm/tests/customers.spec.js:88:8",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 34,
                          "line": 88
                        },
                        "snippet": "  86 |   test('7 detail tabs declared', () => {\n  87 |     ['info','contacts','addresses','jobs','offers','deals','comms']\n> 88 |       .forEach(t => expect(html).toContain(`data-tab=\"${t}\"`));\n     |                                  ^\n  89 |   });\n  90 |\n  91 |   test('15 customer form fields present', () => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 34,
                            "line": 88
                          },
                          "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\"data-tab=\\\"info\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  86 |   test('7 detail tabs declared', () => {\n  87 |     ['info','contacts','addresses','jobs','offers','deals','comms']\n> 88 |       .forEach(t => expect(html).toContain(`data-tab=\"${t}\"`));\n     |                                  ^\n  89 |   });\n  90 |\n  91 |   test('15 customer form fields present', () => {\n    at forEach (/var/www/360lm/tests/customers.spec.js:88:34)\n    at /var/www/360lm/tests/customers.spec.js:88:8"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:26:18.832Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-7578e-ture-7-detail-tabs-declared-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 34,
                        "line": 88
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-4f88e1b595a18f55a0a3",
              "file": "customers.spec.js",
              "line": 86,
              "column": 3
            },
            {
              "title": "15 customer form fields present",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 216,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 12,
                      "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\"id=\\\"f-name\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"f-name\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at forEach (/var/www/360lm/tests/customers.spec.js:94:66)\n    at /var/www/360lm/tests/customers.spec.js:94:39",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 66,
                          "line": 94
                        },
                        "snippet": "  92 |     ['f-name','f-proprietor','f-display','f-gstin','f-pan','f-phone','f-email',\n  93 |      'f-website','f-industry','f-group','f-territory','f-source','f-currency',\n> 94 |      'f-terms','f-aliases','f-notes'].forEach(id => expect(html).toContain(`id=\"${id}\"`));\n     |                                                                  ^\n  95 |   });\n  96 |\n  97 |   test('lookup datalists present', () => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 66,
                            "line": 94
                          },
                          "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\"id=\\\"f-name\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  92 |     ['f-name','f-proprietor','f-display','f-gstin','f-pan','f-phone','f-email',\n  93 |      'f-website','f-industry','f-group','f-territory','f-source','f-currency',\n> 94 |      'f-terms','f-aliases','f-notes'].forEach(id => expect(html).toContain(`id=\"${id}\"`));\n     |                                                                  ^\n  95 |   });\n  96 |\n  97 |   test('lookup datalists present', () => {\n    at forEach (/var/www/360lm/tests/customers.spec.js:94:66)\n    at /var/www/360lm/tests/customers.spec.js:94:39"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:26:19.830Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-71b96-ustomer-form-fields-present-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 66,
                        "line": 94
                      }
                    },
                    {
                      "workerIndex": 217,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 16,
                      "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\"id=\\\"f-name\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"f-name\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at forEach (/var/www/360lm/tests/customers.spec.js:94:66)\n    at /var/www/360lm/tests/customers.spec.js:94:39",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 66,
                          "line": 94
                        },
                        "snippet": "  92 |     ['f-name','f-proprietor','f-display','f-gstin','f-pan','f-phone','f-email',\n  93 |      'f-website','f-industry','f-group','f-territory','f-source','f-currency',\n> 94 |      'f-terms','f-aliases','f-notes'].forEach(id => expect(html).toContain(`id=\"${id}\"`));\n     |                                                                  ^\n  95 |   });\n  96 |\n  97 |   test('lookup datalists present', () => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 66,
                            "line": 94
                          },
                          "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\"id=\\\"f-name\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  92 |     ['f-name','f-proprietor','f-display','f-gstin','f-pan','f-phone','f-email',\n  93 |      'f-website','f-industry','f-group','f-territory','f-source','f-currency',\n> 94 |      'f-terms','f-aliases','f-notes'].forEach(id => expect(html).toContain(`id=\"${id}\"`));\n     |                                                                  ^\n  95 |   });\n  96 |\n  97 |   test('lookup datalists present', () => {\n    at forEach (/var/www/360lm/tests/customers.spec.js:94:66)\n    at /var/www/360lm/tests/customers.spec.js:94:39"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:26:20.826Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-71b96-ustomer-form-fields-present-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 66,
                        "line": 94
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-1ddf72a00dc8df77db12",
              "file": "customers.spec.js",
              "line": 91,
              "column": 3
            },
            {
              "title": "lookup datalists present",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 218,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 15,
                      "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\"id=\\\"dl-industries\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"dl-industries\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:98:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 98
                        },
                        "snippet": "   96 |\n   97 |   test('lookup datalists present', () => {\n>  98 |     expect(html).toContain('id=\"dl-industries\"');\n      |                  ^\n   99 |     expect(html).toContain('id=\"dl-groups\"');\n  100 |     expect(html).toContain('id=\"dl-territories\"');\n  101 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 98
                          },
                          "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\"id=\\\"dl-industries\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n   96 |\n   97 |   test('lookup datalists present', () => {\n>  98 |     expect(html).toContain('id=\"dl-industries\"');\n      |                  ^\n   99 |     expect(html).toContain('id=\"dl-groups\"');\n  100 |     expect(html).toContain('id=\"dl-territories\"');\n  101 |   });\n    at /var/www/360lm/tests/customers.spec.js:98:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:26:21.853Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-0e8d8-re-lookup-datalists-present-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 98
                      }
                    },
                    {
                      "workerIndex": 219,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 11,
                      "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\"id=\\\"dl-industries\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"dl-industries\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:98:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 98
                        },
                        "snippet": "   96 |\n   97 |   test('lookup datalists present', () => {\n>  98 |     expect(html).toContain('id=\"dl-industries\"');\n      |                  ^\n   99 |     expect(html).toContain('id=\"dl-groups\"');\n  100 |     expect(html).toContain('id=\"dl-territories\"');\n  101 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 98
                          },
                          "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\"id=\\\"dl-industries\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n   96 |\n   97 |   test('lookup datalists present', () => {\n>  98 |     expect(html).toContain('id=\"dl-industries\"');\n      |                  ^\n   99 |     expect(html).toContain('id=\"dl-groups\"');\n  100 |     expect(html).toContain('id=\"dl-territories\"');\n  101 |   });\n    at /var/www/360lm/tests/customers.spec.js:98:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:26:22.875Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-0e8d8-re-lookup-datalists-present-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 98
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-4c0d15d80cce9bbfdfa6",
              "file": "customers.spec.js",
              "line": 97,
              "column": 3
            },
            {
              "title": "lead modal + opp modal present",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 220,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 10,
                      "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\"id=\\\"modal-lead\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"modal-lead\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:104:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 104
                        },
                        "snippet": "  102 |\n  103 |   test('lead modal + opp modal present', () => {\n> 104 |     expect(html).toContain('id=\"modal-lead\"');\n      |                  ^\n  105 |     expect(html).toContain('id=\"modal-opp\"');\n  106 |     expect(html).toContain('id=\"modal-contact\"');\n  107 |     expect(html).toContain('id=\"modal-address\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 104
                          },
                          "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\"id=\\\"modal-lead\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  102 |\n  103 |   test('lead modal + opp modal present', () => {\n> 104 |     expect(html).toContain('id=\"modal-lead\"');\n      |                  ^\n  105 |     expect(html).toContain('id=\"modal-opp\"');\n  106 |     expect(html).toContain('id=\"modal-contact\"');\n  107 |     expect(html).toContain('id=\"modal-address\"');\n    at /var/www/360lm/tests/customers.spec.js:104:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:26:23.788Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-531b9-ead-modal-opp-modal-present-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 104
                      }
                    },
                    {
                      "workerIndex": 221,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 10,
                      "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\"id=\\\"modal-lead\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"modal-lead\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:104:18",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 18,
                          "line": 104
                        },
                        "snippet": "  102 |\n  103 |   test('lead modal + opp modal present', () => {\n> 104 |     expect(html).toContain('id=\"modal-lead\"');\n      |                  ^\n  105 |     expect(html).toContain('id=\"modal-opp\"');\n  106 |     expect(html).toContain('id=\"modal-contact\"');\n  107 |     expect(html).toContain('id=\"modal-address\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 18,
                            "line": 104
                          },
                          "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\"id=\\\"modal-lead\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  102 |\n  103 |   test('lead modal + opp modal present', () => {\n> 104 |     expect(html).toContain('id=\"modal-lead\"');\n      |                  ^\n  105 |     expect(html).toContain('id=\"modal-opp\"');\n  106 |     expect(html).toContain('id=\"modal-contact\"');\n  107 |     expect(html).toContain('id=\"modal-address\"');\n    at /var/www/360lm/tests/customers.spec.js:104:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:26:24.746Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-531b9-ead-modal-opp-modal-present-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 18,
                        "line": 104
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-aae65bac51fc3aec54c3",
              "file": "customers.spec.js",
              "line": 103,
              "column": 3
            }
          ]
        },
        {
          "title": "Customer Management — Seed dataset",
          "file": "customers.spec.js",
          "line": 114,
          "column": 6,
          "specs": [
            {
              "title": "test customers exist in customers_v",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 20,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 65,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m8\u001b[39m\nReceived:    \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m8\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:121:25",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 25,
                          "line": 121
                        },
                        "snippet": "  119 |     });\n  120 |     const rows = await r.json();\n> 121 |     expect(rows.length).toBeGreaterThanOrEqual(8);\n      |                         ^\n  122 |     const park = rows.find(c => c.customer_id === 'cm-test-park-hospital');\n  123 |     expect(park).toBeTruthy();\n  124 |     expect(park.contact_count).toBeGreaterThanOrEqual(3);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 25,
                            "line": 121
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m8\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n\n  119 |     });\n  120 |     const rows = await r.json();\n> 121 |     expect(rows.length).toBeGreaterThanOrEqual(8);\n      |                         ^\n  122 |     const park = rows.find(c => c.customer_id === 'cm-test-park-hospital');\n  123 |     expect(park).toBeTruthy();\n  124 |     expect(park.contact_count).toBeGreaterThanOrEqual(3);\n    at /var/www/360lm/tests/customers.spec.js:121:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:09:37.865Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-f511c-tomers-exist-in-customers-v-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 25,
                        "line": 121
                      }
                    },
                    {
                      "workerIndex": 21,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 68,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m8\u001b[39m\nReceived:    \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m8\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:121:25",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 25,
                          "line": 121
                        },
                        "snippet": "  119 |     });\n  120 |     const rows = await r.json();\n> 121 |     expect(rows.length).toBeGreaterThanOrEqual(8);\n      |                         ^\n  122 |     const park = rows.find(c => c.customer_id === 'cm-test-park-hospital');\n  123 |     expect(park).toBeTruthy();\n  124 |     expect(park.contact_count).toBeGreaterThanOrEqual(3);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 25,
                            "line": 121
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m8\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n\n  119 |     });\n  120 |     const rows = await r.json();\n> 121 |     expect(rows.length).toBeGreaterThanOrEqual(8);\n      |                         ^\n  122 |     const park = rows.find(c => c.customer_id === 'cm-test-park-hospital');\n  123 |     expect(park).toBeTruthy();\n  124 |     expect(park.contact_count).toBeGreaterThanOrEqual(3);\n    at /var/www/360lm/tests/customers.spec.js:121:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:09:38.795Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-f511c-tomers-exist-in-customers-v-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 25,
                        "line": 121
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-7e54c96a4e3023f9b968",
              "file": "customers.spec.js",
              "line": 115,
              "column": 3
            },
            {
              "title": "test leads cover all 4 active statuses",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 22,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 61,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:136:33",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 33,
                          "line": 136
                        },
                        "snippet": "  134 |     const rows = await r.json();\n  135 |     const statuses = new Set(rows.map(r => r.status));\n> 136 |     expect(statuses.has('new')).toBeTruthy();\n      |                                 ^\n  137 |     expect(statuses.has('contacted')).toBeTruthy();\n  138 |     expect(statuses.has('qualified')).toBeTruthy();\n  139 |     expect(statuses.has('disqualified')).toBeTruthy();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 33,
                            "line": 136
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n\n  134 |     const rows = await r.json();\n  135 |     const statuses = new Set(rows.map(r => r.status));\n> 136 |     expect(statuses.has('new')).toBeTruthy();\n      |                                 ^\n  137 |     expect(statuses.has('contacted')).toBeTruthy();\n  138 |     expect(statuses.has('qualified')).toBeTruthy();\n  139 |     expect(statuses.has('disqualified')).toBeTruthy();\n    at /var/www/360lm/tests/customers.spec.js:136:33"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:09:39.779Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-fd9b9-cover-all-4-active-statuses-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 33,
                        "line": 136
                      }
                    },
                    {
                      "workerIndex": 23,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 60,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:136:33",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 33,
                          "line": 136
                        },
                        "snippet": "  134 |     const rows = await r.json();\n  135 |     const statuses = new Set(rows.map(r => r.status));\n> 136 |     expect(statuses.has('new')).toBeTruthy();\n      |                                 ^\n  137 |     expect(statuses.has('contacted')).toBeTruthy();\n  138 |     expect(statuses.has('qualified')).toBeTruthy();\n  139 |     expect(statuses.has('disqualified')).toBeTruthy();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 33,
                            "line": 136
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n\n  134 |     const rows = await r.json();\n  135 |     const statuses = new Set(rows.map(r => r.status));\n> 136 |     expect(statuses.has('new')).toBeTruthy();\n      |                                 ^\n  137 |     expect(statuses.has('contacted')).toBeTruthy();\n  138 |     expect(statuses.has('qualified')).toBeTruthy();\n  139 |     expect(statuses.has('disqualified')).toBeTruthy();\n    at /var/www/360lm/tests/customers.spec.js:136:33"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:09:40.842Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-fd9b9-cover-all-4-active-statuses-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 33,
                        "line": 136
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-462eb6b8d4635a7cc5d6",
              "file": "customers.spec.js",
              "line": 129,
              "column": 3
            },
            {
              "title": "opportunities span all 5 stages",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 24,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 62,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:150:41",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 41,
                          "line": 150
                        },
                        "snippet": "  148 |     const rows = await r.json();\n  149 |     const stages = new Set(rows.map(r => r.stage));\n> 150 |     expect(stages.has('qualification')).toBeTruthy();\n      |                                         ^\n  151 |     expect(stages.has('proposal')).toBeTruthy();\n  152 |     expect(stages.has('negotiation')).toBeTruthy();\n  153 |     expect(stages.has('won')).toBeTruthy();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 41,
                            "line": 150
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n\n  148 |     const rows = await r.json();\n  149 |     const stages = new Set(rows.map(r => r.stage));\n> 150 |     expect(stages.has('qualification')).toBeTruthy();\n      |                                         ^\n  151 |     expect(stages.has('proposal')).toBeTruthy();\n  152 |     expect(stages.has('negotiation')).toBeTruthy();\n  153 |     expect(stages.has('won')).toBeTruthy();\n    at /var/www/360lm/tests/customers.spec.js:150:41"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:09:41.759Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-3e407-rtunities-span-all-5-stages-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 41,
                        "line": 150
                      }
                    },
                    {
                      "workerIndex": 25,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 76,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:150:41",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 41,
                          "line": 150
                        },
                        "snippet": "  148 |     const rows = await r.json();\n  149 |     const stages = new Set(rows.map(r => r.stage));\n> 150 |     expect(stages.has('qualification')).toBeTruthy();\n      |                                         ^\n  151 |     expect(stages.has('proposal')).toBeTruthy();\n  152 |     expect(stages.has('negotiation')).toBeTruthy();\n  153 |     expect(stages.has('won')).toBeTruthy();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 41,
                            "line": 150
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n\n  148 |     const rows = await r.json();\n  149 |     const stages = new Set(rows.map(r => r.stage));\n> 150 |     expect(stages.has('qualification')).toBeTruthy();\n      |                                         ^\n  151 |     expect(stages.has('proposal')).toBeTruthy();\n  152 |     expect(stages.has('negotiation')).toBeTruthy();\n  153 |     expect(stages.has('won')).toBeTruthy();\n    at /var/www/360lm/tests/customers.spec.js:150:41"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:09:42.887Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-3e407-rtunities-span-all-5-stages-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 41,
                        "line": 150
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-1bef294406bedfed620e",
              "file": "customers.spec.js",
              "line": 143,
              "column": 3
            },
            {
              "title": "park-hospital 360 reflects offers + opps + comms",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 26,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 88,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:164:15",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 15,
                          "line": 164
                        },
                        "snippet": "  162 |     });\n  163 |     const [s] = await r.json();\n> 164 |     expect(s).toBeTruthy();\n      |               ^\n  165 |     expect(Number(s.opp_count)).toBeGreaterThanOrEqual(2);  // opp-1 + opp-6\n  166 |     expect(Number(s.opp_won)).toBeGreaterThanOrEqual(1);\n  167 |     expect(Number(s.won_value)).toBeGreaterThanOrEqual(520000);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 15,
                            "line": 164
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mundefined\u001b[39m\n\n  162 |     });\n  163 |     const [s] = await r.json();\n> 164 |     expect(s).toBeTruthy();\n      |               ^\n  165 |     expect(Number(s.opp_count)).toBeGreaterThanOrEqual(2);  // opp-1 + opp-6\n  166 |     expect(Number(s.opp_won)).toBeGreaterThanOrEqual(1);\n  167 |     expect(Number(s.won_value)).toBeGreaterThanOrEqual(520000);\n    at /var/www/360lm/tests/customers.spec.js:164:15"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:09:43.943Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-4b61e--reflects-offers-opps-comms-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 15,
                        "line": 164
                      }
                    },
                    {
                      "workerIndex": 27,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 67,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:164:15",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 15,
                          "line": 164
                        },
                        "snippet": "  162 |     });\n  163 |     const [s] = await r.json();\n> 164 |     expect(s).toBeTruthy();\n      |               ^\n  165 |     expect(Number(s.opp_count)).toBeGreaterThanOrEqual(2);  // opp-1 + opp-6\n  166 |     expect(Number(s.opp_won)).toBeGreaterThanOrEqual(1);\n  167 |     expect(Number(s.won_value)).toBeGreaterThanOrEqual(520000);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 15,
                            "line": 164
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mundefined\u001b[39m\n\n  162 |     });\n  163 |     const [s] = await r.json();\n> 164 |     expect(s).toBeTruthy();\n      |               ^\n  165 |     expect(Number(s.opp_count)).toBeGreaterThanOrEqual(2);  // opp-1 + opp-6\n  166 |     expect(Number(s.opp_won)).toBeGreaterThanOrEqual(1);\n  167 |     expect(Number(s.won_value)).toBeGreaterThanOrEqual(520000);\n    at /var/www/360lm/tests/customers.spec.js:164:15"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:09:44.948Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-4b61e--reflects-offers-opps-comms-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 15,
                        "line": 164
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-d931f82bdf5f59a36c6c",
              "file": "customers.spec.js",
              "line": 158,
              "column": 3
            },
            {
              "title": "pipeline_by_owner has harish + pramod rows",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 28,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 62,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:178:25",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 25,
                          "line": 178
                        },
                        "snippet": "  176 |     });\n  177 |     const rows = await r.json();\n> 178 |     expect(rows.length).toBe(2);\n      |                         ^\n  179 |     rows.forEach(row => {\n  180 |       expect(Number(row.open_count) + Number(row.won_count) + Number(row.lost_count)).toBeGreaterThan(0);\n  181 |     });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 25,
                            "line": 178
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  176 |     });\n  177 |     const rows = await r.json();\n> 178 |     expect(rows.length).toBe(2);\n      |                         ^\n  179 |     rows.forEach(row => {\n  180 |       expect(Number(row.open_count) + Number(row.won_count) + Number(row.lost_count)).toBeGreaterThan(0);\n  181 |     });\n    at /var/www/360lm/tests/customers.spec.js:178:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:09:45.886Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-0ec8f-wner-has-harish-pramod-rows-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 25,
                        "line": 178
                      }
                    },
                    {
                      "workerIndex": 29,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 61,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:178:25",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 25,
                          "line": 178
                        },
                        "snippet": "  176 |     });\n  177 |     const rows = await r.json();\n> 178 |     expect(rows.length).toBe(2);\n      |                         ^\n  179 |     rows.forEach(row => {\n  180 |       expect(Number(row.open_count) + Number(row.won_count) + Number(row.lost_count)).toBeGreaterThan(0);\n  181 |     });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 25,
                            "line": 178
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  176 |     });\n  177 |     const rows = await r.json();\n> 178 |     expect(rows.length).toBe(2);\n      |                         ^\n  179 |     rows.forEach(row => {\n  180 |       expect(Number(row.open_count) + Number(row.won_count) + Number(row.lost_count)).toBeGreaterThan(0);\n  181 |     });\n    at /var/www/360lm/tests/customers.spec.js:178:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:09:46.819Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-0ec8f-wner-has-harish-pramod-rows-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 25,
                        "line": 178
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-9535fe7df927f2f0bf8a",
              "file": "customers.spec.js",
              "line": 172,
              "column": 3
            },
            {
              "title": "test customers exist in customers_v",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 222,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 84,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m8\u001b[39m\nReceived:    \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m8\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:121:25",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 25,
                          "line": 121
                        },
                        "snippet": "  119 |     });\n  120 |     const rows = await r.json();\n> 121 |     expect(rows.length).toBeGreaterThanOrEqual(8);\n      |                         ^\n  122 |     const park = rows.find(c => c.customer_id === 'cm-test-park-hospital');\n  123 |     expect(park).toBeTruthy();\n  124 |     expect(park.contact_count).toBeGreaterThanOrEqual(3);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 25,
                            "line": 121
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m8\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n\n  119 |     });\n  120 |     const rows = await r.json();\n> 121 |     expect(rows.length).toBeGreaterThanOrEqual(8);\n      |                         ^\n  122 |     const park = rows.find(c => c.customer_id === 'cm-test-park-hospital');\n  123 |     expect(park).toBeTruthy();\n  124 |     expect(park.contact_count).toBeGreaterThanOrEqual(3);\n    at /var/www/360lm/tests/customers.spec.js:121:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:26:25.725Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-f511c-tomers-exist-in-customers-v-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 25,
                        "line": 121
                      }
                    },
                    {
                      "workerIndex": 223,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 66,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m8\u001b[39m\nReceived:    \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m8\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:121:25",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 25,
                          "line": 121
                        },
                        "snippet": "  119 |     });\n  120 |     const rows = await r.json();\n> 121 |     expect(rows.length).toBeGreaterThanOrEqual(8);\n      |                         ^\n  122 |     const park = rows.find(c => c.customer_id === 'cm-test-park-hospital');\n  123 |     expect(park).toBeTruthy();\n  124 |     expect(park.contact_count).toBeGreaterThanOrEqual(3);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 25,
                            "line": 121
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m8\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n\n  119 |     });\n  120 |     const rows = await r.json();\n> 121 |     expect(rows.length).toBeGreaterThanOrEqual(8);\n      |                         ^\n  122 |     const park = rows.find(c => c.customer_id === 'cm-test-park-hospital');\n  123 |     expect(park).toBeTruthy();\n  124 |     expect(park.contact_count).toBeGreaterThanOrEqual(3);\n    at /var/www/360lm/tests/customers.spec.js:121:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:26:26.627Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-f511c-tomers-exist-in-customers-v-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 25,
                        "line": 121
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-f0f6f25ca696778c0668",
              "file": "customers.spec.js",
              "line": 115,
              "column": 3
            },
            {
              "title": "test leads cover all 4 active statuses",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 224,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 63,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:136:33",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 33,
                          "line": 136
                        },
                        "snippet": "  134 |     const rows = await r.json();\n  135 |     const statuses = new Set(rows.map(r => r.status));\n> 136 |     expect(statuses.has('new')).toBeTruthy();\n      |                                 ^\n  137 |     expect(statuses.has('contacted')).toBeTruthy();\n  138 |     expect(statuses.has('qualified')).toBeTruthy();\n  139 |     expect(statuses.has('disqualified')).toBeTruthy();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 33,
                            "line": 136
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n\n  134 |     const rows = await r.json();\n  135 |     const statuses = new Set(rows.map(r => r.status));\n> 136 |     expect(statuses.has('new')).toBeTruthy();\n      |                                 ^\n  137 |     expect(statuses.has('contacted')).toBeTruthy();\n  138 |     expect(statuses.has('qualified')).toBeTruthy();\n  139 |     expect(statuses.has('disqualified')).toBeTruthy();\n    at /var/www/360lm/tests/customers.spec.js:136:33"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:26:27.603Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-fd9b9-cover-all-4-active-statuses-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 33,
                        "line": 136
                      }
                    },
                    {
                      "workerIndex": 225,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 80,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:136:33",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 33,
                          "line": 136
                        },
                        "snippet": "  134 |     const rows = await r.json();\n  135 |     const statuses = new Set(rows.map(r => r.status));\n> 136 |     expect(statuses.has('new')).toBeTruthy();\n      |                                 ^\n  137 |     expect(statuses.has('contacted')).toBeTruthy();\n  138 |     expect(statuses.has('qualified')).toBeTruthy();\n  139 |     expect(statuses.has('disqualified')).toBeTruthy();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 33,
                            "line": 136
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n\n  134 |     const rows = await r.json();\n  135 |     const statuses = new Set(rows.map(r => r.status));\n> 136 |     expect(statuses.has('new')).toBeTruthy();\n      |                                 ^\n  137 |     expect(statuses.has('contacted')).toBeTruthy();\n  138 |     expect(statuses.has('qualified')).toBeTruthy();\n  139 |     expect(statuses.has('disqualified')).toBeTruthy();\n    at /var/www/360lm/tests/customers.spec.js:136:33"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:26:28.608Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-fd9b9-cover-all-4-active-statuses-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 33,
                        "line": 136
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-3eadfd1c7c779154f2a5",
              "file": "customers.spec.js",
              "line": 129,
              "column": 3
            },
            {
              "title": "opportunities span all 5 stages",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 226,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 81,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:150:41",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 41,
                          "line": 150
                        },
                        "snippet": "  148 |     const rows = await r.json();\n  149 |     const stages = new Set(rows.map(r => r.stage));\n> 150 |     expect(stages.has('qualification')).toBeTruthy();\n      |                                         ^\n  151 |     expect(stages.has('proposal')).toBeTruthy();\n  152 |     expect(stages.has('negotiation')).toBeTruthy();\n  153 |     expect(stages.has('won')).toBeTruthy();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 41,
                            "line": 150
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n\n  148 |     const rows = await r.json();\n  149 |     const stages = new Set(rows.map(r => r.stage));\n> 150 |     expect(stages.has('qualification')).toBeTruthy();\n      |                                         ^\n  151 |     expect(stages.has('proposal')).toBeTruthy();\n  152 |     expect(stages.has('negotiation')).toBeTruthy();\n  153 |     expect(stages.has('won')).toBeTruthy();\n    at /var/www/360lm/tests/customers.spec.js:150:41"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:26:29.627Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-3e407-rtunities-span-all-5-stages-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 41,
                        "line": 150
                      }
                    },
                    {
                      "workerIndex": 227,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 66,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:150:41",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 41,
                          "line": 150
                        },
                        "snippet": "  148 |     const rows = await r.json();\n  149 |     const stages = new Set(rows.map(r => r.stage));\n> 150 |     expect(stages.has('qualification')).toBeTruthy();\n      |                                         ^\n  151 |     expect(stages.has('proposal')).toBeTruthy();\n  152 |     expect(stages.has('negotiation')).toBeTruthy();\n  153 |     expect(stages.has('won')).toBeTruthy();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 41,
                            "line": 150
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n\n  148 |     const rows = await r.json();\n  149 |     const stages = new Set(rows.map(r => r.stage));\n> 150 |     expect(stages.has('qualification')).toBeTruthy();\n      |                                         ^\n  151 |     expect(stages.has('proposal')).toBeTruthy();\n  152 |     expect(stages.has('negotiation')).toBeTruthy();\n  153 |     expect(stages.has('won')).toBeTruthy();\n    at /var/www/360lm/tests/customers.spec.js:150:41"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:26:30.656Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-3e407-rtunities-span-all-5-stages-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 41,
                        "line": 150
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-9369b28ede6cd05fbdc5",
              "file": "customers.spec.js",
              "line": 143,
              "column": 3
            },
            {
              "title": "park-hospital 360 reflects offers + opps + comms",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 228,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 72,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:164:15",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 15,
                          "line": 164
                        },
                        "snippet": "  162 |     });\n  163 |     const [s] = await r.json();\n> 164 |     expect(s).toBeTruthy();\n      |               ^\n  165 |     expect(Number(s.opp_count)).toBeGreaterThanOrEqual(2);  // opp-1 + opp-6\n  166 |     expect(Number(s.opp_won)).toBeGreaterThanOrEqual(1);\n  167 |     expect(Number(s.won_value)).toBeGreaterThanOrEqual(520000);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 15,
                            "line": 164
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mundefined\u001b[39m\n\n  162 |     });\n  163 |     const [s] = await r.json();\n> 164 |     expect(s).toBeTruthy();\n      |               ^\n  165 |     expect(Number(s.opp_count)).toBeGreaterThanOrEqual(2);  // opp-1 + opp-6\n  166 |     expect(Number(s.opp_won)).toBeGreaterThanOrEqual(1);\n  167 |     expect(Number(s.won_value)).toBeGreaterThanOrEqual(520000);\n    at /var/www/360lm/tests/customers.spec.js:164:15"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:26:31.680Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-4b61e--reflects-offers-opps-comms-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 15,
                        "line": 164
                      }
                    },
                    {
                      "workerIndex": 229,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 80,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:164:15",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 15,
                          "line": 164
                        },
                        "snippet": "  162 |     });\n  163 |     const [s] = await r.json();\n> 164 |     expect(s).toBeTruthy();\n      |               ^\n  165 |     expect(Number(s.opp_count)).toBeGreaterThanOrEqual(2);  // opp-1 + opp-6\n  166 |     expect(Number(s.opp_won)).toBeGreaterThanOrEqual(1);\n  167 |     expect(Number(s.won_value)).toBeGreaterThanOrEqual(520000);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 15,
                            "line": 164
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mundefined\u001b[39m\n\n  162 |     });\n  163 |     const [s] = await r.json();\n> 164 |     expect(s).toBeTruthy();\n      |               ^\n  165 |     expect(Number(s.opp_count)).toBeGreaterThanOrEqual(2);  // opp-1 + opp-6\n  166 |     expect(Number(s.opp_won)).toBeGreaterThanOrEqual(1);\n  167 |     expect(Number(s.won_value)).toBeGreaterThanOrEqual(520000);\n    at /var/www/360lm/tests/customers.spec.js:164:15"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:26:32.691Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-4b61e--reflects-offers-opps-comms-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 15,
                        "line": 164
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-3b24d9c5a2b1442b475f",
              "file": "customers.spec.js",
              "line": 158,
              "column": 3
            },
            {
              "title": "pipeline_by_owner has harish + pramod rows",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 230,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 67,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:178:25",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 25,
                          "line": 178
                        },
                        "snippet": "  176 |     });\n  177 |     const rows = await r.json();\n> 178 |     expect(rows.length).toBe(2);\n      |                         ^\n  179 |     rows.forEach(row => {\n  180 |       expect(Number(row.open_count) + Number(row.won_count) + Number(row.lost_count)).toBeGreaterThan(0);\n  181 |     });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 25,
                            "line": 178
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  176 |     });\n  177 |     const rows = await r.json();\n> 178 |     expect(rows.length).toBe(2);\n      |                         ^\n  179 |     rows.forEach(row => {\n  180 |       expect(Number(row.open_count) + Number(row.won_count) + Number(row.lost_count)).toBeGreaterThan(0);\n  181 |     });\n    at /var/www/360lm/tests/customers.spec.js:178:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:26:33.724Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-0ec8f-wner-has-harish-pramod-rows-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 25,
                        "line": 178
                      }
                    },
                    {
                      "workerIndex": 231,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 69,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/customers.spec.js:178:25",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 25,
                          "line": 178
                        },
                        "snippet": "  176 |     });\n  177 |     const rows = await r.json();\n> 178 |     expect(rows.length).toBe(2);\n      |                         ^\n  179 |     rows.forEach(row => {\n  180 |       expect(Number(row.open_count) + Number(row.won_count) + Number(row.lost_count)).toBeGreaterThan(0);\n  181 |     });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 25,
                            "line": 178
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  176 |     });\n  177 |     const rows = await r.json();\n> 178 |     expect(rows.length).toBe(2);\n      |                         ^\n  179 |     rows.forEach(row => {\n  180 |       expect(Number(row.open_count) + Number(row.won_count) + Number(row.lost_count)).toBeGreaterThan(0);\n  181 |     });\n    at /var/www/360lm/tests/customers.spec.js:178:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:26:34.766Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-0ec8f-wner-has-harish-pramod-rows-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 25,
                        "line": 178
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-78218eba7b00db25a615",
              "file": "customers.spec.js",
              "line": 172,
              "column": 3
            }
          ]
        },
        {
          "title": "Customer Management — Rendered UI (happy path)",
          "file": "customers.spec.js",
          "line": 189,
          "column": 6,
          "specs": [
            {
              "title": "list renders and search filters live",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 5379,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#s-list')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#s-list')\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#s-list')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#s-list')\u001b[22m\n\n    at /var/www/360lm/tests/customers.spec.js:193:43",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 43,
                          "line": 193
                        },
                        "snippet": "  191 |     await injectSession(page);\n  192 |     await page.goto(BASE_URL);\n> 193 |     await expect(page.locator('#s-list')).toBeVisible();\n      |                                           ^\n  194 |     // tile shows >=8 customers\n  195 |     await expect(page.locator('#t-total')).not.toHaveText('—');\n  196 |     await expect.poll(async () => Number(await page.locator('#t-total').textContent())).toBeGreaterThanOrEqual(8);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 43,
                            "line": 193
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#s-list')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#s-list')\u001b[22m\n\n\n  191 |     await injectSession(page);\n  192 |     await page.goto(BASE_URL);\n> 193 |     await expect(page.locator('#s-list')).toBeVisible();\n      |                                           ^\n  194 |     // tile shows >=8 customers\n  195 |     await expect(page.locator('#t-total')).not.toHaveText('—');\n  196 |     await expect.poll(async () => Number(await page.locator('#t-total').textContent())).toBeGreaterThanOrEqual(8);\n    at /var/www/360lm/tests/customers.spec.js:193:43"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:09:47.852Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-d1127-ers-and-search-filters-live-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-d1127-ers-and-search-filters-live-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 43,
                        "line": 193
                      }
                    },
                    {
                      "workerIndex": 31,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 5325,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#s-list')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#s-list')\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#s-list')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#s-list')\u001b[22m\n\n    at /var/www/360lm/tests/customers.spec.js:193:43",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 43,
                          "line": 193
                        },
                        "snippet": "  191 |     await injectSession(page);\n  192 |     await page.goto(BASE_URL);\n> 193 |     await expect(page.locator('#s-list')).toBeVisible();\n      |                                           ^\n  194 |     // tile shows >=8 customers\n  195 |     await expect(page.locator('#t-total')).not.toHaveText('—');\n  196 |     await expect.poll(async () => Number(await page.locator('#t-total').textContent())).toBeGreaterThanOrEqual(8);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 43,
                            "line": 193
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#s-list')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#s-list')\u001b[22m\n\n\n  191 |     await injectSession(page);\n  192 |     await page.goto(BASE_URL);\n> 193 |     await expect(page.locator('#s-list')).toBeVisible();\n      |                                           ^\n  194 |     // tile shows >=8 customers\n  195 |     await expect(page.locator('#t-total')).not.toHaveText('—');\n  196 |     await expect.poll(async () => Number(await page.locator('#t-total').textContent())).toBeGreaterThanOrEqual(8);\n    at /var/www/360lm/tests/customers.spec.js:193:43"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:09:54.276Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-d1127-ers-and-search-filters-live-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-d1127-ers-and-search-filters-live-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 43,
                        "line": 193
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-0f501e2bc02906c2d777",
              "file": "customers.spec.js",
              "line": 190,
              "column": 3
            },
            {
              "title": "type chip filters to Individual only",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 32,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30095,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 209
                          },
                          "message": "Error: page.waitForSelector: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.c-row') to be visible\u001b[22m\n\n\n  207 |     await injectSession(page);\n  208 |     await page.goto(BASE_URL);\n> 209 |     await page.waitForSelector('.c-row');\n      |                ^\n  210 |     await page.click('.chip[data-type=\"individual\"]');\n  211 |     await page.waitForTimeout(150);\n  212 |     const badges = await page.locator('.c-row-badge').allTextContents();\n    at /var/www/360lm/tests/customers.spec.js:209:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:10:00.919Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-79315--filters-to-Individual-only-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-79315--filters-to-Individual-only-android-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 33,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30394,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 209
                          },
                          "message": "Error: page.waitForSelector: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.c-row') to be visible\u001b[22m\n\n\n  207 |     await injectSession(page);\n  208 |     await page.goto(BASE_URL);\n> 209 |     await page.waitForSelector('.c-row');\n      |                ^\n  210 |     await page.click('.chip[data-type=\"individual\"]');\n  211 |     await page.waitForTimeout(150);\n  212 |     const badges = await page.locator('.c-row-badge').allTextContents();\n    at /var/www/360lm/tests/customers.spec.js:209:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:10:32.285Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-79315--filters-to-Individual-only-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-79315--filters-to-Individual-only-android-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-a4d83dc68af4a0ad5dbd",
              "file": "customers.spec.js",
              "line": 206,
              "column": 3
            },
            {
              "title": "detail screen opens with all 7 tabs",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 34,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30080,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 220
                          },
                          "message": "Error: page.waitForSelector: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.c-row') to be visible\u001b[22m\n\n\n  218 |     await injectSession(page);\n  219 |     await page.goto(BASE_URL);\n> 220 |     await page.waitForSelector('.c-row');\n      |                ^\n  221 |     await page.fill('#search-q', 'park');\n  222 |     await page.waitForTimeout(300);\n  223 |     await page.locator('.c-row').first().click();\n    at /var/www/360lm/tests/customers.spec.js:220:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:11:04.078Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-1432d-creen-opens-with-all-7-tabs-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-1432d-creen-opens-with-all-7-tabs-android-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 35,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30225,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 220
                          },
                          "message": "Error: page.waitForSelector: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.c-row') to be visible\u001b[22m\n\n\n  218 |     await injectSession(page);\n  219 |     await page.goto(BASE_URL);\n> 220 |     await page.waitForSelector('.c-row');\n      |                ^\n  221 |     await page.fill('#search-q', 'park');\n  222 |     await page.waitForTimeout(300);\n  223 |     await page.locator('.c-row').first().click();\n    at /var/www/360lm/tests/customers.spec.js:220:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:11:35.299Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-1432d-creen-opens-with-all-7-tabs-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-1432d-creen-opens-with-all-7-tabs-android-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-c87aacd7b2b3cf7dc34f",
              "file": "customers.spec.js",
              "line": 217,
              "column": 3
            },
            {
              "title": "360 card renders on Info tab",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 36,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30100,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 233
                          },
                          "message": "Error: page.waitForSelector: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.c-row') to be visible\u001b[22m\n\n\n  231 |     await injectSession(page);\n  232 |     await page.goto(BASE_URL);\n> 233 |     await page.waitForSelector('.c-row');\n      |                ^\n  234 |     await page.fill('#search-q', 'park');\n  235 |     await page.waitForTimeout(300);\n  236 |     await page.locator('.c-row').first().click();\n    at /var/www/360lm/tests/customers.spec.js:233:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:12:06.872Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-5d4b7-60-card-renders-on-Info-tab-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-5d4b7-60-card-renders-on-Info-tab-android-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 37,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30070,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 233
                          },
                          "message": "Error: page.waitForSelector: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.c-row') to be visible\u001b[22m\n\n\n  231 |     await injectSession(page);\n  232 |     await page.goto(BASE_URL);\n> 233 |     await page.waitForSelector('.c-row');\n      |                ^\n  234 |     await page.fill('#search-q', 'park');\n  235 |     await page.waitForTimeout(300);\n  236 |     await page.locator('.c-row').first().click();\n    at /var/www/360lm/tests/customers.spec.js:233:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:12:38.132Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-5d4b7-60-card-renders-on-Info-tab-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-5d4b7-60-card-renders-on-Info-tab-android-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-de3e7a951457b750b548",
              "file": "customers.spec.js",
              "line": 230,
              "column": 3
            },
            {
              "title": "Pipeline screen opens with leads kanban + summary tiles",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 38,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30078,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 246
                          },
                          "message": "Error: page.waitForSelector: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-pipeline') to be visible\u001b[22m\n\n\n  244 |     await injectSession(page);\n  245 |     await page.goto(BASE_URL);\n> 246 |     await page.waitForSelector('#nav-pipeline');\n      |                ^\n  247 |     await page.click('#nav-pipeline');\n  248 |     await expect(page.locator('#s-pipeline')).toBeVisible();\n  249 |     await expect(page.locator('#kanban-leads')).toBeVisible();\n    at /var/www/360lm/tests/customers.spec.js:246:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:13:09.257Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-8875b--leads-kanban-summary-tiles-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-8875b--leads-kanban-summary-tiles-android-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 39,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30113,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 246
                          },
                          "message": "Error: page.waitForSelector: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-pipeline') to be visible\u001b[22m\n\n\n  244 |     await injectSession(page);\n  245 |     await page.goto(BASE_URL);\n> 246 |     await page.waitForSelector('#nav-pipeline');\n      |                ^\n  247 |     await page.click('#nav-pipeline');\n  248 |     await expect(page.locator('#s-pipeline')).toBeVisible();\n  249 |     await expect(page.locator('#kanban-leads')).toBeVisible();\n    at /var/www/360lm/tests/customers.spec.js:246:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:13:40.560Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-8875b--leads-kanban-summary-tiles-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-8875b--leads-kanban-summary-tiles-android-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-97e24ff4fe3b0c980248",
              "file": "customers.spec.js",
              "line": 243,
              "column": 3
            },
            {
              "title": "owner filter chips render and filter Leads kanban",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 40,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30099,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 262
                          },
                          "message": "Error: page.waitForSelector: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-pipeline') to be visible\u001b[22m\n\n\n  260 |     await injectSession(page);\n  261 |     await page.goto(BASE_URL);\n> 262 |     await page.waitForSelector('#nav-pipeline');\n      |                ^\n  263 |     await page.click('#nav-pipeline');\n  264 |     await page.waitForTimeout(500);\n  265 |     await expect(page.locator('#owner-chips')).toBeVisible();\n    at /var/www/360lm/tests/customers.spec.js:262:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:14:11.786Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-94975-der-and-filter-Leads-kanban-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-94975-der-and-filter-Leads-kanban-android-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 41,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30102,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 262
                          },
                          "message": "Error: page.waitForSelector: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-pipeline') to be visible\u001b[22m\n\n\n  260 |     await injectSession(page);\n  261 |     await page.goto(BASE_URL);\n> 262 |     await page.waitForSelector('#nav-pipeline');\n      |                ^\n  263 |     await page.click('#nav-pipeline');\n  264 |     await page.waitForTimeout(500);\n  265 |     await expect(page.locator('#owner-chips')).toBeVisible();\n    at /var/www/360lm/tests/customers.spec.js:262:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:14:43.018Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-94975-der-and-filter-Leads-kanban-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-94975-der-and-filter-Leads-kanban-android-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-c3790719bb2ac1c5693a",
              "file": "customers.spec.js",
              "line": 259,
              "column": 3
            },
            {
              "title": "Add-customer form has Save button and chip toggle",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 42,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30154,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 280
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-add')\u001b[22m\n\n\n  278 |     await injectSession(page);\n  279 |     await page.goto(BASE_URL);\n> 280 |     await page.click('#nav-add');\n      |                ^\n  281 |     await expect(page.locator('#s-form')).toBeVisible();\n  282 |     await expect(page.locator('#f-save-btn')).toBeVisible();\n  283 |     await expect(page.locator('#s-form .chip[data-ftype=\"business\"]')).toBeVisible();\n    at /var/www/360lm/tests/customers.spec.js:280:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:15:14.191Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-e37c0-Save-button-and-chip-toggle-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-e37c0-Save-button-and-chip-toggle-android-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 43,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30132,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 280
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-add')\u001b[22m\n\n\n  278 |     await injectSession(page);\n  279 |     await page.goto(BASE_URL);\n> 280 |     await page.click('#nav-add');\n      |                ^\n  281 |     await expect(page.locator('#s-form')).toBeVisible();\n  282 |     await expect(page.locator('#f-save-btn')).toBeVisible();\n  283 |     await expect(page.locator('#s-form .chip[data-ftype=\"business\"]')).toBeVisible();\n    at /var/www/360lm/tests/customers.spec.js:280:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:15:45.467Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-e37c0-Save-button-and-chip-toggle-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-e37c0-Save-button-and-chip-toggle-android-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-8523fb63e45d3ba8c863",
              "file": "customers.spec.js",
              "line": 277,
              "column": 3
            },
            {
              "title": "list renders and search filters live",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 232,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 5279,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#s-list')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#s-list')\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#s-list')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#s-list')\u001b[22m\n\n    at /var/www/360lm/tests/customers.spec.js:193:43",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 43,
                          "line": 193
                        },
                        "snippet": "  191 |     await injectSession(page);\n  192 |     await page.goto(BASE_URL);\n> 193 |     await expect(page.locator('#s-list')).toBeVisible();\n      |                                           ^\n  194 |     // tile shows >=8 customers\n  195 |     await expect(page.locator('#t-total')).not.toHaveText('—');\n  196 |     await expect.poll(async () => Number(await page.locator('#t-total').textContent())).toBeGreaterThanOrEqual(8);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 43,
                            "line": 193
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#s-list')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#s-list')\u001b[22m\n\n\n  191 |     await injectSession(page);\n  192 |     await page.goto(BASE_URL);\n> 193 |     await expect(page.locator('#s-list')).toBeVisible();\n      |                                           ^\n  194 |     // tile shows >=8 customers\n  195 |     await expect(page.locator('#t-total')).not.toHaveText('—');\n  196 |     await expect.poll(async () => Number(await page.locator('#t-total').textContent())).toBeGreaterThanOrEqual(8);\n    at /var/www/360lm/tests/customers.spec.js:193:43"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:26:35.804Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-d1127-ers-and-search-filters-live-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-d1127-ers-and-search-filters-live-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 43,
                        "line": 193
                      }
                    },
                    {
                      "workerIndex": 233,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 5273,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#s-list')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#s-list')\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#s-list')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#s-list')\u001b[22m\n\n    at /var/www/360lm/tests/customers.spec.js:193:43",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 43,
                          "line": 193
                        },
                        "snippet": "  191 |     await injectSession(page);\n  192 |     await page.goto(BASE_URL);\n> 193 |     await expect(page.locator('#s-list')).toBeVisible();\n      |                                           ^\n  194 |     // tile shows >=8 customers\n  195 |     await expect(page.locator('#t-total')).not.toHaveText('—');\n  196 |     await expect.poll(async () => Number(await page.locator('#t-total').textContent())).toBeGreaterThanOrEqual(8);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 43,
                            "line": 193
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#s-list')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#s-list')\u001b[22m\n\n\n  191 |     await injectSession(page);\n  192 |     await page.goto(BASE_URL);\n> 193 |     await expect(page.locator('#s-list')).toBeVisible();\n      |                                           ^\n  194 |     // tile shows >=8 customers\n  195 |     await expect(page.locator('#t-total')).not.toHaveText('—');\n  196 |     await expect.poll(async () => Number(await page.locator('#t-total').textContent())).toBeGreaterThanOrEqual(8);\n    at /var/www/360lm/tests/customers.spec.js:193:43"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:26:42.110Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-d1127-ers-and-search-filters-live-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-d1127-ers-and-search-filters-live-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 43,
                        "line": 193
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-5e61d0fd407660907eaf",
              "file": "customers.spec.js",
              "line": 190,
              "column": 3
            },
            {
              "title": "type chip filters to Individual only",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 234,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30099,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 209
                          },
                          "message": "Error: page.waitForSelector: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.c-row') to be visible\u001b[22m\n\n\n  207 |     await injectSession(page);\n  208 |     await page.goto(BASE_URL);\n> 209 |     await page.waitForSelector('.c-row');\n      |                ^\n  210 |     await page.click('.chip[data-type=\"individual\"]');\n  211 |     await page.waitForTimeout(150);\n  212 |     const badges = await page.locator('.c-row-badge').allTextContents();\n    at /var/www/360lm/tests/customers.spec.js:209:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:26:48.403Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-79315--filters-to-Individual-only-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-79315--filters-to-Individual-only-desktop-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 235,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30159,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 209
                          },
                          "message": "Error: page.waitForSelector: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.c-row') to be visible\u001b[22m\n\n\n  207 |     await injectSession(page);\n  208 |     await page.goto(BASE_URL);\n> 209 |     await page.waitForSelector('.c-row');\n      |                ^\n  210 |     await page.click('.chip[data-type=\"individual\"]');\n  211 |     await page.waitForTimeout(150);\n  212 |     const badges = await page.locator('.c-row-badge').allTextContents();\n    at /var/www/360lm/tests/customers.spec.js:209:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:27:19.574Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-79315--filters-to-Individual-only-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-79315--filters-to-Individual-only-desktop-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-df661339ff2faf3e4fa4",
              "file": "customers.spec.js",
              "line": 206,
              "column": 3
            },
            {
              "title": "detail screen opens with all 7 tabs",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 236,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30096,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 220
                          },
                          "message": "Error: page.waitForSelector: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.c-row') to be visible\u001b[22m\n\n\n  218 |     await injectSession(page);\n  219 |     await page.goto(BASE_URL);\n> 220 |     await page.waitForSelector('.c-row');\n      |                ^\n  221 |     await page.fill('#search-q', 'park');\n  222 |     await page.waitForTimeout(300);\n  223 |     await page.locator('.c-row').first().click();\n    at /var/www/360lm/tests/customers.spec.js:220:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:27:50.965Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-1432d-creen-opens-with-all-7-tabs-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-1432d-creen-opens-with-all-7-tabs-desktop-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 237,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30093,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 220
                          },
                          "message": "Error: page.waitForSelector: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.c-row') to be visible\u001b[22m\n\n\n  218 |     await injectSession(page);\n  219 |     await page.goto(BASE_URL);\n> 220 |     await page.waitForSelector('.c-row');\n      |                ^\n  221 |     await page.fill('#search-q', 'park');\n  222 |     await page.waitForTimeout(300);\n  223 |     await page.locator('.c-row').first().click();\n    at /var/www/360lm/tests/customers.spec.js:220:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:28:22.197Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-1432d-creen-opens-with-all-7-tabs-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-1432d-creen-opens-with-all-7-tabs-desktop-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-52b5bff5b1251172fecd",
              "file": "customers.spec.js",
              "line": 217,
              "column": 3
            },
            {
              "title": "360 card renders on Info tab",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 238,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30092,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 233
                          },
                          "message": "Error: page.waitForSelector: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.c-row') to be visible\u001b[22m\n\n\n  231 |     await injectSession(page);\n  232 |     await page.goto(BASE_URL);\n> 233 |     await page.waitForSelector('.c-row');\n      |                ^\n  234 |     await page.fill('#search-q', 'park');\n  235 |     await page.waitForTimeout(300);\n  236 |     await page.locator('.c-row').first().click();\n    at /var/www/360lm/tests/customers.spec.js:233:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:28:53.326Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-5d4b7-60-card-renders-on-Info-tab-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-5d4b7-60-card-renders-on-Info-tab-desktop-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 239,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30100,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 233
                          },
                          "message": "Error: page.waitForSelector: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.c-row') to be visible\u001b[22m\n\n\n  231 |     await injectSession(page);\n  232 |     await page.goto(BASE_URL);\n> 233 |     await page.waitForSelector('.c-row');\n      |                ^\n  234 |     await page.fill('#search-q', 'park');\n  235 |     await page.waitForTimeout(300);\n  236 |     await page.locator('.c-row').first().click();\n    at /var/www/360lm/tests/customers.spec.js:233:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:29:24.490Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-5d4b7-60-card-renders-on-Info-tab-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-5d4b7-60-card-renders-on-Info-tab-desktop-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-aa0ba69d6b3a53f0124e",
              "file": "customers.spec.js",
              "line": 230,
              "column": 3
            },
            {
              "title": "Pipeline screen opens with leads kanban + summary tiles",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 240,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30097,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 246
                          },
                          "message": "Error: page.waitForSelector: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-pipeline') to be visible\u001b[22m\n\n\n  244 |     await injectSession(page);\n  245 |     await page.goto(BASE_URL);\n> 246 |     await page.waitForSelector('#nav-pipeline');\n      |                ^\n  247 |     await page.click('#nav-pipeline');\n  248 |     await expect(page.locator('#s-pipeline')).toBeVisible();\n  249 |     await expect(page.locator('#kanban-leads')).toBeVisible();\n    at /var/www/360lm/tests/customers.spec.js:246:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:29:55.612Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-8875b--leads-kanban-summary-tiles-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-8875b--leads-kanban-summary-tiles-desktop-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 241,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30093,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 246
                          },
                          "message": "Error: page.waitForSelector: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-pipeline') to be visible\u001b[22m\n\n\n  244 |     await injectSession(page);\n  245 |     await page.goto(BASE_URL);\n> 246 |     await page.waitForSelector('#nav-pipeline');\n      |                ^\n  247 |     await page.click('#nav-pipeline');\n  248 |     await expect(page.locator('#s-pipeline')).toBeVisible();\n  249 |     await expect(page.locator('#kanban-leads')).toBeVisible();\n    at /var/www/360lm/tests/customers.spec.js:246:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:30:26.831Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-8875b--leads-kanban-summary-tiles-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-8875b--leads-kanban-summary-tiles-desktop-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-fc75d2373c9b556ae638",
              "file": "customers.spec.js",
              "line": 243,
              "column": 3
            },
            {
              "title": "owner filter chips render and filter Leads kanban",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 242,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30088,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 262
                          },
                          "message": "Error: page.waitForSelector: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-pipeline') to be visible\u001b[22m\n\n\n  260 |     await injectSession(page);\n  261 |     await page.goto(BASE_URL);\n> 262 |     await page.waitForSelector('#nav-pipeline');\n      |                ^\n  263 |     await page.click('#nav-pipeline');\n  264 |     await page.waitForTimeout(500);\n  265 |     await expect(page.locator('#owner-chips')).toBeVisible();\n    at /var/www/360lm/tests/customers.spec.js:262:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:30:57.924Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-94975-der-and-filter-Leads-kanban-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-94975-der-and-filter-Leads-kanban-desktop-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 243,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30072,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 262
                          },
                          "message": "Error: page.waitForSelector: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-pipeline') to be visible\u001b[22m\n\n\n  260 |     await injectSession(page);\n  261 |     await page.goto(BASE_URL);\n> 262 |     await page.waitForSelector('#nav-pipeline');\n      |                ^\n  263 |     await page.click('#nav-pipeline');\n  264 |     await page.waitForTimeout(500);\n  265 |     await expect(page.locator('#owner-chips')).toBeVisible();\n    at /var/www/360lm/tests/customers.spec.js:262:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:31:29.057Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-94975-der-and-filter-Leads-kanban-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-94975-der-and-filter-Leads-kanban-desktop-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-640b66d1c7e96fdb7c96",
              "file": "customers.spec.js",
              "line": 259,
              "column": 3
            },
            {
              "title": "Add-customer form has Save button and chip toggle",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 244,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30105,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 280
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-add')\u001b[22m\n\n\n  278 |     await injectSession(page);\n  279 |     await page.goto(BASE_URL);\n> 280 |     await page.click('#nav-add');\n      |                ^\n  281 |     await expect(page.locator('#s-form')).toBeVisible();\n  282 |     await expect(page.locator('#f-save-btn')).toBeVisible();\n  283 |     await expect(page.locator('#s-form .chip[data-ftype=\"business\"]')).toBeVisible();\n    at /var/www/360lm/tests/customers.spec.js:280:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:32:00.237Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-e37c0-Save-button-and-chip-toggle-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-e37c0-Save-button-and-chip-toggle-desktop-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 245,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30142,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 280
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-add')\u001b[22m\n\n\n  278 |     await injectSession(page);\n  279 |     await page.goto(BASE_URL);\n> 280 |     await page.click('#nav-add');\n      |                ^\n  281 |     await expect(page.locator('#s-form')).toBeVisible();\n  282 |     await expect(page.locator('#f-save-btn')).toBeVisible();\n  283 |     await expect(page.locator('#s-form .chip[data-ftype=\"business\"]')).toBeVisible();\n    at /var/www/360lm/tests/customers.spec.js:280:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:32:31.402Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-e37c0-Save-button-and-chip-toggle-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-e37c0-Save-button-and-chip-toggle-desktop-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-02477885d4bcfff93349",
              "file": "customers.spec.js",
              "line": 277,
              "column": 3
            }
          ]
        },
        {
          "title": "Customer Management — UI CRUD",
          "file": "customers.spec.js",
          "line": 291,
          "column": 6,
          "specs": [
            {
              "title": "create customer via form, appears in list, delete via DB",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 44,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30116,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 297
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-add')\u001b[22m\n\n\n  295 |     await injectSession(page);\n  296 |     await page.goto(BASE_URL);\n> 297 |     await page.click('#nav-add');\n      |                ^\n  298 |     await page.fill('#f-name', testName);\n  299 |     await page.fill('#f-phone', '9999000111');\n  300 |     await page.fill('#f-industry', 'Hospitality');\n    at /var/www/360lm/tests/customers.spec.js:297:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:16:16.867Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-55ec0-pears-in-list-delete-via-DB-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-55ec0-pears-in-list-delete-via-DB-android-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 45,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30100,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 297
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-add')\u001b[22m\n\n\n  295 |     await injectSession(page);\n  296 |     await page.goto(BASE_URL);\n> 297 |     await page.click('#nav-add');\n      |                ^\n  298 |     await page.fill('#f-name', testName);\n  299 |     await page.fill('#f-phone', '9999000111');\n  300 |     await page.fill('#f-industry', 'Hospitality');\n    at /var/www/360lm/tests/customers.spec.js:297:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:16:48.026Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-55ec0-pears-in-list-delete-via-DB-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-55ec0-pears-in-list-delete-via-DB-android-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-b1116c5cf3c56ac6b016",
              "file": "customers.spec.js",
              "line": 294,
              "column": 3
            },
            {
              "title": "empty form save shows validation toast",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30152,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 315
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-add')\u001b[22m\n\n\n  313 |     await injectSession(page);\n  314 |     await page.goto(BASE_URL);\n> 315 |     await page.click('#nav-add');\n      |                ^\n  316 |     await page.evaluate(() => saveForm());\n  317 |     // Form should still be visible — validation prevented save\n  318 |     await page.waitForTimeout(400);\n    at /var/www/360lm/tests/customers.spec.js:315:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:17:19.285Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-bbc63-save-shows-validation-toast-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-bbc63-save-shows-validation-toast-android-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 47,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30113,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 315
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-add')\u001b[22m\n\n\n  313 |     await injectSession(page);\n  314 |     await page.goto(BASE_URL);\n> 315 |     await page.click('#nav-add');\n      |                ^\n  316 |     await page.evaluate(() => saveForm());\n  317 |     // Form should still be visible — validation prevented save\n  318 |     await page.waitForTimeout(400);\n    at /var/www/360lm/tests/customers.spec.js:315:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:17:50.517Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-bbc63-save-shows-validation-toast-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-bbc63-save-shows-validation-toast-android-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-2881040e5d8a52bd89d1",
              "file": "customers.spec.js",
              "line": 312,
              "column": 3
            },
            {
              "title": "create customer via form, appears in list, delete via DB",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 246,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30078,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 297
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-add')\u001b[22m\n\n\n  295 |     await injectSession(page);\n  296 |     await page.goto(BASE_URL);\n> 297 |     await page.click('#nav-add');\n      |                ^\n  298 |     await page.fill('#f-name', testName);\n  299 |     await page.fill('#f-phone', '9999000111');\n  300 |     await page.fill('#f-industry', 'Hospitality');\n    at /var/www/360lm/tests/customers.spec.js:297:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:33:03.027Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-55ec0-pears-in-list-delete-via-DB-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-55ec0-pears-in-list-delete-via-DB-desktop-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 247,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30117,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 297
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-add')\u001b[22m\n\n\n  295 |     await injectSession(page);\n  296 |     await page.goto(BASE_URL);\n> 297 |     await page.click('#nav-add');\n      |                ^\n  298 |     await page.fill('#f-name', testName);\n  299 |     await page.fill('#f-phone', '9999000111');\n  300 |     await page.fill('#f-industry', 'Hospitality');\n    at /var/www/360lm/tests/customers.spec.js:297:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:33:34.125Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-55ec0-pears-in-list-delete-via-DB-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-55ec0-pears-in-list-delete-via-DB-desktop-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-7290cbf6939843677559",
              "file": "customers.spec.js",
              "line": 294,
              "column": 3
            },
            {
              "title": "empty form save shows validation toast",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 248,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30099,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 315
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-add')\u001b[22m\n\n\n  313 |     await injectSession(page);\n  314 |     await page.goto(BASE_URL);\n> 315 |     await page.click('#nav-add');\n      |                ^\n  316 |     await page.evaluate(() => saveForm());\n  317 |     // Form should still be visible — validation prevented save\n  318 |     await page.waitForTimeout(400);\n    at /var/www/360lm/tests/customers.spec.js:315:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:34:05.489Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-bbc63-save-shows-validation-toast-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-bbc63-save-shows-validation-toast-desktop-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 249,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30090,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 16,
                            "line": 315
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-add')\u001b[22m\n\n\n  313 |     await injectSession(page);\n  314 |     await page.goto(BASE_URL);\n> 315 |     await page.click('#nav-add');\n      |                ^\n  316 |     await page.evaluate(() => saveForm());\n  317 |     // Form should still be visible — validation prevented save\n  318 |     await page.waitForTimeout(400);\n    at /var/www/360lm/tests/customers.spec.js:315:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:34:36.588Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-bbc63-save-shows-validation-toast-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-bbc63-save-shows-validation-toast-desktop-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-da76dadfb4e2f8f72e20",
              "file": "customers.spec.js",
              "line": 312,
              "column": 3
            }
          ]
        },
        {
          "title": "Customer Management — Access",
          "file": "customers.spec.js",
          "line": 329,
          "column": 6,
          "specs": [
            {
              "title": "user without grant sees restricted screen",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 48,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 6108,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('text=Access Restricted')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('text=Access Restricted')\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('text=Access Restricted')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('text=Access Restricted')\u001b[22m\n\n    at /var/www/360lm/tests/customers.spec.js:335:58",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 58,
                          "line": 335
                        },
                        "snippet": "  333 |     await page.goto(BASE_URL);\n  334 |     await page.waitForTimeout(800);\n> 335 |     await expect(page.locator('text=Access Restricted')).toBeVisible();\n      |                                                          ^\n  336 |   });\n  337 | });\n  338 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 58,
                            "line": 335
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('text=Access Restricted')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('text=Access Restricted')\u001b[22m\n\n\n  333 |     await page.goto(BASE_URL);\n  334 |     await page.waitForTimeout(800);\n> 335 |     await expect(page.locator('text=Access Restricted')).toBeVisible();\n      |                                                          ^\n  336 |   });\n  337 | });\n  338 |\n    at /var/www/360lm/tests/customers.spec.js:335:58"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:18:21.752Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-a618d-rant-sees-restricted-screen-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-a618d-rant-sees-restricted-screen-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 58,
                        "line": 335
                      }
                    },
                    {
                      "workerIndex": 49,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 6134,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('text=Access Restricted')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('text=Access Restricted')\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('text=Access Restricted')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('text=Access Restricted')\u001b[22m\n\n    at /var/www/360lm/tests/customers.spec.js:335:58",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 58,
                          "line": 335
                        },
                        "snippet": "  333 |     await page.goto(BASE_URL);\n  334 |     await page.waitForTimeout(800);\n> 335 |     await expect(page.locator('text=Access Restricted')).toBeVisible();\n      |                                                          ^\n  336 |   });\n  337 | });\n  338 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 58,
                            "line": 335
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('text=Access Restricted')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('text=Access Restricted')\u001b[22m\n\n\n  333 |     await page.goto(BASE_URL);\n  334 |     await page.waitForTimeout(800);\n> 335 |     await expect(page.locator('text=Access Restricted')).toBeVisible();\n      |                                                          ^\n  336 |   });\n  337 | });\n  338 |\n    at /var/www/360lm/tests/customers.spec.js:335:58"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:18:28.960Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-a618d-rant-sees-restricted-screen-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-a618d-rant-sees-restricted-screen-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 58,
                        "line": 335
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-55e9d24769b795b1ce74",
              "file": "customers.spec.js",
              "line": 330,
              "column": 3
            },
            {
              "title": "user without grant sees restricted screen",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 250,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 6107,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('text=Access Restricted')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('text=Access Restricted')\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('text=Access Restricted')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('text=Access Restricted')\u001b[22m\n\n    at /var/www/360lm/tests/customers.spec.js:335:58",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 58,
                          "line": 335
                        },
                        "snippet": "  333 |     await page.goto(BASE_URL);\n  334 |     await page.waitForTimeout(800);\n> 335 |     await expect(page.locator('text=Access Restricted')).toBeVisible();\n      |                                                          ^\n  336 |   });\n  337 | });\n  338 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 58,
                            "line": 335
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('text=Access Restricted')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('text=Access Restricted')\u001b[22m\n\n\n  333 |     await page.goto(BASE_URL);\n  334 |     await page.waitForTimeout(800);\n> 335 |     await expect(page.locator('text=Access Restricted')).toBeVisible();\n      |                                                          ^\n  336 |   });\n  337 | });\n  338 |\n    at /var/www/360lm/tests/customers.spec.js:335:58"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:35:07.870Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-a618d-rant-sees-restricted-screen-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-a618d-rant-sees-restricted-screen-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 58,
                        "line": 335
                      }
                    },
                    {
                      "workerIndex": 251,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 6100,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('text=Access Restricted')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('text=Access Restricted')\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('text=Access Restricted')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('text=Access Restricted')\u001b[22m\n\n    at /var/www/360lm/tests/customers.spec.js:335:58",
                        "location": {
                          "file": "/var/www/360lm/tests/customers.spec.js",
                          "column": 58,
                          "line": 335
                        },
                        "snippet": "  333 |     await page.goto(BASE_URL);\n  334 |     await page.waitForTimeout(800);\n> 335 |     await expect(page.locator('text=Access Restricted')).toBeVisible();\n      |                                                          ^\n  336 |   });\n  337 | });\n  338 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/customers.spec.js",
                            "column": 58,
                            "line": 335
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('text=Access Restricted')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('text=Access Restricted')\u001b[22m\n\n\n  333 |     await page.goto(BASE_URL);\n  334 |     await page.waitForTimeout(800);\n> 335 |     await expect(page.locator('text=Access Restricted')).toBeVisible();\n      |                                                          ^\n  336 |   });\n  337 | });\n  338 |\n    at /var/www/360lm/tests/customers.spec.js:335:58"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:35:15.172Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-a618d-rant-sees-restricted-screen-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/customers-Customer-Managem-a618d-rant-sees-restricted-screen-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/customers.spec.js",
                        "column": 58,
                        "line": 335
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "7ab72d16adb42747d672-a59ceb3647a9aec83440",
              "file": "customers.spec.js",
              "line": 330,
              "column": 3
            }
          ]
        }
      ]
    },
    {
      "title": "recce_client.spec.js",
      "file": "recce_client.spec.js",
      "column": 0,
      "line": 0,
      "specs": [],
      "suites": [
        {
          "title": "Phase 4.1 — DB schema present",
          "file": "recce_client.spec.js",
          "line": 29,
          "column": 6,
          "specs": [
            {
              "title": "PostgREST exposes client + client_visible_recces_v + mail_outbox",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 50,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 200,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:18:36.284Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-2eb686f95b6e6f5196d9",
              "file": "recce_client.spec.js",
              "line": 30,
              "column": 3
            },
            {
              "title": "sensitive tables (client_user, client_session, client_invite) are NOT directly readable",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 50,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 117,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:18:36.543Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-465ce260ba7e6bd0fa43",
              "file": "recce_client.spec.js",
              "line": 39,
              "column": 3
            },
            {
              "title": "PostgREST exposes client + client_visible_recces_v + mail_outbox",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 252,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 143,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:35:22.373Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-2ce0aac8156834b76b73",
              "file": "recce_client.spec.js",
              "line": 30,
              "column": 3
            },
            {
              "title": "sensitive tables (client_user, client_session, client_invite) are NOT directly readable",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 252,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 91,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:35:22.566Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-75a392213d756dc1a942",
              "file": "recce_client.spec.js",
              "line": 39,
              "column": 3
            }
          ]
        },
        {
          "title": "Phase 4.1 — supervisor gate",
          "file": "recce_client.spec.js",
          "line": 51,
          "column": 6,
          "specs": [
            {
              "title": "non-supervisor invite attempt returns forbidden",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 50,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 26,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:61:18",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 18,
                          "line": 61
                        },
                        "snippet": "  59 |       p_invited_by: 'mukesh',\n  60 |     });\n> 61 |     expect(j.ok).toBe(false);\n     |                  ^\n  62 |     expect(j.error).toBe('forbidden');\n  63 |     await ctx.dispose();\n  64 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 18,
                            "line": 61
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  59 |       p_invited_by: 'mukesh',\n  60 |     });\n> 61 |     expect(j.ok).toBe(false);\n     |                  ^\n  62 |     expect(j.error).toBe('forbidden');\n  63 |     await ctx.dispose();\n  64 |   });\n    at /var/www/360lm/tests/recce_client.spec.js:61:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:18:36.692Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-1-—-s-67b86-e-attempt-returns-forbidden-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 18,
                        "line": 61
                      }
                    },
                    {
                      "workerIndex": 51,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 72,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:61:18",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 18,
                          "line": 61
                        },
                        "snippet": "  59 |       p_invited_by: 'mukesh',\n  60 |     });\n> 61 |     expect(j.ok).toBe(false);\n     |                  ^\n  62 |     expect(j.error).toBe('forbidden');\n  63 |     await ctx.dispose();\n  64 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 18,
                            "line": 61
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  59 |       p_invited_by: 'mukesh',\n  60 |     });\n> 61 |     expect(j.ok).toBe(false);\n     |                  ^\n  62 |     expect(j.error).toBe('forbidden');\n  63 |     await ctx.dispose();\n  64 |   });\n    at /var/www/360lm/tests/recce_client.spec.js:61:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:18:37.623Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-1-—-s-67b86-e-attempt-returns-forbidden-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 18,
                        "line": 61
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-ee86b5d78885b6d436ec",
              "file": "recce_client.spec.js",
              "line": 52,
              "column": 3
            },
            {
              "title": "non-supervisor invite attempt returns forbidden",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 252,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 24,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:61:18",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 18,
                          "line": 61
                        },
                        "snippet": "  59 |       p_invited_by: 'mukesh',\n  60 |     });\n> 61 |     expect(j.ok).toBe(false);\n     |                  ^\n  62 |     expect(j.error).toBe('forbidden');\n  63 |     await ctx.dispose();\n  64 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 18,
                            "line": 61
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  59 |       p_invited_by: 'mukesh',\n  60 |     });\n> 61 |     expect(j.ok).toBe(false);\n     |                  ^\n  62 |     expect(j.error).toBe('forbidden');\n  63 |     await ctx.dispose();\n  64 |   });\n    at /var/www/360lm/tests/recce_client.spec.js:61:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:35:22.676Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-1-—-s-67b86-e-attempt-returns-forbidden-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 18,
                        "line": 61
                      }
                    },
                    {
                      "workerIndex": 253,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 77,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:61:18",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 18,
                          "line": 61
                        },
                        "snippet": "  59 |       p_invited_by: 'mukesh',\n  60 |     });\n> 61 |     expect(j.ok).toBe(false);\n     |                  ^\n  62 |     expect(j.error).toBe('forbidden');\n  63 |     await ctx.dispose();\n  64 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 18,
                            "line": 61
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  59 |       p_invited_by: 'mukesh',\n  60 |     });\n> 61 |     expect(j.ok).toBe(false);\n     |                  ^\n  62 |     expect(j.error).toBe('forbidden');\n  63 |     await ctx.dispose();\n  64 |   });\n    at /var/www/360lm/tests/recce_client.spec.js:61:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:35:23.592Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-1-—-s-67b86-e-attempt-returns-forbidden-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 18,
                        "line": 61
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-39a2c0b302b1b2681d65",
              "file": "recce_client.spec.js",
              "line": 52,
              "column": 3
            }
          ]
        },
        {
          "title": "Phase 4.1 — end-to-end auth + visibility",
          "file": "recce_client.spec.js",
          "line": 68,
          "column": 6,
          "specs": [
            {
              "title": "invite → consume → validate → recces_for_client_user → revoke",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 52,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 213,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:108:23",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 23,
                          "line": 108
                        },
                        "snippet": "  106 |         p_invited_by: 'harish',\n  107 |       });\n> 108 |       expect(invR.ok).toBe(true);\n      |                       ^\n  109 |       expect(invR.invite_id).toBeTruthy();\n  110 |       expect(invR.client_user_id).toBeTruthy();\n  111 |       const inviteId = invR.invite_id;"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 23,
                            "line": 108
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  106 |         p_invited_by: 'harish',\n  107 |       });\n> 108 |       expect(invR.ok).toBe(true);\n      |                       ^\n  109 |       expect(invR.invite_id).toBeTruthy();\n  110 |       expect(invR.client_user_id).toBeTruthy();\n  111 |       const inviteId = invR.invite_id;\n    at /var/www/360lm/tests/recce_client.spec.js:108:23"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:18:38.620Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-1-—-e-3ef88-es-for-client-user-→-revoke-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 23,
                        "line": 108
                      }
                    },
                    {
                      "workerIndex": 53,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 152,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:108:23",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 23,
                          "line": 108
                        },
                        "snippet": "  106 |         p_invited_by: 'harish',\n  107 |       });\n> 108 |       expect(invR.ok).toBe(true);\n      |                       ^\n  109 |       expect(invR.invite_id).toBeTruthy();\n  110 |       expect(invR.client_user_id).toBeTruthy();\n  111 |       const inviteId = invR.invite_id;"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 23,
                            "line": 108
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  106 |         p_invited_by: 'harish',\n  107 |       });\n> 108 |       expect(invR.ok).toBe(true);\n      |                       ^\n  109 |       expect(invR.invite_id).toBeTruthy();\n  110 |       expect(invR.client_user_id).toBeTruthy();\n  111 |       const inviteId = invR.invite_id;\n    at /var/www/360lm/tests/recce_client.spec.js:108:23"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:18:39.733Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-1-—-e-3ef88-es-for-client-user-→-revoke-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 23,
                        "line": 108
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-546da71e4f9760dc0c40",
              "file": "recce_client.spec.js",
              "line": 69,
              "column": 3
            },
            {
              "title": "brand filter: HP client_user does NOT see Lenovo Recces",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 54,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 145,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:201:21",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 21,
                          "line": 201
                        },
                        "snippet": "  199 |       p_display_name: 'X', p_invited_by: 'harish',\n  200 |     });\n> 201 |     expect(invR.ok).toBe(true);\n      |                     ^\n  202 |     const recces = await rpc(ctx, 'recces_for_client_user', { p_client_user_id: invR.client_user_id });\n  203 |     const subs = recces.map(r => r.sub_id).sort();\n  204 |     // Should ONLY see subHp (brand=HP_FX); subLen has brand=LEN_FX which is NOT in HP client's brand_codes"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 21,
                            "line": 201
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  199 |       p_display_name: 'X', p_invited_by: 'harish',\n  200 |     });\n> 201 |     expect(invR.ok).toBe(true);\n      |                     ^\n  202 |     const recces = await rpc(ctx, 'recces_for_client_user', { p_client_user_id: invR.client_user_id });\n  203 |     const subs = recces.map(r => r.sub_id).sort();\n  204 |     // Should ONLY see subHp (brand=HP_FX); subLen has brand=LEN_FX which is NOT in HP client's brand_codes\n    at /var/www/360lm/tests/recce_client.spec.js:201:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:18:40.780Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-1-—-e-98fa6--does-NOT-see-Lenovo-Recces-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 21,
                        "line": 201
                      }
                    },
                    {
                      "workerIndex": 55,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 158,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:201:21",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 21,
                          "line": 201
                        },
                        "snippet": "  199 |       p_display_name: 'X', p_invited_by: 'harish',\n  200 |     });\n> 201 |     expect(invR.ok).toBe(true);\n      |                     ^\n  202 |     const recces = await rpc(ctx, 'recces_for_client_user', { p_client_user_id: invR.client_user_id });\n  203 |     const subs = recces.map(r => r.sub_id).sort();\n  204 |     // Should ONLY see subHp (brand=HP_FX); subLen has brand=LEN_FX which is NOT in HP client's brand_codes"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 21,
                            "line": 201
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  199 |       p_display_name: 'X', p_invited_by: 'harish',\n  200 |     });\n> 201 |     expect(invR.ok).toBe(true);\n      |                     ^\n  202 |     const recces = await rpc(ctx, 'recces_for_client_user', { p_client_user_id: invR.client_user_id });\n  203 |     const subs = recces.map(r => r.sub_id).sort();\n  204 |     // Should ONLY see subHp (brand=HP_FX); subLen has brand=LEN_FX which is NOT in HP client's brand_codes\n    at /var/www/360lm/tests/recce_client.spec.js:201:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:18:41.977Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-1-—-e-98fa6--does-NOT-see-Lenovo-Recces-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 21,
                        "line": 201
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-92620518c8f4d6f343fe",
              "file": "recce_client.spec.js",
              "line": 170,
              "column": 3
            },
            {
              "title": "invite → consume → validate → recces_for_client_user → revoke",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 254,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 209,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:108:23",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 23,
                          "line": 108
                        },
                        "snippet": "  106 |         p_invited_by: 'harish',\n  107 |       });\n> 108 |       expect(invR.ok).toBe(true);\n      |                       ^\n  109 |       expect(invR.invite_id).toBeTruthy();\n  110 |       expect(invR.client_user_id).toBeTruthy();\n  111 |       const inviteId = invR.invite_id;"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 23,
                            "line": 108
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  106 |         p_invited_by: 'harish',\n  107 |       });\n> 108 |       expect(invR.ok).toBe(true);\n      |                       ^\n  109 |       expect(invR.invite_id).toBeTruthy();\n  110 |       expect(invR.client_user_id).toBeTruthy();\n  111 |       const inviteId = invR.invite_id;\n    at /var/www/360lm/tests/recce_client.spec.js:108:23"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:35:24.526Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-1-—-e-3ef88-es-for-client-user-→-revoke-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 23,
                        "line": 108
                      }
                    },
                    {
                      "workerIndex": 255,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 156,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:108:23",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 23,
                          "line": 108
                        },
                        "snippet": "  106 |         p_invited_by: 'harish',\n  107 |       });\n> 108 |       expect(invR.ok).toBe(true);\n      |                       ^\n  109 |       expect(invR.invite_id).toBeTruthy();\n  110 |       expect(invR.client_user_id).toBeTruthy();\n  111 |       const inviteId = invR.invite_id;"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 23,
                            "line": 108
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  106 |         p_invited_by: 'harish',\n  107 |       });\n> 108 |       expect(invR.ok).toBe(true);\n      |                       ^\n  109 |       expect(invR.invite_id).toBeTruthy();\n  110 |       expect(invR.client_user_id).toBeTruthy();\n  111 |       const inviteId = invR.invite_id;\n    at /var/www/360lm/tests/recce_client.spec.js:108:23"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:35:25.621Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-1-—-e-3ef88-es-for-client-user-→-revoke-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 23,
                        "line": 108
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-cfada63b1cb12a94dfc4",
              "file": "recce_client.spec.js",
              "line": 69,
              "column": 3
            },
            {
              "title": "brand filter: HP client_user does NOT see Lenovo Recces",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 256,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 122,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:201:21",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 21,
                          "line": 201
                        },
                        "snippet": "  199 |       p_display_name: 'X', p_invited_by: 'harish',\n  200 |     });\n> 201 |     expect(invR.ok).toBe(true);\n      |                     ^\n  202 |     const recces = await rpc(ctx, 'recces_for_client_user', { p_client_user_id: invR.client_user_id });\n  203 |     const subs = recces.map(r => r.sub_id).sort();\n  204 |     // Should ONLY see subHp (brand=HP_FX); subLen has brand=LEN_FX which is NOT in HP client's brand_codes"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 21,
                            "line": 201
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  199 |       p_display_name: 'X', p_invited_by: 'harish',\n  200 |     });\n> 201 |     expect(invR.ok).toBe(true);\n      |                     ^\n  202 |     const recces = await rpc(ctx, 'recces_for_client_user', { p_client_user_id: invR.client_user_id });\n  203 |     const subs = recces.map(r => r.sub_id).sort();\n  204 |     // Should ONLY see subHp (brand=HP_FX); subLen has brand=LEN_FX which is NOT in HP client's brand_codes\n    at /var/www/360lm/tests/recce_client.spec.js:201:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:35:26.621Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-1-—-e-98fa6--does-NOT-see-Lenovo-Recces-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 21,
                        "line": 201
                      }
                    },
                    {
                      "workerIndex": 257,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 141,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:201:21",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 21,
                          "line": 201
                        },
                        "snippet": "  199 |       p_display_name: 'X', p_invited_by: 'harish',\n  200 |     });\n> 201 |     expect(invR.ok).toBe(true);\n      |                     ^\n  202 |     const recces = await rpc(ctx, 'recces_for_client_user', { p_client_user_id: invR.client_user_id });\n  203 |     const subs = recces.map(r => r.sub_id).sort();\n  204 |     // Should ONLY see subHp (brand=HP_FX); subLen has brand=LEN_FX which is NOT in HP client's brand_codes"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 21,
                            "line": 201
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  199 |       p_display_name: 'X', p_invited_by: 'harish',\n  200 |     });\n> 201 |     expect(invR.ok).toBe(true);\n      |                     ^\n  202 |     const recces = await rpc(ctx, 'recces_for_client_user', { p_client_user_id: invR.client_user_id });\n  203 |     const subs = recces.map(r => r.sub_id).sort();\n  204 |     // Should ONLY see subHp (brand=HP_FX); subLen has brand=LEN_FX which is NOT in HP client's brand_codes\n    at /var/www/360lm/tests/recce_client.spec.js:201:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:35:27.590Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-1-—-e-98fa6--does-NOT-see-Lenovo-Recces-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 21,
                        "line": 201
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-0fd992f8258e53f153d6",
              "file": "recce_client.spec.js",
              "line": 170,
              "column": 3
            }
          ]
        },
        {
          "title": "Phase 4.2 — PWA shell",
          "file": "recce_client.spec.js",
          "line": 220,
          "column": 6,
          "specs": [
            {
              "title": "login screen renders without session",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 56,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1312,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:18:43.131Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-65d9e3fb5718270df3fa",
              "file": "recce_client.spec.js",
              "line": 223,
              "column": 3
            },
            {
              "title": "SW version + manifest reachable",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 56,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 65,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:18:44.635Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-c3c5315fc7aac68f0469",
              "file": "recce_client.spec.js",
              "line": 231,
              "column": 3
            },
            {
              "title": "Phase 4.16 — compare screen + bulk Compare button wired",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 56,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 32,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:18:44.726Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-cce10ac7d0e99328dba5",
              "file": "recce_client.spec.js",
              "line": 241,
              "column": 3
            },
            {
              "title": "login does not leak existence (returns ok=true for non-existent email)",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 56,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2549,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:18:44.779Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-9c21e54f9fbbd6477563",
              "file": "recce_client.spec.js",
              "line": 253,
              "column": 3
            },
            {
              "title": "magic-link → list renders → viewer signs+opens → logout revokes",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 56,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 312,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:319:21",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 21,
                          "line": 319
                        },
                        "snippet": "  317 |       p_display_name: 'PW42', p_invited_by: 'harish',\n  318 |     });\n> 319 |     expect(invR.ok).toBe(true);\n      |                     ^\n  320 |\n  321 |     try {\n  322 |       // Magic-link → URL"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 21,
                            "line": 319
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  317 |       p_display_name: 'PW42', p_invited_by: 'harish',\n  318 |     });\n> 319 |     expect(invR.ok).toBe(true);\n      |                     ^\n  320 |\n  321 |     try {\n  322 |       // Magic-link → URL\n    at /var/www/360lm/tests/recce_client.spec.js:319:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:18:47.361Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-2-—-P-4eb59-igns-opens-→-logout-revokes-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-2-—-P-4eb59-igns-opens-→-logout-revokes-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 21,
                        "line": 319
                      }
                    },
                    {
                      "workerIndex": 57,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 396,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:319:21",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 21,
                          "line": 319
                        },
                        "snippet": "  317 |       p_display_name: 'PW42', p_invited_by: 'harish',\n  318 |     });\n> 319 |     expect(invR.ok).toBe(true);\n      |                     ^\n  320 |\n  321 |     try {\n  322 |       // Magic-link → URL"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 21,
                            "line": 319
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  317 |       p_display_name: 'PW42', p_invited_by: 'harish',\n  318 |     });\n> 319 |     expect(invR.ok).toBe(true);\n      |                     ^\n  320 |\n  321 |     try {\n  322 |       // Magic-link → URL\n    at /var/www/360lm/tests/recce_client.spec.js:319:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:18:48.986Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-2-—-P-4eb59-igns-opens-→-logout-revokes-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-2-—-P-4eb59-igns-opens-→-logout-revokes-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 21,
                        "line": 319
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-d35c41195d319c4ff459",
              "file": "recce_client.spec.js",
              "line": 265,
              "column": 3
            },
            {
              "title": "expired/used token shows error on the login screen",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 58,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2112,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:18:50.620Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-2394a60373cb4e8b448c",
              "file": "recce_client.spec.js",
              "line": 373,
              "column": 3
            },
            {
              "title": "login screen renders without session",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 258,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1536,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:35:28.707Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-74d0473e431cae3c642e",
              "file": "recce_client.spec.js",
              "line": 223,
              "column": 3
            },
            {
              "title": "SW version + manifest reachable",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 258,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 72,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:35:30.498Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-46eba6276c21b0191c67",
              "file": "recce_client.spec.js",
              "line": 231,
              "column": 3
            },
            {
              "title": "Phase 4.16 — compare screen + bulk Compare button wired",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 258,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 18,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:35:30.588Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-cd192c968ad6c49e096d",
              "file": "recce_client.spec.js",
              "line": 241,
              "column": 3
            },
            {
              "title": "login does not leak existence (returns ok=true for non-existent email)",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 258,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2597,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:35:30.636Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-0cf92f625917f085eecd",
              "file": "recce_client.spec.js",
              "line": 253,
              "column": 3
            },
            {
              "title": "magic-link → list renders → viewer signs+opens → logout revokes",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 258,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 200,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:319:21",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 21,
                          "line": 319
                        },
                        "snippet": "  317 |       p_display_name: 'PW42', p_invited_by: 'harish',\n  318 |     });\n> 319 |     expect(invR.ok).toBe(true);\n      |                     ^\n  320 |\n  321 |     try {\n  322 |       // Magic-link → URL"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 21,
                            "line": 319
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  317 |       p_display_name: 'PW42', p_invited_by: 'harish',\n  318 |     });\n> 319 |     expect(invR.ok).toBe(true);\n      |                     ^\n  320 |\n  321 |     try {\n  322 |       // Magic-link → URL\n    at /var/www/360lm/tests/recce_client.spec.js:319:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:35:33.277Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-2-—-P-4eb59-igns-opens-→-logout-revokes-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-2-—-P-4eb59-igns-opens-→-logout-revokes-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 21,
                        "line": 319
                      }
                    },
                    {
                      "workerIndex": 259,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 327,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:319:21",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 21,
                          "line": 319
                        },
                        "snippet": "  317 |       p_display_name: 'PW42', p_invited_by: 'harish',\n  318 |     });\n> 319 |     expect(invR.ok).toBe(true);\n      |                     ^\n  320 |\n  321 |     try {\n  322 |       // Magic-link → URL"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 21,
                            "line": 319
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  317 |       p_display_name: 'PW42', p_invited_by: 'harish',\n  318 |     });\n> 319 |     expect(invR.ok).toBe(true);\n      |                     ^\n  320 |\n  321 |     try {\n  322 |       // Magic-link → URL\n    at /var/www/360lm/tests/recce_client.spec.js:319:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:35:34.411Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-2-—-P-4eb59-igns-opens-→-logout-revokes-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-2-—-P-4eb59-igns-opens-→-logout-revokes-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 21,
                        "line": 319
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-ff8f74ac1db8d1de7ada",
              "file": "recce_client.spec.js",
              "line": 265,
              "column": 3
            },
            {
              "title": "expired/used token shows error on the login screen",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 260,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2002,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:35:35.696Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-bb5cd1a4e0c08edf40e6",
              "file": "recce_client.spec.js",
              "line": 373,
              "column": 3
            }
          ]
        },
        {
          "title": "Phase 4.4 — client_set_response RPC",
          "file": "recce_client.spec.js",
          "line": 383,
          "column": 6,
          "specs": [
            {
              "title": "validation: bad_status / comment_required / forbidden / session_invalid",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 58,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 203,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:421:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 421
                        },
                        "snippet": "  419 |         p_session_id: sessionId, p_sub_id: subId, p_status: 'maybe',\n  420 |       });\n> 421 |       expect(r.ok).toBe(false); expect(r.error).toBe('bad_status');\n      |                    ^\n  422 |\n  423 |       // comment_required for rejected\n  424 |       r = await rpc(ctx, 'client_set_response', {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 421
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  419 |         p_session_id: sessionId, p_sub_id: subId, p_status: 'maybe',\n  420 |       });\n> 421 |       expect(r.ok).toBe(false); expect(r.error).toBe('bad_status');\n      |                    ^\n  422 |\n  423 |       // comment_required for rejected\n  424 |       r = await rpc(ctx, 'client_set_response', {\n    at /var/www/360lm/tests/recce_client.spec.js:421:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:18:52.906Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-4-—-c-6b379-d-forbidden-session-invalid-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 421
                      }
                    },
                    {
                      "workerIndex": 59,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 202,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:421:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 421
                        },
                        "snippet": "  419 |         p_session_id: sessionId, p_sub_id: subId, p_status: 'maybe',\n  420 |       });\n> 421 |       expect(r.ok).toBe(false); expect(r.error).toBe('bad_status');\n      |                    ^\n  422 |\n  423 |       // comment_required for rejected\n  424 |       r = await rpc(ctx, 'client_set_response', {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 421
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  419 |         p_session_id: sessionId, p_sub_id: subId, p_status: 'maybe',\n  420 |       });\n> 421 |       expect(r.ok).toBe(false); expect(r.error).toBe('bad_status');\n      |                    ^\n  422 |\n  423 |       // comment_required for rejected\n  424 |       r = await rpc(ctx, 'client_set_response', {\n    at /var/www/360lm/tests/recce_client.spec.js:421:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:18:54.174Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-4-—-c-6b379-d-forbidden-session-invalid-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 421
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-9ccc07f6111bdd197350",
              "file": "recce_client.spec.js",
              "line": 384,
              "column": 3
            },
            {
              "title": "validation: bad_status / comment_required / forbidden / session_invalid",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 260,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 170,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:421:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 421
                        },
                        "snippet": "  419 |         p_session_id: sessionId, p_sub_id: subId, p_status: 'maybe',\n  420 |       });\n> 421 |       expect(r.ok).toBe(false); expect(r.error).toBe('bad_status');\n      |                    ^\n  422 |\n  423 |       // comment_required for rejected\n  424 |       r = await rpc(ctx, 'client_set_response', {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 421
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  419 |         p_session_id: sessionId, p_sub_id: subId, p_status: 'maybe',\n  420 |       });\n> 421 |       expect(r.ok).toBe(false); expect(r.error).toBe('bad_status');\n      |                    ^\n  422 |\n  423 |       // comment_required for rejected\n  424 |       r = await rpc(ctx, 'client_set_response', {\n    at /var/www/360lm/tests/recce_client.spec.js:421:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:35:37.860Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-4-—-c-6b379-d-forbidden-session-invalid-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 421
                      }
                    },
                    {
                      "workerIndex": 261,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 158,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:421:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 421
                        },
                        "snippet": "  419 |         p_session_id: sessionId, p_sub_id: subId, p_status: 'maybe',\n  420 |       });\n> 421 |       expect(r.ok).toBe(false); expect(r.error).toBe('bad_status');\n      |                    ^\n  422 |\n  423 |       // comment_required for rejected\n  424 |       r = await rpc(ctx, 'client_set_response', {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 421
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  419 |         p_session_id: sessionId, p_sub_id: subId, p_status: 'maybe',\n  420 |       });\n> 421 |       expect(r.ok).toBe(false); expect(r.error).toBe('bad_status');\n      |                    ^\n  422 |\n  423 |       // comment_required for rejected\n  424 |       r = await rpc(ctx, 'client_set_response', {\n    at /var/www/360lm/tests/recce_client.spec.js:421:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:35:38.842Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-4-—-c-6b379-d-forbidden-session-invalid-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 421
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-af2cc5d76f5af80dd3fc",
              "file": "recce_client.spec.js",
              "line": 384,
              "column": 3
            }
          ]
        },
        {
          "title": "Phase 4.4 — PWA viewer response form",
          "file": "recce_client.spec.js",
          "line": 478,
          "column": 6,
          "specs": [
            {
              "title": "initial pending state → Approve → list status updates → re-open → Approve with changes",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 60,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30090,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 18,
                            "line": 523
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.r-row')\u001b[22m\n\n\n  521 |       await page.goto(`https://dev.srv1111289.hstgr.cloud/recce-client/?token=${inv.invite_id}`, { waitUntil: 'networkidle' });\n  522 |       await page.waitForTimeout(1500);\n> 523 |       await page.click('.r-row');\n      |                  ^\n  524 |       await page.waitForTimeout(400);\n  525 |       // Current state shows pending; Submit disabled\n  526 |       await expect(page.locator('#v-rsp-current')).toContainText(/awaiting/i);\n    at /var/www/360lm/tests/recce_client.spec.js:523:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:18:55.322Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-4-—-P-d1b99-open-→-Approve-with-changes-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-4-—-P-d1b99-open-→-Approve-with-changes-android-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 61,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30110,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 18,
                            "line": 523
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.r-row')\u001b[22m\n\n\n  521 |       await page.goto(`https://dev.srv1111289.hstgr.cloud/recce-client/?token=${inv.invite_id}`, { waitUntil: 'networkidle' });\n  522 |       await page.waitForTimeout(1500);\n> 523 |       await page.click('.r-row');\n      |                  ^\n  524 |       await page.waitForTimeout(400);\n  525 |       // Current state shows pending; Submit disabled\n  526 |       await expect(page.locator('#v-rsp-current')).toContainText(/awaiting/i);\n    at /var/www/360lm/tests/recce_client.spec.js:523:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:19:26.503Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-4-—-P-d1b99-open-→-Approve-with-changes-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-4-—-P-d1b99-open-→-Approve-with-changes-android-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-2f186cf814b3b4a3d30b",
              "file": "recce_client.spec.js",
              "line": 481,
              "column": 3
            },
            {
              "title": "initial pending state → Approve → list status updates → re-open → Approve with changes",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 262,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30112,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 18,
                            "line": 523
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.r-row')\u001b[22m\n\n\n  521 |       await page.goto(`https://dev.srv1111289.hstgr.cloud/recce-client/?token=${inv.invite_id}`, { waitUntil: 'networkidle' });\n  522 |       await page.waitForTimeout(1500);\n> 523 |       await page.click('.r-row');\n      |                  ^\n  524 |       await page.waitForTimeout(400);\n  525 |       // Current state shows pending; Submit disabled\n  526 |       await expect(page.locator('#v-rsp-current')).toContainText(/awaiting/i);\n    at /var/www/360lm/tests/recce_client.spec.js:523:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:35:39.888Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-4-—-P-d1b99-open-→-Approve-with-changes-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-4-—-P-d1b99-open-→-Approve-with-changes-desktop-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 263,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30098,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 18,
                            "line": 523
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.r-row')\u001b[22m\n\n\n  521 |       await page.goto(`https://dev.srv1111289.hstgr.cloud/recce-client/?token=${inv.invite_id}`, { waitUntil: 'networkidle' });\n  522 |       await page.waitForTimeout(1500);\n> 523 |       await page.click('.r-row');\n      |                  ^\n  524 |       await page.waitForTimeout(400);\n  525 |       // Current state shows pending; Submit disabled\n  526 |       await expect(page.locator('#v-rsp-current')).toContainText(/awaiting/i);\n    at /var/www/360lm/tests/recce_client.spec.js:523:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:36:11.150Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-4-—-P-d1b99-open-→-Approve-with-changes-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-4-—-P-d1b99-open-→-Approve-with-changes-desktop-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-152bd10f2a441dd03e95",
              "file": "recce_client.spec.js",
              "line": 481,
              "column": 3
            }
          ]
        },
        {
          "title": "Phase 4.2 — recce-view-proxy ClientPortal auth",
          "file": "recce_client.spec.js",
          "line": 577,
          "column": 6,
          "specs": [
            {
              "title": "proxy /sign accepts ClientPortal session and rejects bogus session",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 62,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 94,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:594:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 594
                        },
                        "snippet": "  592 |     });\n  593 |     const ses = await rpc(ctx, 'consume_invite', { p_invite_id: inv.invite_id });\n> 594 |     expect(ses.ok).toBe(true);\n      |                    ^\n  595 |\n  596 |     // Good session → 200\n  597 |     const good = await ctx.post('https://dev.srv1111289.hstgr.cloud/recce-view-proxy/sign', {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 594
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  592 |     });\n  593 |     const ses = await rpc(ctx, 'consume_invite', { p_invite_id: inv.invite_id });\n> 594 |     expect(ses.ok).toBe(true);\n      |                    ^\n  595 |\n  596 |     // Good session → 200\n  597 |     const good = await ctx.post('https://dev.srv1111289.hstgr.cloud/recce-view-proxy/sign', {\n    at /var/www/360lm/tests/recce_client.spec.js:594:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:19:57.730Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-2-—-r-c3eea-n-and-rejects-bogus-session-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 594
                      }
                    },
                    {
                      "workerIndex": 63,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 111,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:594:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 594
                        },
                        "snippet": "  592 |     });\n  593 |     const ses = await rpc(ctx, 'consume_invite', { p_invite_id: inv.invite_id });\n> 594 |     expect(ses.ok).toBe(true);\n      |                    ^\n  595 |\n  596 |     // Good session → 200\n  597 |     const good = await ctx.post('https://dev.srv1111289.hstgr.cloud/recce-view-proxy/sign', {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 594
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  592 |     });\n  593 |     const ses = await rpc(ctx, 'consume_invite', { p_invite_id: inv.invite_id });\n> 594 |     expect(ses.ok).toBe(true);\n      |                    ^\n  595 |\n  596 |     // Good session → 200\n  597 |     const good = await ctx.post('https://dev.srv1111289.hstgr.cloud/recce-view-proxy/sign', {\n    at /var/www/360lm/tests/recce_client.spec.js:594:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:19:58.747Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-2-—-r-c3eea-n-and-rejects-bogus-session-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 594
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-759d29ff1a9acb01f947",
              "file": "recce_client.spec.js",
              "line": 578,
              "column": 3
            },
            {
              "title": "proxy /sign accepts ClientPortal session and rejects bogus session",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 264,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 95,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:594:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 594
                        },
                        "snippet": "  592 |     });\n  593 |     const ses = await rpc(ctx, 'consume_invite', { p_invite_id: inv.invite_id });\n> 594 |     expect(ses.ok).toBe(true);\n      |                    ^\n  595 |\n  596 |     // Good session → 200\n  597 |     const good = await ctx.post('https://dev.srv1111289.hstgr.cloud/recce-view-proxy/sign', {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 594
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  592 |     });\n  593 |     const ses = await rpc(ctx, 'consume_invite', { p_invite_id: inv.invite_id });\n> 594 |     expect(ses.ok).toBe(true);\n      |                    ^\n  595 |\n  596 |     // Good session → 200\n  597 |     const good = await ctx.post('https://dev.srv1111289.hstgr.cloud/recce-view-proxy/sign', {\n    at /var/www/360lm/tests/recce_client.spec.js:594:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:36:42.325Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-2-—-r-c3eea-n-and-rejects-bogus-session-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 594
                      }
                    },
                    {
                      "workerIndex": 265,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 87,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:594:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 594
                        },
                        "snippet": "  592 |     });\n  593 |     const ses = await rpc(ctx, 'consume_invite', { p_invite_id: inv.invite_id });\n> 594 |     expect(ses.ok).toBe(true);\n      |                    ^\n  595 |\n  596 |     // Good session → 200\n  597 |     const good = await ctx.post('https://dev.srv1111289.hstgr.cloud/recce-view-proxy/sign', {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 594
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  592 |     });\n  593 |     const ses = await rpc(ctx, 'consume_invite', { p_invite_id: inv.invite_id });\n> 594 |     expect(ses.ok).toBe(true);\n      |                    ^\n  595 |\n  596 |     // Good session → 200\n  597 |     const good = await ctx.post('https://dev.srv1111289.hstgr.cloud/recce-view-proxy/sign', {\n    at /var/www/360lm/tests/recce_client.spec.js:594:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:36:43.300Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-2-—-r-c3eea-n-and-rejects-bogus-session-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 594
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-efd5279c000d943cf03e",
              "file": "recce_client.spec.js",
              "line": 578,
              "column": 3
            }
          ]
        },
        {
          "title": "Phase 4.1 — mail relay worker",
          "file": "recce_client.spec.js",
          "line": 619,
          "column": 6,
          "specs": [
            {
              "title": "worker drains pending mail rows produced via the invite RPC",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 120000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 64,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 116,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:639:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 639
                        },
                        "snippet": "  637 |       p_display_name: 'Relay tester', p_invited_by: 'harish',\n  638 |     });\n> 639 |     expect(inv.ok).toBe(true);\n      |                    ^\n  640 |     const inviteId = inv.invite_id;\n  641 |\n  642 |     // Poll for the worker to mark it sent (DEV mode = console.log + mark sent)"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 639
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  637 |       p_display_name: 'Relay tester', p_invited_by: 'harish',\n  638 |     });\n> 639 |     expect(inv.ok).toBe(true);\n      |                    ^\n  640 |     const inviteId = inv.invite_id;\n  641 |\n  642 |     // Poll for the worker to mark it sent (DEV mode = console.log + mark sent)\n    at /var/www/360lm/tests/recce_client.spec.js:639:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:19:59.964Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-1-—-m-3f189-produced-via-the-invite-RPC-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 639
                      }
                    },
                    {
                      "workerIndex": 65,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 204,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:639:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 639
                        },
                        "snippet": "  637 |       p_display_name: 'Relay tester', p_invited_by: 'harish',\n  638 |     });\n> 639 |     expect(inv.ok).toBe(true);\n      |                    ^\n  640 |     const inviteId = inv.invite_id;\n  641 |\n  642 |     // Poll for the worker to mark it sent (DEV mode = console.log + mark sent)"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 639
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  637 |       p_display_name: 'Relay tester', p_invited_by: 'harish',\n  638 |     });\n> 639 |     expect(inv.ok).toBe(true);\n      |                    ^\n  640 |     const inviteId = inv.invite_id;\n  641 |\n  642 |     // Poll for the worker to mark it sent (DEV mode = console.log + mark sent)\n    at /var/www/360lm/tests/recce_client.spec.js:639:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:20:01.614Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-1-—-m-3f189-produced-via-the-invite-RPC-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 639
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-da75682d0441589a9324",
              "file": "recce_client.spec.js",
              "line": 620,
              "column": 3
            },
            {
              "title": "worker drains pending mail rows produced via the invite RPC",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 120000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 266,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 74,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:639:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 639
                        },
                        "snippet": "  637 |       p_display_name: 'Relay tester', p_invited_by: 'harish',\n  638 |     });\n> 639 |     expect(inv.ok).toBe(true);\n      |                    ^\n  640 |     const inviteId = inv.invite_id;\n  641 |\n  642 |     // Poll for the worker to mark it sent (DEV mode = console.log + mark sent)"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 639
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  637 |       p_display_name: 'Relay tester', p_invited_by: 'harish',\n  638 |     });\n> 639 |     expect(inv.ok).toBe(true);\n      |                    ^\n  640 |     const inviteId = inv.invite_id;\n  641 |\n  642 |     // Poll for the worker to mark it sent (DEV mode = console.log + mark sent)\n    at /var/www/360lm/tests/recce_client.spec.js:639:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:36:44.318Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-1-—-m-3f189-produced-via-the-invite-RPC-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 639
                      }
                    },
                    {
                      "workerIndex": 267,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 79,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:639:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 639
                        },
                        "snippet": "  637 |       p_display_name: 'Relay tester', p_invited_by: 'harish',\n  638 |     });\n> 639 |     expect(inv.ok).toBe(true);\n      |                    ^\n  640 |     const inviteId = inv.invite_id;\n  641 |\n  642 |     // Poll for the worker to mark it sent (DEV mode = console.log + mark sent)"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 639
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  637 |       p_display_name: 'Relay tester', p_invited_by: 'harish',\n  638 |     });\n> 639 |     expect(inv.ok).toBe(true);\n      |                    ^\n  640 |     const inviteId = inv.invite_id;\n  641 |\n  642 |     // Poll for the worker to mark it sent (DEV mode = console.log + mark sent)\n    at /var/www/360lm/tests/recce_client.spec.js:639:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:36:45.230Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-1-—-m-3f189-produced-via-the-invite-RPC-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 639
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-6564155f9f9c900dabc8",
              "file": "recce_client.spec.js",
              "line": 620,
              "column": 3
            }
          ]
        },
        {
          "title": "Phase 4.9 — notification preferences",
          "file": "recce_client.spec.js",
          "line": 666,
          "column": 6,
          "specs": [
            {
              "title": "list_my_notify_prefs defaults all-on; set_my_notify_pref toggles; dispatch_notify suppresses when opted out",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 66,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 135,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:685:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 685
                        },
                        "snippet": "  683 |       }),\n  684 |     })).json();\n> 685 |     expect(inv.ok).toBe(true);\n      |                    ^\n  686 |     const cuId = inv.client_user_id;\n  687 |     const inviteId = inv.invite_id;\n  688 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 685
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  683 |       }),\n  684 |     })).json();\n> 685 |     expect(inv.ok).toBe(true);\n      |                    ^\n  686 |     const cuId = inv.client_user_id;\n  687 |     const inviteId = inv.invite_id;\n  688 |\n    at /var/www/360lm/tests/recce_client.spec.js:685:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:04.318Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-9-—-n-a175f-y-suppresses-when-opted-out-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 685
                      }
                    },
                    {
                      "workerIndex": 67,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 77,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:685:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 685
                        },
                        "snippet": "  683 |       }),\n  684 |     })).json();\n> 685 |     expect(inv.ok).toBe(true);\n      |                    ^\n  686 |     const cuId = inv.client_user_id;\n  687 |     const inviteId = inv.invite_id;\n  688 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 685
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  683 |       }),\n  684 |     })).json();\n> 685 |     expect(inv.ok).toBe(true);\n      |                    ^\n  686 |     const cuId = inv.client_user_id;\n  687 |     const inviteId = inv.invite_id;\n  688 |\n    at /var/www/360lm/tests/recce_client.spec.js:685:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:20:06.063Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-9-—-n-a175f-y-suppresses-when-opted-out-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 685
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-0605e0a74bdee130d1af",
              "file": "recce_client.spec.js",
              "line": 667,
              "column": 3
            },
            {
              "title": "list_my_notify_prefs defaults all-on; set_my_notify_pref toggles; dispatch_notify suppresses when opted out",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 268,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 85,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:685:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 685
                        },
                        "snippet": "  683 |       }),\n  684 |     })).json();\n> 685 |     expect(inv.ok).toBe(true);\n      |                    ^\n  686 |     const cuId = inv.client_user_id;\n  687 |     const inviteId = inv.invite_id;\n  688 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 685
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  683 |       }),\n  684 |     })).json();\n> 685 |     expect(inv.ok).toBe(true);\n      |                    ^\n  686 |     const cuId = inv.client_user_id;\n  687 |     const inviteId = inv.invite_id;\n  688 |\n    at /var/www/360lm/tests/recce_client.spec.js:685:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:36:46.287Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-9-—-n-a175f-y-suppresses-when-opted-out-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 685
                      }
                    },
                    {
                      "workerIndex": 269,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 70,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:685:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 685
                        },
                        "snippet": "  683 |       }),\n  684 |     })).json();\n> 685 |     expect(inv.ok).toBe(true);\n      |                    ^\n  686 |     const cuId = inv.client_user_id;\n  687 |     const inviteId = inv.invite_id;\n  688 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 685
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  683 |       }),\n  684 |     })).json();\n> 685 |     expect(inv.ok).toBe(true);\n      |                    ^\n  686 |     const cuId = inv.client_user_id;\n  687 |     const inviteId = inv.invite_id;\n  688 |\n    at /var/www/360lm/tests/recce_client.spec.js:685:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:36:47.320Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-9-—-n-a175f-y-suppresses-when-opted-out-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 685
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-a7dfc39ea0adfe145457",
              "file": "recce_client.spec.js",
              "line": 667,
              "column": 3
            }
          ]
        },
        {
          "title": "Phase 4.10 — bulk response RPC",
          "file": "recce_client.spec.js",
          "line": 813,
          "column": 6,
          "specs": [
            {
              "title": "client_bulk_response: validation + partial visibility + N audit rows + N trigger fires",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 68,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 188,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // deep equality\u001b[22m\n\n\u001b[32m- Expected  - 2\u001b[39m\n\u001b[31m+ Received  + 4\u001b[39m\n\n\u001b[2m  Object {\u001b[22m\n\u001b[32m-   \"error\": \"empty_sub_ids\",\u001b[39m\n\u001b[32m-   \"ok\": false,\u001b[39m\n\u001b[31m+   \"code\": \"PGRST202\",\u001b[39m\n\u001b[31m+   \"details\": \"Searched for the function counters.client_bulk_response with parameters p_comment, p_status, p_sub_ids or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\",\u001b[39m\n\u001b[31m+   \"hint\": \"Perhaps you meant to call the function counters.client_bulk_response(p_comment, p_session_id, p_status, p_sub_ids)\",\u001b[39m\n\u001b[31m+   \"message\": \"Could not find the function counters.client_bulk_response(p_comment, p_status, p_sub_ids) in the schema cache\",\u001b[39m\n\u001b[2m  }\u001b[22m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // deep equality\u001b[22m\n\n\u001b[32m- Expected  - 2\u001b[39m\n\u001b[31m+ Received  + 4\u001b[39m\n\n\u001b[2m  Object {\u001b[22m\n\u001b[32m-   \"error\": \"empty_sub_ids\",\u001b[39m\n\u001b[32m-   \"ok\": false,\u001b[39m\n\u001b[31m+   \"code\": \"PGRST202\",\u001b[39m\n\u001b[31m+   \"details\": \"Searched for the function counters.client_bulk_response with parameters p_comment, p_status, p_sub_ids or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\",\u001b[39m\n\u001b[31m+   \"hint\": \"Perhaps you meant to call the function counters.client_bulk_response(p_comment, p_session_id, p_status, p_sub_ids)\",\u001b[39m\n\u001b[31m+   \"message\": \"Could not find the function counters.client_bulk_response(p_comment, p_status, p_sub_ids) in the schema cache\",\u001b[39m\n\u001b[2m  }\u001b[22m\n    at /var/www/360lm/tests/recce_client.spec.js:873:19",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 19,
                          "line": 873
                        },
                        "snippet": "  871 |       }),\n  872 |     })).json();\n> 873 |     expect(empty).toEqual({ ok: false, error: 'empty_sub_ids' });\n      |                   ^\n  874 |\n  875 |     // 2. validation: bad status\n  876 |     const badSt = await (await ctx.post(`${DB}/rpc/client_bulk_response`, { headers: HC,"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 19,
                            "line": 873
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // deep equality\u001b[22m\n\n\u001b[32m- Expected  - 2\u001b[39m\n\u001b[31m+ Received  + 4\u001b[39m\n\n\u001b[2m  Object {\u001b[22m\n\u001b[32m-   \"error\": \"empty_sub_ids\",\u001b[39m\n\u001b[32m-   \"ok\": false,\u001b[39m\n\u001b[31m+   \"code\": \"PGRST202\",\u001b[39m\n\u001b[31m+   \"details\": \"Searched for the function counters.client_bulk_response with parameters p_comment, p_status, p_sub_ids or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\",\u001b[39m\n\u001b[31m+   \"hint\": \"Perhaps you meant to call the function counters.client_bulk_response(p_comment, p_session_id, p_status, p_sub_ids)\",\u001b[39m\n\u001b[31m+   \"message\": \"Could not find the function counters.client_bulk_response(p_comment, p_status, p_sub_ids) in the schema cache\",\u001b[39m\n\u001b[2m  }\u001b[22m\n\n  871 |       }),\n  872 |     })).json();\n> 873 |     expect(empty).toEqual({ ok: false, error: 'empty_sub_ids' });\n      |                   ^\n  874 |\n  875 |     // 2. validation: bad status\n  876 |     const badSt = await (await ctx.post(`${DB}/rpc/client_bulk_response`, { headers: HC,\n    at /var/www/360lm/tests/recce_client.spec.js:873:19"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:07.111Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-10-—--319bb--audit-rows-N-trigger-fires-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 19,
                        "line": 873
                      }
                    },
                    {
                      "workerIndex": 69,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 181,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // deep equality\u001b[22m\n\n\u001b[32m- Expected  - 2\u001b[39m\n\u001b[31m+ Received  + 4\u001b[39m\n\n\u001b[2m  Object {\u001b[22m\n\u001b[32m-   \"error\": \"empty_sub_ids\",\u001b[39m\n\u001b[32m-   \"ok\": false,\u001b[39m\n\u001b[31m+   \"code\": \"PGRST202\",\u001b[39m\n\u001b[31m+   \"details\": \"Searched for the function counters.client_bulk_response with parameters p_comment, p_status, p_sub_ids or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\",\u001b[39m\n\u001b[31m+   \"hint\": \"Perhaps you meant to call the function counters.client_bulk_response(p_comment, p_session_id, p_status, p_sub_ids)\",\u001b[39m\n\u001b[31m+   \"message\": \"Could not find the function counters.client_bulk_response(p_comment, p_status, p_sub_ids) in the schema cache\",\u001b[39m\n\u001b[2m  }\u001b[22m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // deep equality\u001b[22m\n\n\u001b[32m- Expected  - 2\u001b[39m\n\u001b[31m+ Received  + 4\u001b[39m\n\n\u001b[2m  Object {\u001b[22m\n\u001b[32m-   \"error\": \"empty_sub_ids\",\u001b[39m\n\u001b[32m-   \"ok\": false,\u001b[39m\n\u001b[31m+   \"code\": \"PGRST202\",\u001b[39m\n\u001b[31m+   \"details\": \"Searched for the function counters.client_bulk_response with parameters p_comment, p_status, p_sub_ids or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\",\u001b[39m\n\u001b[31m+   \"hint\": \"Perhaps you meant to call the function counters.client_bulk_response(p_comment, p_session_id, p_status, p_sub_ids)\",\u001b[39m\n\u001b[31m+   \"message\": \"Could not find the function counters.client_bulk_response(p_comment, p_status, p_sub_ids) in the schema cache\",\u001b[39m\n\u001b[2m  }\u001b[22m\n    at /var/www/360lm/tests/recce_client.spec.js:873:19",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 19,
                          "line": 873
                        },
                        "snippet": "  871 |       }),\n  872 |     })).json();\n> 873 |     expect(empty).toEqual({ ok: false, error: 'empty_sub_ids' });\n      |                   ^\n  874 |\n  875 |     // 2. validation: bad status\n  876 |     const badSt = await (await ctx.post(`${DB}/rpc/client_bulk_response`, { headers: HC,"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 19,
                            "line": 873
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // deep equality\u001b[22m\n\n\u001b[32m- Expected  - 2\u001b[39m\n\u001b[31m+ Received  + 4\u001b[39m\n\n\u001b[2m  Object {\u001b[22m\n\u001b[32m-   \"error\": \"empty_sub_ids\",\u001b[39m\n\u001b[32m-   \"ok\": false,\u001b[39m\n\u001b[31m+   \"code\": \"PGRST202\",\u001b[39m\n\u001b[31m+   \"details\": \"Searched for the function counters.client_bulk_response with parameters p_comment, p_status, p_sub_ids or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\",\u001b[39m\n\u001b[31m+   \"hint\": \"Perhaps you meant to call the function counters.client_bulk_response(p_comment, p_session_id, p_status, p_sub_ids)\",\u001b[39m\n\u001b[31m+   \"message\": \"Could not find the function counters.client_bulk_response(p_comment, p_status, p_sub_ids) in the schema cache\",\u001b[39m\n\u001b[2m  }\u001b[22m\n\n  871 |       }),\n  872 |     })).json();\n> 873 |     expect(empty).toEqual({ ok: false, error: 'empty_sub_ids' });\n      |                   ^\n  874 |\n  875 |     // 2. validation: bad status\n  876 |     const badSt = await (await ctx.post(`${DB}/rpc/client_bulk_response`, { headers: HC,\n    at /var/www/360lm/tests/recce_client.spec.js:873:19"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:20:08.375Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-10-—--319bb--audit-rows-N-trigger-fires-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 19,
                        "line": 873
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-282e2760b0a2be924687",
              "file": "recce_client.spec.js",
              "line": 814,
              "column": 3
            },
            {
              "title": "client_bulk_response: validation + partial visibility + N audit rows + N trigger fires",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 270,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 132,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // deep equality\u001b[22m\n\n\u001b[32m- Expected  - 2\u001b[39m\n\u001b[31m+ Received  + 4\u001b[39m\n\n\u001b[2m  Object {\u001b[22m\n\u001b[32m-   \"error\": \"empty_sub_ids\",\u001b[39m\n\u001b[32m-   \"ok\": false,\u001b[39m\n\u001b[31m+   \"code\": \"PGRST202\",\u001b[39m\n\u001b[31m+   \"details\": \"Searched for the function counters.client_bulk_response with parameters p_comment, p_status, p_sub_ids or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\",\u001b[39m\n\u001b[31m+   \"hint\": \"Perhaps you meant to call the function counters.client_bulk_response(p_comment, p_session_id, p_status, p_sub_ids)\",\u001b[39m\n\u001b[31m+   \"message\": \"Could not find the function counters.client_bulk_response(p_comment, p_status, p_sub_ids) in the schema cache\",\u001b[39m\n\u001b[2m  }\u001b[22m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // deep equality\u001b[22m\n\n\u001b[32m- Expected  - 2\u001b[39m\n\u001b[31m+ Received  + 4\u001b[39m\n\n\u001b[2m  Object {\u001b[22m\n\u001b[32m-   \"error\": \"empty_sub_ids\",\u001b[39m\n\u001b[32m-   \"ok\": false,\u001b[39m\n\u001b[31m+   \"code\": \"PGRST202\",\u001b[39m\n\u001b[31m+   \"details\": \"Searched for the function counters.client_bulk_response with parameters p_comment, p_status, p_sub_ids or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\",\u001b[39m\n\u001b[31m+   \"hint\": \"Perhaps you meant to call the function counters.client_bulk_response(p_comment, p_session_id, p_status, p_sub_ids)\",\u001b[39m\n\u001b[31m+   \"message\": \"Could not find the function counters.client_bulk_response(p_comment, p_status, p_sub_ids) in the schema cache\",\u001b[39m\n\u001b[2m  }\u001b[22m\n    at /var/www/360lm/tests/recce_client.spec.js:873:19",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 19,
                          "line": 873
                        },
                        "snippet": "  871 |       }),\n  872 |     })).json();\n> 873 |     expect(empty).toEqual({ ok: false, error: 'empty_sub_ids' });\n      |                   ^\n  874 |\n  875 |     // 2. validation: bad status\n  876 |     const badSt = await (await ctx.post(`${DB}/rpc/client_bulk_response`, { headers: HC,"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 19,
                            "line": 873
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // deep equality\u001b[22m\n\n\u001b[32m- Expected  - 2\u001b[39m\n\u001b[31m+ Received  + 4\u001b[39m\n\n\u001b[2m  Object {\u001b[22m\n\u001b[32m-   \"error\": \"empty_sub_ids\",\u001b[39m\n\u001b[32m-   \"ok\": false,\u001b[39m\n\u001b[31m+   \"code\": \"PGRST202\",\u001b[39m\n\u001b[31m+   \"details\": \"Searched for the function counters.client_bulk_response with parameters p_comment, p_status, p_sub_ids or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\",\u001b[39m\n\u001b[31m+   \"hint\": \"Perhaps you meant to call the function counters.client_bulk_response(p_comment, p_session_id, p_status, p_sub_ids)\",\u001b[39m\n\u001b[31m+   \"message\": \"Could not find the function counters.client_bulk_response(p_comment, p_status, p_sub_ids) in the schema cache\",\u001b[39m\n\u001b[2m  }\u001b[22m\n\n  871 |       }),\n  872 |     })).json();\n> 873 |     expect(empty).toEqual({ ok: false, error: 'empty_sub_ids' });\n      |                   ^\n  874 |\n  875 |     // 2. validation: bad status\n  876 |     const badSt = await (await ctx.post(`${DB}/rpc/client_bulk_response`, { headers: HC,\n    at /var/www/360lm/tests/recce_client.spec.js:873:19"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:36:48.302Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-10-—--319bb--audit-rows-N-trigger-fires-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 19,
                        "line": 873
                      }
                    },
                    {
                      "workerIndex": 271,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 156,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // deep equality\u001b[22m\n\n\u001b[32m- Expected  - 2\u001b[39m\n\u001b[31m+ Received  + 4\u001b[39m\n\n\u001b[2m  Object {\u001b[22m\n\u001b[32m-   \"error\": \"empty_sub_ids\",\u001b[39m\n\u001b[32m-   \"ok\": false,\u001b[39m\n\u001b[31m+   \"code\": \"PGRST202\",\u001b[39m\n\u001b[31m+   \"details\": \"Searched for the function counters.client_bulk_response with parameters p_comment, p_status, p_sub_ids or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\",\u001b[39m\n\u001b[31m+   \"hint\": \"Perhaps you meant to call the function counters.client_bulk_response(p_comment, p_session_id, p_status, p_sub_ids)\",\u001b[39m\n\u001b[31m+   \"message\": \"Could not find the function counters.client_bulk_response(p_comment, p_status, p_sub_ids) in the schema cache\",\u001b[39m\n\u001b[2m  }\u001b[22m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // deep equality\u001b[22m\n\n\u001b[32m- Expected  - 2\u001b[39m\n\u001b[31m+ Received  + 4\u001b[39m\n\n\u001b[2m  Object {\u001b[22m\n\u001b[32m-   \"error\": \"empty_sub_ids\",\u001b[39m\n\u001b[32m-   \"ok\": false,\u001b[39m\n\u001b[31m+   \"code\": \"PGRST202\",\u001b[39m\n\u001b[31m+   \"details\": \"Searched for the function counters.client_bulk_response with parameters p_comment, p_status, p_sub_ids or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\",\u001b[39m\n\u001b[31m+   \"hint\": \"Perhaps you meant to call the function counters.client_bulk_response(p_comment, p_session_id, p_status, p_sub_ids)\",\u001b[39m\n\u001b[31m+   \"message\": \"Could not find the function counters.client_bulk_response(p_comment, p_status, p_sub_ids) in the schema cache\",\u001b[39m\n\u001b[2m  }\u001b[22m\n    at /var/www/360lm/tests/recce_client.spec.js:873:19",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 19,
                          "line": 873
                        },
                        "snippet": "  871 |       }),\n  872 |     })).json();\n> 873 |     expect(empty).toEqual({ ok: false, error: 'empty_sub_ids' });\n      |                   ^\n  874 |\n  875 |     // 2. validation: bad status\n  876 |     const badSt = await (await ctx.post(`${DB}/rpc/client_bulk_response`, { headers: HC,"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 19,
                            "line": 873
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // deep equality\u001b[22m\n\n\u001b[32m- Expected  - 2\u001b[39m\n\u001b[31m+ Received  + 4\u001b[39m\n\n\u001b[2m  Object {\u001b[22m\n\u001b[32m-   \"error\": \"empty_sub_ids\",\u001b[39m\n\u001b[32m-   \"ok\": false,\u001b[39m\n\u001b[31m+   \"code\": \"PGRST202\",\u001b[39m\n\u001b[31m+   \"details\": \"Searched for the function counters.client_bulk_response with parameters p_comment, p_status, p_sub_ids or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\",\u001b[39m\n\u001b[31m+   \"hint\": \"Perhaps you meant to call the function counters.client_bulk_response(p_comment, p_session_id, p_status, p_sub_ids)\",\u001b[39m\n\u001b[31m+   \"message\": \"Could not find the function counters.client_bulk_response(p_comment, p_status, p_sub_ids) in the schema cache\",\u001b[39m\n\u001b[2m  }\u001b[22m\n\n  871 |       }),\n  872 |     })).json();\n> 873 |     expect(empty).toEqual({ ok: false, error: 'empty_sub_ids' });\n      |                   ^\n  874 |\n  875 |     // 2. validation: bad status\n  876 |     const badSt = await (await ctx.post(`${DB}/rpc/client_bulk_response`, { headers: HC,\n    at /var/www/360lm/tests/recce_client.spec.js:873:19"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:36:49.342Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-10-—--319bb--audit-rows-N-trigger-fires-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 19,
                        "line": 873
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-ade3092e7b584a909b75",
              "file": "recce_client.spec.js",
              "line": 814,
              "column": 3
            }
          ]
        },
        {
          "title": "Phase 4.11 — suspicious-login detection",
          "file": "recce_client.spec.js",
          "line": 964,
          "column": 6,
          "specs": [
            {
              "title": "consume_invite classifies risk: first=low, same IP class+UA family=low, new IP+UA=high; supervisor notify for medium/high only",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 70,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 135,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:998:18",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 18,
                          "line": 998
                        },
                        "snippet": "   996 |       }),\n   997 |     })).json();\n>  998 |     expect(a.ok).toBe(true);\n       |                  ^\n   999 |     expect(a.login_risk).toBe('low');\n  1000 |\n  1001 |     // Login 2: same /24 + same Chrome family (version bumped) → low"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 18,
                            "line": 998
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n   996 |       }),\n   997 |     })).json();\n>  998 |     expect(a.ok).toBe(true);\n       |                  ^\n   999 |     expect(a.login_risk).toBe('low');\n  1000 |\n  1001 |     // Login 2: same /24 + same Chrome family (version bumped) → low\n    at /var/www/360lm/tests/recce_client.spec.js:998:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:09.554Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-11-—--67551-notify-for-medium-high-only-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 18,
                        "line": 998
                      }
                    },
                    {
                      "workerIndex": 71,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 108,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:998:18",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 18,
                          "line": 998
                        },
                        "snippet": "   996 |       }),\n   997 |     })).json();\n>  998 |     expect(a.ok).toBe(true);\n       |                  ^\n   999 |     expect(a.login_risk).toBe('low');\n  1000 |\n  1001 |     // Login 2: same /24 + same Chrome family (version bumped) → low"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 18,
                            "line": 998
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n   996 |       }),\n   997 |     })).json();\n>  998 |     expect(a.ok).toBe(true);\n       |                  ^\n   999 |     expect(a.login_risk).toBe('low');\n  1000 |\n  1001 |     // Login 2: same /24 + same Chrome family (version bumped) → low\n    at /var/www/360lm/tests/recce_client.spec.js:998:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:20:10.697Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-11-—--67551-notify-for-medium-high-only-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 18,
                        "line": 998
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-784aadc42f8d903fc7b0",
              "file": "recce_client.spec.js",
              "line": 965,
              "column": 3
            },
            {
              "title": "consume_invite classifies risk: first=low, same IP class+UA family=low, new IP+UA=high; supervisor notify for medium/high only",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 272,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 97,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:998:18",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 18,
                          "line": 998
                        },
                        "snippet": "   996 |       }),\n   997 |     })).json();\n>  998 |     expect(a.ok).toBe(true);\n       |                  ^\n   999 |     expect(a.login_risk).toBe('low');\n  1000 |\n  1001 |     // Login 2: same /24 + same Chrome family (version bumped) → low"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 18,
                            "line": 998
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n   996 |       }),\n   997 |     })).json();\n>  998 |     expect(a.ok).toBe(true);\n       |                  ^\n   999 |     expect(a.login_risk).toBe('low');\n  1000 |\n  1001 |     // Login 2: same /24 + same Chrome family (version bumped) → low\n    at /var/www/360lm/tests/recce_client.spec.js:998:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:36:50.413Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-11-—--67551-notify-for-medium-high-only-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 18,
                        "line": 998
                      }
                    },
                    {
                      "workerIndex": 273,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 94,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:998:18",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 18,
                          "line": 998
                        },
                        "snippet": "   996 |       }),\n   997 |     })).json();\n>  998 |     expect(a.ok).toBe(true);\n       |                  ^\n   999 |     expect(a.login_risk).toBe('low');\n  1000 |\n  1001 |     // Login 2: same /24 + same Chrome family (version bumped) → low"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 18,
                            "line": 998
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n   996 |       }),\n   997 |     })).json();\n>  998 |     expect(a.ok).toBe(true);\n       |                  ^\n   999 |     expect(a.login_risk).toBe('low');\n  1000 |\n  1001 |     // Login 2: same /24 + same Chrome family (version bumped) → low\n    at /var/www/360lm/tests/recce_client.spec.js:998:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:36:51.409Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-11-—--67551-notify-for-medium-high-only-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 18,
                        "line": 998
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-5b405a9424d3bc684bad",
              "file": "recce_client.spec.js",
              "line": 965,
              "column": 3
            }
          ]
        },
        {
          "title": "Phase 4.13 — daily digest emails",
          "file": "recce_client.spec.js",
          "line": 1079,
          "column": 6,
          "specs": [
            {
              "title": "mode picker: instant default, daily defers + flush makes one mail, off suppresses, bad_mode rejected",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 72,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 101,
                      "error": {
                        "message": "TypeError: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoHaveLength\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must have a length property whose value must be a number\n\nReceived has type:  object\nReceived has value: \u001b[31m{\"code\": \"PGRST202\", \"details\": \"Searched for the function counters.list_my_notify_prefs without parameters or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\", \"hint\": null, \"message\": \"Could not find the function counters.list_my_notify_prefs without parameters in the schema cache\"}\u001b[39m",
                        "stack": "TypeError: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoHaveLength\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must have a length property whose value must be a number\n\nReceived has type:  object\nReceived has value: \u001b[31m{\"code\": \"PGRST202\", \"details\": \"Searched for the function counters.list_my_notify_prefs without parameters or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\", \"hint\": null, \"message\": \"Could not find the function counters.list_my_notify_prefs without parameters in the schema cache\"}\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:1112:18",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 18,
                          "line": 1112
                        },
                        "snippet": "  1110 |       data: JSON.stringify({ p_session_id: sessionId }),\n  1111 |     })).json();\n> 1112 |     expect(list).toHaveLength(2);\n       |                  ^\n  1113 |     expect(list.every(r => r.mode === 'instant')).toBe(true);\n  1114 |     expect(list.every(r => r.enabled === true)).toBe(true);\n  1115 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 18,
                            "line": 1112
                          },
                          "message": "TypeError: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoHaveLength\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must have a length property whose value must be a number\n\nReceived has type:  object\nReceived has value: \u001b[31m{\"code\": \"PGRST202\", \"details\": \"Searched for the function counters.list_my_notify_prefs without parameters or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\", \"hint\": null, \"message\": \"Could not find the function counters.list_my_notify_prefs without parameters in the schema cache\"}\u001b[39m\n\n  1110 |       data: JSON.stringify({ p_session_id: sessionId }),\n  1111 |     })).json();\n> 1112 |     expect(list).toHaveLength(2);\n       |                  ^\n  1113 |     expect(list.every(r => r.mode === 'instant')).toBe(true);\n  1114 |     expect(list.every(r => r.enabled === true)).toBe(true);\n  1115 |\n    at /var/www/360lm/tests/recce_client.spec.js:1112:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:11.815Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-13-—--9b580-uppresses-bad-mode-rejected-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 18,
                        "line": 1112
                      }
                    },
                    {
                      "workerIndex": 73,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 84,
                      "error": {
                        "message": "TypeError: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoHaveLength\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must have a length property whose value must be a number\n\nReceived has type:  object\nReceived has value: \u001b[31m{\"code\": \"PGRST202\", \"details\": \"Searched for the function counters.list_my_notify_prefs without parameters or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\", \"hint\": null, \"message\": \"Could not find the function counters.list_my_notify_prefs without parameters in the schema cache\"}\u001b[39m",
                        "stack": "TypeError: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoHaveLength\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must have a length property whose value must be a number\n\nReceived has type:  object\nReceived has value: \u001b[31m{\"code\": \"PGRST202\", \"details\": \"Searched for the function counters.list_my_notify_prefs without parameters or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\", \"hint\": null, \"message\": \"Could not find the function counters.list_my_notify_prefs without parameters in the schema cache\"}\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:1112:18",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 18,
                          "line": 1112
                        },
                        "snippet": "  1110 |       data: JSON.stringify({ p_session_id: sessionId }),\n  1111 |     })).json();\n> 1112 |     expect(list).toHaveLength(2);\n       |                  ^\n  1113 |     expect(list.every(r => r.mode === 'instant')).toBe(true);\n  1114 |     expect(list.every(r => r.enabled === true)).toBe(true);\n  1115 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 18,
                            "line": 1112
                          },
                          "message": "TypeError: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoHaveLength\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must have a length property whose value must be a number\n\nReceived has type:  object\nReceived has value: \u001b[31m{\"code\": \"PGRST202\", \"details\": \"Searched for the function counters.list_my_notify_prefs without parameters or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\", \"hint\": null, \"message\": \"Could not find the function counters.list_my_notify_prefs without parameters in the schema cache\"}\u001b[39m\n\n  1110 |       data: JSON.stringify({ p_session_id: sessionId }),\n  1111 |     })).json();\n> 1112 |     expect(list).toHaveLength(2);\n       |                  ^\n  1113 |     expect(list.every(r => r.mode === 'instant')).toBe(true);\n  1114 |     expect(list.every(r => r.enabled === true)).toBe(true);\n  1115 |\n    at /var/www/360lm/tests/recce_client.spec.js:1112:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:20:12.807Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-13-—--9b580-uppresses-bad-mode-rejected-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 18,
                        "line": 1112
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-212f6cf84db9cee8333e",
              "file": "recce_client.spec.js",
              "line": 1080,
              "column": 3
            },
            {
              "title": "mode picker: instant default, daily defers + flush makes one mail, off suppresses, bad_mode rejected",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 274,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 92,
                      "error": {
                        "message": "TypeError: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoHaveLength\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must have a length property whose value must be a number\n\nReceived has type:  object\nReceived has value: \u001b[31m{\"code\": \"PGRST202\", \"details\": \"Searched for the function counters.list_my_notify_prefs without parameters or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\", \"hint\": null, \"message\": \"Could not find the function counters.list_my_notify_prefs without parameters in the schema cache\"}\u001b[39m",
                        "stack": "TypeError: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoHaveLength\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must have a length property whose value must be a number\n\nReceived has type:  object\nReceived has value: \u001b[31m{\"code\": \"PGRST202\", \"details\": \"Searched for the function counters.list_my_notify_prefs without parameters or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\", \"hint\": null, \"message\": \"Could not find the function counters.list_my_notify_prefs without parameters in the schema cache\"}\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:1112:18",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 18,
                          "line": 1112
                        },
                        "snippet": "  1110 |       data: JSON.stringify({ p_session_id: sessionId }),\n  1111 |     })).json();\n> 1112 |     expect(list).toHaveLength(2);\n       |                  ^\n  1113 |     expect(list.every(r => r.mode === 'instant')).toBe(true);\n  1114 |     expect(list.every(r => r.enabled === true)).toBe(true);\n  1115 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 18,
                            "line": 1112
                          },
                          "message": "TypeError: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoHaveLength\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must have a length property whose value must be a number\n\nReceived has type:  object\nReceived has value: \u001b[31m{\"code\": \"PGRST202\", \"details\": \"Searched for the function counters.list_my_notify_prefs without parameters or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\", \"hint\": null, \"message\": \"Could not find the function counters.list_my_notify_prefs without parameters in the schema cache\"}\u001b[39m\n\n  1110 |       data: JSON.stringify({ p_session_id: sessionId }),\n  1111 |     })).json();\n> 1112 |     expect(list).toHaveLength(2);\n       |                  ^\n  1113 |     expect(list.every(r => r.mode === 'instant')).toBe(true);\n  1114 |     expect(list.every(r => r.enabled === true)).toBe(true);\n  1115 |\n    at /var/www/360lm/tests/recce_client.spec.js:1112:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:36:52.389Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-13-—--9b580-uppresses-bad-mode-rejected-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 18,
                        "line": 1112
                      }
                    },
                    {
                      "workerIndex": 275,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 75,
                      "error": {
                        "message": "TypeError: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoHaveLength\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must have a length property whose value must be a number\n\nReceived has type:  object\nReceived has value: \u001b[31m{\"code\": \"PGRST202\", \"details\": \"Searched for the function counters.list_my_notify_prefs without parameters or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\", \"hint\": null, \"message\": \"Could not find the function counters.list_my_notify_prefs without parameters in the schema cache\"}\u001b[39m",
                        "stack": "TypeError: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoHaveLength\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must have a length property whose value must be a number\n\nReceived has type:  object\nReceived has value: \u001b[31m{\"code\": \"PGRST202\", \"details\": \"Searched for the function counters.list_my_notify_prefs without parameters or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\", \"hint\": null, \"message\": \"Could not find the function counters.list_my_notify_prefs without parameters in the schema cache\"}\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:1112:18",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 18,
                          "line": 1112
                        },
                        "snippet": "  1110 |       data: JSON.stringify({ p_session_id: sessionId }),\n  1111 |     })).json();\n> 1112 |     expect(list).toHaveLength(2);\n       |                  ^\n  1113 |     expect(list.every(r => r.mode === 'instant')).toBe(true);\n  1114 |     expect(list.every(r => r.enabled === true)).toBe(true);\n  1115 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 18,
                            "line": 1112
                          },
                          "message": "TypeError: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoHaveLength\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must have a length property whose value must be a number\n\nReceived has type:  object\nReceived has value: \u001b[31m{\"code\": \"PGRST202\", \"details\": \"Searched for the function counters.list_my_notify_prefs without parameters or with a single unnamed json/jsonb parameter, but no matches were found in the schema cache.\", \"hint\": null, \"message\": \"Could not find the function counters.list_my_notify_prefs without parameters in the schema cache\"}\u001b[39m\n\n  1110 |       data: JSON.stringify({ p_session_id: sessionId }),\n  1111 |     })).json();\n> 1112 |     expect(list).toHaveLength(2);\n       |                  ^\n  1113 |     expect(list.every(r => r.mode === 'instant')).toBe(true);\n  1114 |     expect(list.every(r => r.enabled === true)).toBe(true);\n  1115 |\n    at /var/www/360lm/tests/recce_client.spec.js:1112:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:36:53.336Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-13-—--9b580-uppresses-bad-mode-rejected-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 18,
                        "line": 1112
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-ed4708b7ac8a28fd315e",
              "file": "recce_client.spec.js",
              "line": 1080,
              "column": 3
            }
          ]
        },
        {
          "title": "Phase 4.18 — self-serve fresh magic-link audit",
          "file": "recce_client.spec.js",
          "line": 1262,
          "column": 6,
          "specs": [
            {
              "title": "request_client_login: real email writes audit + mail + invite; unknown silent; rate-limit silent; admin_list_invites by user",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 74,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 73,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:1281:21",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 21,
                          "line": 1281
                        },
                        "snippet": "  1279 |       }),\n  1280 |     })).json();\n> 1281 |     expect(seed.ok).toBe(true);\n       |                     ^\n  1282 |     const cuId = seed.client_user_id;\n  1283 |\n  1284 |     const baseAudit = await (await ctx.post(`${DB}/rpc/admin_list_audit`, { headers: HC,"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 21,
                            "line": 1281
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  1279 |       }),\n  1280 |     })).json();\n> 1281 |     expect(seed.ok).toBe(true);\n       |                     ^\n  1282 |     const cuId = seed.client_user_id;\n  1283 |\n  1284 |     const baseAudit = await (await ctx.post(`${DB}/rpc/admin_list_audit`, { headers: HC,\n    at /var/www/360lm/tests/recce_client.spec.js:1281:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:13.766Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-18-—--c6d2b--admin-list-invites-by-user-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 21,
                        "line": 1281
                      }
                    },
                    {
                      "workerIndex": 75,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 88,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:1281:21",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 21,
                          "line": 1281
                        },
                        "snippet": "  1279 |       }),\n  1280 |     })).json();\n> 1281 |     expect(seed.ok).toBe(true);\n       |                     ^\n  1282 |     const cuId = seed.client_user_id;\n  1283 |\n  1284 |     const baseAudit = await (await ctx.post(`${DB}/rpc/admin_list_audit`, { headers: HC,"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 21,
                            "line": 1281
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  1279 |       }),\n  1280 |     })).json();\n> 1281 |     expect(seed.ok).toBe(true);\n       |                     ^\n  1282 |     const cuId = seed.client_user_id;\n  1283 |\n  1284 |     const baseAudit = await (await ctx.post(`${DB}/rpc/admin_list_audit`, { headers: HC,\n    at /var/www/360lm/tests/recce_client.spec.js:1281:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:20:14.807Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-18-—--c6d2b--admin-list-invites-by-user-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 21,
                        "line": 1281
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-0e70e9dce33c429cce00",
              "file": "recce_client.spec.js",
              "line": 1263,
              "column": 3
            },
            {
              "title": "request_client_login: real email writes audit + mail + invite; unknown silent; rate-limit silent; admin_list_invites by user",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 276,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 75,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:1281:21",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 21,
                          "line": 1281
                        },
                        "snippet": "  1279 |       }),\n  1280 |     })).json();\n> 1281 |     expect(seed.ok).toBe(true);\n       |                     ^\n  1282 |     const cuId = seed.client_user_id;\n  1283 |\n  1284 |     const baseAudit = await (await ctx.post(`${DB}/rpc/admin_list_audit`, { headers: HC,"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 21,
                            "line": 1281
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  1279 |       }),\n  1280 |     })).json();\n> 1281 |     expect(seed.ok).toBe(true);\n       |                     ^\n  1282 |     const cuId = seed.client_user_id;\n  1283 |\n  1284 |     const baseAudit = await (await ctx.post(`${DB}/rpc/admin_list_audit`, { headers: HC,\n    at /var/www/360lm/tests/recce_client.spec.js:1281:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:36:54.279Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-18-—--c6d2b--admin-list-invites-by-user-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 21,
                        "line": 1281
                      }
                    },
                    {
                      "workerIndex": 277,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 62,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:1281:21",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 21,
                          "line": 1281
                        },
                        "snippet": "  1279 |       }),\n  1280 |     })).json();\n> 1281 |     expect(seed.ok).toBe(true);\n       |                     ^\n  1282 |     const cuId = seed.client_user_id;\n  1283 |\n  1284 |     const baseAudit = await (await ctx.post(`${DB}/rpc/admin_list_audit`, { headers: HC,"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 21,
                            "line": 1281
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  1279 |       }),\n  1280 |     })).json();\n> 1281 |     expect(seed.ok).toBe(true);\n       |                     ^\n  1282 |     const cuId = seed.client_user_id;\n  1283 |\n  1284 |     const baseAudit = await (await ctx.post(`${DB}/rpc/admin_list_audit`, { headers: HC,\n    at /var/www/360lm/tests/recce_client.spec.js:1281:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:36:55.263Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-4-18-—--c6d2b--admin-list-invites-by-user-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 21,
                        "line": 1281
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-f8e1821767b44229c080",
              "file": "recce_client.spec.js",
              "line": 1263,
              "column": 3
            }
          ]
        },
        {
          "title": "Phase 7.0 — get_branding_items RPC",
          "file": "recce_client.spec.js",
          "line": 1402,
          "column": 6,
          "specs": [
            {
              "title": "returns brandings + empty approvals for a fresh session; forbidden for wrong user",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 76,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 98,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:1432:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 1432
                        },
                        "snippet": "  1430 |       p_display_name: `PW7 ${s}`, p_invited_by: 'harish',\n  1431 |     });\n> 1432 |     expect(inv.ok).toBe(true);\n       |                    ^\n  1433 |     const ses = await rpc(ctx, 'consume_invite', { p_invite_id: inv.invite_id });\n  1434 |     expect(ses.ok).toBe(true);\n  1435 |     const sessionId = ses.session_id;"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 1432
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  1430 |       p_display_name: `PW7 ${s}`, p_invited_by: 'harish',\n  1431 |     });\n> 1432 |     expect(inv.ok).toBe(true);\n       |                    ^\n  1433 |     const ses = await rpc(ctx, 'consume_invite', { p_invite_id: inv.invite_id });\n  1434 |     expect(ses.ok).toBe(true);\n  1435 |     const sessionId = ses.session_id;\n    at /var/www/360lm/tests/recce_client.spec.js:1432:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:15.825Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-7-0-—-g-73a58-on-forbidden-for-wrong-user-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 1432
                      }
                    },
                    {
                      "workerIndex": 77,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 111,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:1432:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 1432
                        },
                        "snippet": "  1430 |       p_display_name: `PW7 ${s}`, p_invited_by: 'harish',\n  1431 |     });\n> 1432 |     expect(inv.ok).toBe(true);\n       |                    ^\n  1433 |     const ses = await rpc(ctx, 'consume_invite', { p_invite_id: inv.invite_id });\n  1434 |     expect(ses.ok).toBe(true);\n  1435 |     const sessionId = ses.session_id;"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 1432
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  1430 |       p_display_name: `PW7 ${s}`, p_invited_by: 'harish',\n  1431 |     });\n> 1432 |     expect(inv.ok).toBe(true);\n       |                    ^\n  1433 |     const ses = await rpc(ctx, 'consume_invite', { p_invite_id: inv.invite_id });\n  1434 |     expect(ses.ok).toBe(true);\n  1435 |     const sessionId = ses.session_id;\n    at /var/www/360lm/tests/recce_client.spec.js:1432:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:20:16.863Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-7-0-—-g-73a58-on-forbidden-for-wrong-user-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 1432
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-353203c22c1f4c75b683",
              "file": "recce_client.spec.js",
              "line": 1403,
              "column": 3
            },
            {
              "title": "returns brandings + empty approvals for a fresh session; forbidden for wrong user",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 278,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 82,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:1432:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 1432
                        },
                        "snippet": "  1430 |       p_display_name: `PW7 ${s}`, p_invited_by: 'harish',\n  1431 |     });\n> 1432 |     expect(inv.ok).toBe(true);\n       |                    ^\n  1433 |     const ses = await rpc(ctx, 'consume_invite', { p_invite_id: inv.invite_id });\n  1434 |     expect(ses.ok).toBe(true);\n  1435 |     const sessionId = ses.session_id;"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 1432
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  1430 |       p_display_name: `PW7 ${s}`, p_invited_by: 'harish',\n  1431 |     });\n> 1432 |     expect(inv.ok).toBe(true);\n       |                    ^\n  1433 |     const ses = await rpc(ctx, 'consume_invite', { p_invite_id: inv.invite_id });\n  1434 |     expect(ses.ok).toBe(true);\n  1435 |     const sessionId = ses.session_id;\n    at /var/www/360lm/tests/recce_client.spec.js:1432:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:36:56.167Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-7-0-—-g-73a58-on-forbidden-for-wrong-user-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 1432
                      }
                    },
                    {
                      "workerIndex": 279,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 97,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:1432:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 1432
                        },
                        "snippet": "  1430 |       p_display_name: `PW7 ${s}`, p_invited_by: 'harish',\n  1431 |     });\n> 1432 |     expect(inv.ok).toBe(true);\n       |                    ^\n  1433 |     const ses = await rpc(ctx, 'consume_invite', { p_invite_id: inv.invite_id });\n  1434 |     expect(ses.ok).toBe(true);\n  1435 |     const sessionId = ses.session_id;"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 1432
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  1430 |       p_display_name: `PW7 ${s}`, p_invited_by: 'harish',\n  1431 |     });\n> 1432 |     expect(inv.ok).toBe(true);\n       |                    ^\n  1433 |     const ses = await rpc(ctx, 'consume_invite', { p_invite_id: inv.invite_id });\n  1434 |     expect(ses.ok).toBe(true);\n  1435 |     const sessionId = ses.session_id;\n    at /var/www/360lm/tests/recce_client.spec.js:1432:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:36:57.050Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-7-0-—-g-73a58-on-forbidden-for-wrong-user-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 1432
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-4bf3b77c422b072eaae9",
              "file": "recce_client.spec.js",
              "line": 1403,
              "column": 3
            }
          ]
        },
        {
          "title": "Phase 7.0 — client_set_branding_response RPC",
          "file": "recce_client.spec.js",
          "line": 1481,
          "column": 6,
          "specs": [
            {
              "title": "upserts branding_approvals, derives overall status, blocks on bad session/forbidden",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 78,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 227,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:1526:25",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 25,
                          "line": 1526
                        },
                        "snippet": "  1524 |         p_session_id: sessionId, p_sub_id: 'sub-not-real-7', p_items: [],\n  1525 |       });\n> 1526 |       expect(badSub.ok).toBe(false);\n       |                         ^\n  1527 |       expect(badSub.error).toBe('forbidden');\n  1528 |\n  1529 |       // 3. happy path — 2 items, one approved, one with changes"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 25,
                            "line": 1526
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  1524 |         p_session_id: sessionId, p_sub_id: 'sub-not-real-7', p_items: [],\n  1525 |       });\n> 1526 |       expect(badSub.ok).toBe(false);\n       |                         ^\n  1527 |       expect(badSub.error).toBe('forbidden');\n  1528 |\n  1529 |       // 3. happy path — 2 items, one approved, one with changes\n    at /var/www/360lm/tests/recce_client.spec.js:1526:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:17.883Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-7-0-—-c-ad06b-ks-on-bad-session-forbidden-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 25,
                        "line": 1526
                      }
                    },
                    {
                      "workerIndex": 79,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 266,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:1526:25",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 25,
                          "line": 1526
                        },
                        "snippet": "  1524 |         p_session_id: sessionId, p_sub_id: 'sub-not-real-7', p_items: [],\n  1525 |       });\n> 1526 |       expect(badSub.ok).toBe(false);\n       |                         ^\n  1527 |       expect(badSub.error).toBe('forbidden');\n  1528 |\n  1529 |       // 3. happy path — 2 items, one approved, one with changes"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 25,
                            "line": 1526
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  1524 |         p_session_id: sessionId, p_sub_id: 'sub-not-real-7', p_items: [],\n  1525 |       });\n> 1526 |       expect(badSub.ok).toBe(false);\n       |                         ^\n  1527 |       expect(badSub.error).toBe('forbidden');\n  1528 |\n  1529 |       // 3. happy path — 2 items, one approved, one with changes\n    at /var/www/360lm/tests/recce_client.spec.js:1526:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:20:18.981Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-7-0-—-c-ad06b-ks-on-bad-session-forbidden-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 25,
                        "line": 1526
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-fbaf8b64b48dfabf6ac2",
              "file": "recce_client.spec.js",
              "line": 1482,
              "column": 3
            },
            {
              "title": "upserts branding_approvals, derives overall status, blocks on bad session/forbidden",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 280,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 187,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:1526:25",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 25,
                          "line": 1526
                        },
                        "snippet": "  1524 |         p_session_id: sessionId, p_sub_id: 'sub-not-real-7', p_items: [],\n  1525 |       });\n> 1526 |       expect(badSub.ok).toBe(false);\n       |                         ^\n  1527 |       expect(badSub.error).toBe('forbidden');\n  1528 |\n  1529 |       // 3. happy path — 2 items, one approved, one with changes"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 25,
                            "line": 1526
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  1524 |         p_session_id: sessionId, p_sub_id: 'sub-not-real-7', p_items: [],\n  1525 |       });\n> 1526 |       expect(badSub.ok).toBe(false);\n       |                         ^\n  1527 |       expect(badSub.error).toBe('forbidden');\n  1528 |\n  1529 |       // 3. happy path — 2 items, one approved, one with changes\n    at /var/www/360lm/tests/recce_client.spec.js:1526:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:36:58.040Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-7-0-—-c-ad06b-ks-on-bad-session-forbidden-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 25,
                        "line": 1526
                      }
                    },
                    {
                      "workerIndex": 281,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 216,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:1526:25",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 25,
                          "line": 1526
                        },
                        "snippet": "  1524 |         p_session_id: sessionId, p_sub_id: 'sub-not-real-7', p_items: [],\n  1525 |       });\n> 1526 |       expect(badSub.ok).toBe(false);\n       |                         ^\n  1527 |       expect(badSub.error).toBe('forbidden');\n  1528 |\n  1529 |       // 3. happy path — 2 items, one approved, one with changes"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 25,
                            "line": 1526
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mfalse\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  1524 |         p_session_id: sessionId, p_sub_id: 'sub-not-real-7', p_items: [],\n  1525 |       });\n> 1526 |       expect(badSub.ok).toBe(false);\n       |                         ^\n  1527 |       expect(badSub.error).toBe('forbidden');\n  1528 |\n  1529 |       // 3. happy path — 2 items, one approved, one with changes\n    at /var/www/360lm/tests/recce_client.spec.js:1526:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:36:59.195Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-7-0-—-c-ad06b-ks-on-bad-session-forbidden-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 25,
                        "line": 1526
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-700b62e2f9eb5c56fb03",
              "file": "recce_client.spec.js",
              "line": 1482,
              "column": 3
            }
          ]
        },
        {
          "title": "Phase 7 — PWA respondable page (E2E)",
          "file": "recce_client.spec.js",
          "line": 1589,
          "column": 6,
          "specs": [
            {
              "title": "magic-link → viewer → Review Items → fill decisions → submit → DB verified",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 80,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 535,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:1625:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 1625
                        },
                        "snippet": "  1623 |       p_display_name: `PW7 ${s}`, p_invited_by: 'harish',\n  1624 |     });\n> 1625 |     expect(inv.ok).toBe(true);\n       |                    ^\n  1626 |     const cuId = inv.client_user_id;\n  1627 |\n  1628 |     try {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 1625
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  1623 |       p_display_name: `PW7 ${s}`, p_invited_by: 'harish',\n  1624 |     });\n> 1625 |     expect(inv.ok).toBe(true);\n       |                    ^\n  1626 |     const cuId = inv.client_user_id;\n  1627 |\n  1628 |     try {\n    at /var/www/360lm/tests/recce_client.spec.js:1625:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:20.175Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-7-—-PWA-53590-ions-→-submit-→-DB-verified-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-7-—-PWA-53590-ions-→-submit-→-DB-verified-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 1625
                      }
                    },
                    {
                      "workerIndex": 81,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 368,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:1625:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 1625
                        },
                        "snippet": "  1623 |       p_display_name: `PW7 ${s}`, p_invited_by: 'harish',\n  1624 |     });\n> 1625 |     expect(inv.ok).toBe(true);\n       |                    ^\n  1626 |     const cuId = inv.client_user_id;\n  1627 |\n  1628 |     try {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 1625
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  1623 |       p_display_name: `PW7 ${s}`, p_invited_by: 'harish',\n  1624 |     });\n> 1625 |     expect(inv.ok).toBe(true);\n       |                    ^\n  1626 |     const cuId = inv.client_user_id;\n  1627 |\n  1628 |     try {\n    at /var/www/360lm/tests/recce_client.spec.js:1625:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:20:22.190Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-7-—-PWA-53590-ions-→-submit-→-DB-verified-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-7-—-PWA-53590-ions-→-submit-→-DB-verified-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 1625
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-cb66da40a42b2f37dcb8",
              "file": "recce_client.spec.js",
              "line": 1596,
              "column": 3
            },
            {
              "title": "photo proxy serves brandings_0.jpg via HMAC token (signed by Hub session)",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 82,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 301,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:23.846Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-7cec539bc3376d6e6196",
              "file": "recce_client.spec.js",
              "line": 1718,
              "column": 3
            },
            {
              "title": "magic-link → viewer → Review Items → fill decisions → submit → DB verified",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 282,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 494,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:1625:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 1625
                        },
                        "snippet": "  1623 |       p_display_name: `PW7 ${s}`, p_invited_by: 'harish',\n  1624 |     });\n> 1625 |     expect(inv.ok).toBe(true);\n       |                    ^\n  1626 |     const cuId = inv.client_user_id;\n  1627 |\n  1628 |     try {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 1625
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  1623 |       p_display_name: `PW7 ${s}`, p_invited_by: 'harish',\n  1624 |     });\n> 1625 |     expect(inv.ok).toBe(true);\n       |                    ^\n  1626 |     const cuId = inv.client_user_id;\n  1627 |\n  1628 |     try {\n    at /var/www/360lm/tests/recce_client.spec.js:1625:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:00.511Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-7-—-PWA-53590-ions-→-submit-→-DB-verified-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-7-—-PWA-53590-ions-→-submit-→-DB-verified-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 1625
                      }
                    },
                    {
                      "workerIndex": 283,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 405,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/recce_client.spec.js:1625:20",
                        "location": {
                          "file": "/var/www/360lm/tests/recce_client.spec.js",
                          "column": 20,
                          "line": 1625
                        },
                        "snippet": "  1623 |       p_display_name: `PW7 ${s}`, p_invited_by: 'harish',\n  1624 |     });\n> 1625 |     expect(inv.ok).toBe(true);\n       |                    ^\n  1626 |     const cuId = inv.client_user_id;\n  1627 |\n  1628 |     try {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/recce_client.spec.js",
                            "column": 20,
                            "line": 1625
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  1623 |       p_display_name: `PW7 ${s}`, p_invited_by: 'harish',\n  1624 |     });\n> 1625 |     expect(inv.ok).toBe(true);\n       |                    ^\n  1626 |     const cuId = inv.client_user_id;\n  1627 |\n  1628 |     try {\n    at /var/www/360lm/tests/recce_client.spec.js:1625:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:37:02.873Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-7-—-PWA-53590-ions-→-submit-→-DB-verified-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/recce_client-Phase-7-—-PWA-53590-ions-→-submit-→-DB-verified-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/recce_client.spec.js",
                        "column": 20,
                        "line": 1625
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-141e08bd03b03ec91579",
              "file": "recce_client.spec.js",
              "line": 1596,
              "column": 3
            },
            {
              "title": "photo proxy serves brandings_0.jpg via HMAC token (signed by Hub session)",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 284,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 169,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:04.810Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "6b4c999b8a1aeac1a890-54f655edeae7575a85b5",
              "file": "recce_client.spec.js",
              "line": 1718,
              "column": 3
            }
          ]
        }
      ]
    },
    {
      "title": "rentveh.spec.js",
      "file": "rentveh.spec.js",
      "column": 0,
      "line": 0,
      "specs": [],
      "suites": [
        {
          "title": "Rent Vehicle — registration & shell",
          "file": "rentveh.spec.js",
          "line": 31,
          "column": 6,
          "specs": [
            {
              "title": "registered in hub.pwa_registry (ADR-016)",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 82,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 38,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:24.219Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-dd32305c2d1ee847545f",
              "file": "rentveh.spec.js",
              "line": 32,
              "column": 3
            },
            {
              "title": "SW cache version matches CACHE_VER in app",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 82,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 25,
                      "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\"'rentveh-v3'\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'rentveh-v5';\u001b[39m\n\u001b[31mconst ASSETS = ['/rentveh/', '/rentveh/index.html', '/rentveh/manifest.json',\u001b[39m\n\u001b[31m                '/shared/theme-v2.css', '/shared/safe-bottom.css'];·\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  if (e.request.method !== 'GET') return;\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db')) return;          // never cache API\u001b[39m\n\u001b[31m  if (url.pathname.endsWith('.mp4')) return;           // tutorial videos: range requests, too big for cache\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached =>\u001b[39m\n\u001b[31m      cached ||\u001b[39m\n\u001b[31m      fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m        if (resp.ok && url.origin === location.origin) {\u001b[39m\n\u001b[31m          const copy = resp.clone();\u001b[39m\n\u001b[31m          caches.open(CACHE).then(c => c.put(e.request, copy));\u001b[39m\n\u001b[31m        }\u001b[39m\n\u001b[31m        return resp;\u001b[39m\n\u001b[31m      }).catch(() => caches.match('/rentveh/'))\u001b[39m\n\u001b[31m    )\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\"'rentveh-v3'\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'rentveh-v5';\u001b[39m\n\u001b[31mconst ASSETS = ['/rentveh/', '/rentveh/index.html', '/rentveh/manifest.json',\u001b[39m\n\u001b[31m                '/shared/theme-v2.css', '/shared/safe-bottom.css'];·\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  if (e.request.method !== 'GET') return;\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db')) return;          // never cache API\u001b[39m\n\u001b[31m  if (url.pathname.endsWith('.mp4')) return;           // tutorial videos: range requests, too big for cache\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached =>\u001b[39m\n\u001b[31m      cached ||\u001b[39m\n\u001b[31m      fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m        if (resp.ok && url.origin === location.origin) {\u001b[39m\n\u001b[31m          const copy = resp.clone();\u001b[39m\n\u001b[31m          caches.open(CACHE).then(c => c.put(e.request, copy));\u001b[39m\n\u001b[31m        }\u001b[39m\n\u001b[31m        return resp;\u001b[39m\n\u001b[31m      }).catch(() => caches.match('/rentveh/'))\u001b[39m\n\u001b[31m    )\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/rentveh.spec.js:43:16",
                        "location": {
                          "file": "/var/www/360lm/tests/rentveh.spec.js",
                          "column": 16,
                          "line": 43
                        },
                        "snippet": "  41 |   test('SW cache version matches CACHE_VER in app', async ({ request }) => {\n  42 |     const sw = await (await request.get(`${BASE}sw.js`)).text();\n> 43 |     expect(sw).toContain(`'${SW_VER}'`);\n     |                ^\n  44 |     const html = await (await request.get(BASE)).text();\n  45 |     expect(html).toContain(`CACHE_VER = '${SW_VER}'`);\n  46 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/rentveh.spec.js",
                            "column": 16,
                            "line": 43
                          },
                          "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\"'rentveh-v3'\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'rentveh-v5';\u001b[39m\n\u001b[31mconst ASSETS = ['/rentveh/', '/rentveh/index.html', '/rentveh/manifest.json',\u001b[39m\n\u001b[31m                '/shared/theme-v2.css', '/shared/safe-bottom.css'];·\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  if (e.request.method !== 'GET') return;\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db')) return;          // never cache API\u001b[39m\n\u001b[31m  if (url.pathname.endsWith('.mp4')) return;           // tutorial videos: range requests, too big for cache\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached =>\u001b[39m\n\u001b[31m      cached ||\u001b[39m\n\u001b[31m      fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m        if (resp.ok && url.origin === location.origin) {\u001b[39m\n\u001b[31m          const copy = resp.clone();\u001b[39m\n\u001b[31m          caches.open(CACHE).then(c => c.put(e.request, copy));\u001b[39m\n\u001b[31m        }\u001b[39m\n\u001b[31m        return resp;\u001b[39m\n\u001b[31m      }).catch(() => caches.match('/rentveh/'))\u001b[39m\n\u001b[31m    )\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  41 |   test('SW cache version matches CACHE_VER in app', async ({ request }) => {\n  42 |     const sw = await (await request.get(`${BASE}sw.js`)).text();\n> 43 |     expect(sw).toContain(`'${SW_VER}'`);\n     |                ^\n  44 |     const html = await (await request.get(BASE)).text();\n  45 |     expect(html).toContain(`CACHE_VER = '${SW_VER}'`);\n  46 |   });\n    at /var/www/360lm/tests/rentveh.spec.js:43:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:24.287Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/rentveh-Rent-Vehicle-—-reg-70b35-on-matches-CACHE-VER-in-app-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/rentveh.spec.js",
                        "column": 16,
                        "line": 43
                      }
                    },
                    {
                      "workerIndex": 83,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 56,
                      "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\"'rentveh-v3'\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'rentveh-v5';\u001b[39m\n\u001b[31mconst ASSETS = ['/rentveh/', '/rentveh/index.html', '/rentveh/manifest.json',\u001b[39m\n\u001b[31m                '/shared/theme-v2.css', '/shared/safe-bottom.css'];·\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  if (e.request.method !== 'GET') return;\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db')) return;          // never cache API\u001b[39m\n\u001b[31m  if (url.pathname.endsWith('.mp4')) return;           // tutorial videos: range requests, too big for cache\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached =>\u001b[39m\n\u001b[31m      cached ||\u001b[39m\n\u001b[31m      fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m        if (resp.ok && url.origin === location.origin) {\u001b[39m\n\u001b[31m          const copy = resp.clone();\u001b[39m\n\u001b[31m          caches.open(CACHE).then(c => c.put(e.request, copy));\u001b[39m\n\u001b[31m        }\u001b[39m\n\u001b[31m        return resp;\u001b[39m\n\u001b[31m      }).catch(() => caches.match('/rentveh/'))\u001b[39m\n\u001b[31m    )\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\"'rentveh-v3'\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'rentveh-v5';\u001b[39m\n\u001b[31mconst ASSETS = ['/rentveh/', '/rentveh/index.html', '/rentveh/manifest.json',\u001b[39m\n\u001b[31m                '/shared/theme-v2.css', '/shared/safe-bottom.css'];·\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  if (e.request.method !== 'GET') return;\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db')) return;          // never cache API\u001b[39m\n\u001b[31m  if (url.pathname.endsWith('.mp4')) return;           // tutorial videos: range requests, too big for cache\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached =>\u001b[39m\n\u001b[31m      cached ||\u001b[39m\n\u001b[31m      fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m        if (resp.ok && url.origin === location.origin) {\u001b[39m\n\u001b[31m          const copy = resp.clone();\u001b[39m\n\u001b[31m          caches.open(CACHE).then(c => c.put(e.request, copy));\u001b[39m\n\u001b[31m        }\u001b[39m\n\u001b[31m        return resp;\u001b[39m\n\u001b[31m      }).catch(() => caches.match('/rentveh/'))\u001b[39m\n\u001b[31m    )\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/rentveh.spec.js:43:16",
                        "location": {
                          "file": "/var/www/360lm/tests/rentveh.spec.js",
                          "column": 16,
                          "line": 43
                        },
                        "snippet": "  41 |   test('SW cache version matches CACHE_VER in app', async ({ request }) => {\n  42 |     const sw = await (await request.get(`${BASE}sw.js`)).text();\n> 43 |     expect(sw).toContain(`'${SW_VER}'`);\n     |                ^\n  44 |     const html = await (await request.get(BASE)).text();\n  45 |     expect(html).toContain(`CACHE_VER = '${SW_VER}'`);\n  46 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/rentveh.spec.js",
                            "column": 16,
                            "line": 43
                          },
                          "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\"'rentveh-v3'\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'rentveh-v5';\u001b[39m\n\u001b[31mconst ASSETS = ['/rentveh/', '/rentveh/index.html', '/rentveh/manifest.json',\u001b[39m\n\u001b[31m                '/shared/theme-v2.css', '/shared/safe-bottom.css'];·\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  if (e.request.method !== 'GET') return;\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db')) return;          // never cache API\u001b[39m\n\u001b[31m  if (url.pathname.endsWith('.mp4')) return;           // tutorial videos: range requests, too big for cache\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached =>\u001b[39m\n\u001b[31m      cached ||\u001b[39m\n\u001b[31m      fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m        if (resp.ok && url.origin === location.origin) {\u001b[39m\n\u001b[31m          const copy = resp.clone();\u001b[39m\n\u001b[31m          caches.open(CACHE).then(c => c.put(e.request, copy));\u001b[39m\n\u001b[31m        }\u001b[39m\n\u001b[31m        return resp;\u001b[39m\n\u001b[31m      }).catch(() => caches.match('/rentveh/'))\u001b[39m\n\u001b[31m    )\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  41 |   test('SW cache version matches CACHE_VER in app', async ({ request }) => {\n  42 |     const sw = await (await request.get(`${BASE}sw.js`)).text();\n> 43 |     expect(sw).toContain(`'${SW_VER}'`);\n     |                ^\n  44 |     const html = await (await request.get(BASE)).text();\n  45 |     expect(html).toContain(`CACHE_VER = '${SW_VER}'`);\n  46 |   });\n    at /var/www/360lm/tests/rentveh.spec.js:43:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:20:25.177Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/rentveh-Rent-Vehicle-—-reg-70b35-on-matches-CACHE-VER-in-app-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/rentveh.spec.js",
                        "column": 16,
                        "line": 43
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-21389ab545418da2cf9e",
              "file": "rentveh.spec.js",
              "line": 41,
              "column": 3
            },
            {
              "title": "no session → redirects to hub with ?next=",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 84,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 804,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:26.097Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-244374cfbaeffa9fda8d",
              "file": "rentveh.spec.js",
              "line": 48,
              "column": 3
            },
            {
              "title": "with session → home renders; regular user has no TM chrome",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 84,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 463,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:27.089Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-61d90481869d72411d9d",
              "file": "rentveh.spec.js",
              "line": 54,
              "column": 3
            },
            {
              "title": "TM gets dual-mode segment + settings gear",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 84,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 511,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:27.580Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-81344888e84c89b671c4",
              "file": "rentveh.spec.js",
              "line": 63,
              "column": 3
            },
            {
              "title": "registered in hub.pwa_registry (ADR-016)",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 284,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 82,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:05.064Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-629efa131051dbac6720",
              "file": "rentveh.spec.js",
              "line": 32,
              "column": 3
            },
            {
              "title": "SW cache version matches CACHE_VER in app",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 284,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 44,
                      "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\"'rentveh-v3'\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'rentveh-v5';\u001b[39m\n\u001b[31mconst ASSETS = ['/rentveh/', '/rentveh/index.html', '/rentveh/manifest.json',\u001b[39m\n\u001b[31m                '/shared/theme-v2.css', '/shared/safe-bottom.css'];·\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  if (e.request.method !== 'GET') return;\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db')) return;          // never cache API\u001b[39m\n\u001b[31m  if (url.pathname.endsWith('.mp4')) return;           // tutorial videos: range requests, too big for cache\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached =>\u001b[39m\n\u001b[31m      cached ||\u001b[39m\n\u001b[31m      fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m        if (resp.ok && url.origin === location.origin) {\u001b[39m\n\u001b[31m          const copy = resp.clone();\u001b[39m\n\u001b[31m          caches.open(CACHE).then(c => c.put(e.request, copy));\u001b[39m\n\u001b[31m        }\u001b[39m\n\u001b[31m        return resp;\u001b[39m\n\u001b[31m      }).catch(() => caches.match('/rentveh/'))\u001b[39m\n\u001b[31m    )\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\"'rentveh-v3'\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'rentveh-v5';\u001b[39m\n\u001b[31mconst ASSETS = ['/rentveh/', '/rentveh/index.html', '/rentveh/manifest.json',\u001b[39m\n\u001b[31m                '/shared/theme-v2.css', '/shared/safe-bottom.css'];·\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  if (e.request.method !== 'GET') return;\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db')) return;          // never cache API\u001b[39m\n\u001b[31m  if (url.pathname.endsWith('.mp4')) return;           // tutorial videos: range requests, too big for cache\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached =>\u001b[39m\n\u001b[31m      cached ||\u001b[39m\n\u001b[31m      fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m        if (resp.ok && url.origin === location.origin) {\u001b[39m\n\u001b[31m          const copy = resp.clone();\u001b[39m\n\u001b[31m          caches.open(CACHE).then(c => c.put(e.request, copy));\u001b[39m\n\u001b[31m        }\u001b[39m\n\u001b[31m        return resp;\u001b[39m\n\u001b[31m      }).catch(() => caches.match('/rentveh/'))\u001b[39m\n\u001b[31m    )\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/rentveh.spec.js:43:16",
                        "location": {
                          "file": "/var/www/360lm/tests/rentveh.spec.js",
                          "column": 16,
                          "line": 43
                        },
                        "snippet": "  41 |   test('SW cache version matches CACHE_VER in app', async ({ request }) => {\n  42 |     const sw = await (await request.get(`${BASE}sw.js`)).text();\n> 43 |     expect(sw).toContain(`'${SW_VER}'`);\n     |                ^\n  44 |     const html = await (await request.get(BASE)).text();\n  45 |     expect(html).toContain(`CACHE_VER = '${SW_VER}'`);\n  46 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/rentveh.spec.js",
                            "column": 16,
                            "line": 43
                          },
                          "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\"'rentveh-v3'\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'rentveh-v5';\u001b[39m\n\u001b[31mconst ASSETS = ['/rentveh/', '/rentveh/index.html', '/rentveh/manifest.json',\u001b[39m\n\u001b[31m                '/shared/theme-v2.css', '/shared/safe-bottom.css'];·\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  if (e.request.method !== 'GET') return;\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db')) return;          // never cache API\u001b[39m\n\u001b[31m  if (url.pathname.endsWith('.mp4')) return;           // tutorial videos: range requests, too big for cache\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached =>\u001b[39m\n\u001b[31m      cached ||\u001b[39m\n\u001b[31m      fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m        if (resp.ok && url.origin === location.origin) {\u001b[39m\n\u001b[31m          const copy = resp.clone();\u001b[39m\n\u001b[31m          caches.open(CACHE).then(c => c.put(e.request, copy));\u001b[39m\n\u001b[31m        }\u001b[39m\n\u001b[31m        return resp;\u001b[39m\n\u001b[31m      }).catch(() => caches.match('/rentveh/'))\u001b[39m\n\u001b[31m    )\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  41 |   test('SW cache version matches CACHE_VER in app', async ({ request }) => {\n  42 |     const sw = await (await request.get(`${BASE}sw.js`)).text();\n> 43 |     expect(sw).toContain(`'${SW_VER}'`);\n     |                ^\n  44 |     const html = await (await request.get(BASE)).text();\n  45 |     expect(html).toContain(`CACHE_VER = '${SW_VER}'`);\n  46 |   });\n    at /var/www/360lm/tests/rentveh.spec.js:43:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:05.205Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/rentveh-Rent-Vehicle-—-reg-70b35-on-matches-CACHE-VER-in-app-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/rentveh.spec.js",
                        "column": 16,
                        "line": 43
                      }
                    },
                    {
                      "workerIndex": 285,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 75,
                      "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\"'rentveh-v3'\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'rentveh-v5';\u001b[39m\n\u001b[31mconst ASSETS = ['/rentveh/', '/rentveh/index.html', '/rentveh/manifest.json',\u001b[39m\n\u001b[31m                '/shared/theme-v2.css', '/shared/safe-bottom.css'];·\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  if (e.request.method !== 'GET') return;\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db')) return;          // never cache API\u001b[39m\n\u001b[31m  if (url.pathname.endsWith('.mp4')) return;           // tutorial videos: range requests, too big for cache\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached =>\u001b[39m\n\u001b[31m      cached ||\u001b[39m\n\u001b[31m      fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m        if (resp.ok && url.origin === location.origin) {\u001b[39m\n\u001b[31m          const copy = resp.clone();\u001b[39m\n\u001b[31m          caches.open(CACHE).then(c => c.put(e.request, copy));\u001b[39m\n\u001b[31m        }\u001b[39m\n\u001b[31m        return resp;\u001b[39m\n\u001b[31m      }).catch(() => caches.match('/rentveh/'))\u001b[39m\n\u001b[31m    )\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\"'rentveh-v3'\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'rentveh-v5';\u001b[39m\n\u001b[31mconst ASSETS = ['/rentveh/', '/rentveh/index.html', '/rentveh/manifest.json',\u001b[39m\n\u001b[31m                '/shared/theme-v2.css', '/shared/safe-bottom.css'];·\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  if (e.request.method !== 'GET') return;\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db')) return;          // never cache API\u001b[39m\n\u001b[31m  if (url.pathname.endsWith('.mp4')) return;           // tutorial videos: range requests, too big for cache\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached =>\u001b[39m\n\u001b[31m      cached ||\u001b[39m\n\u001b[31m      fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m        if (resp.ok && url.origin === location.origin) {\u001b[39m\n\u001b[31m          const copy = resp.clone();\u001b[39m\n\u001b[31m          caches.open(CACHE).then(c => c.put(e.request, copy));\u001b[39m\n\u001b[31m        }\u001b[39m\n\u001b[31m        return resp;\u001b[39m\n\u001b[31m      }).catch(() => caches.match('/rentveh/'))\u001b[39m\n\u001b[31m    )\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/rentveh.spec.js:43:16",
                        "location": {
                          "file": "/var/www/360lm/tests/rentveh.spec.js",
                          "column": 16,
                          "line": 43
                        },
                        "snippet": "  41 |   test('SW cache version matches CACHE_VER in app', async ({ request }) => {\n  42 |     const sw = await (await request.get(`${BASE}sw.js`)).text();\n> 43 |     expect(sw).toContain(`'${SW_VER}'`);\n     |                ^\n  44 |     const html = await (await request.get(BASE)).text();\n  45 |     expect(html).toContain(`CACHE_VER = '${SW_VER}'`);\n  46 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/rentveh.spec.js",
                            "column": 16,
                            "line": 43
                          },
                          "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\"'rentveh-v3'\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'rentveh-v5';\u001b[39m\n\u001b[31mconst ASSETS = ['/rentveh/', '/rentveh/index.html', '/rentveh/manifest.json',\u001b[39m\n\u001b[31m                '/shared/theme-v2.css', '/shared/safe-bottom.css'];·\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  if (e.request.method !== 'GET') return;\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db')) return;          // never cache API\u001b[39m\n\u001b[31m  if (url.pathname.endsWith('.mp4')) return;           // tutorial videos: range requests, too big for cache\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached =>\u001b[39m\n\u001b[31m      cached ||\u001b[39m\n\u001b[31m      fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m        if (resp.ok && url.origin === location.origin) {\u001b[39m\n\u001b[31m          const copy = resp.clone();\u001b[39m\n\u001b[31m          caches.open(CACHE).then(c => c.put(e.request, copy));\u001b[39m\n\u001b[31m        }\u001b[39m\n\u001b[31m        return resp;\u001b[39m\n\u001b[31m      }).catch(() => caches.match('/rentveh/'))\u001b[39m\n\u001b[31m    )\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  41 |   test('SW cache version matches CACHE_VER in app', async ({ request }) => {\n  42 |     const sw = await (await request.get(`${BASE}sw.js`)).text();\n> 43 |     expect(sw).toContain(`'${SW_VER}'`);\n     |                ^\n  44 |     const html = await (await request.get(BASE)).text();\n  45 |     expect(html).toContain(`CACHE_VER = '${SW_VER}'`);\n  46 |   });\n    at /var/www/360lm/tests/rentveh.spec.js:43:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:37:06.467Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/rentveh-Rent-Vehicle-—-reg-70b35-on-matches-CACHE-VER-in-app-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/rentveh.spec.js",
                        "column": 16,
                        "line": 43
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-fa90aa5a76440fc1d59c",
              "file": "rentveh.spec.js",
              "line": 41,
              "column": 3
            },
            {
              "title": "no session → redirects to hub with ?next=",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 286,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 650,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:07.417Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-7bacdb57c452b4f0ab80",
              "file": "rentveh.spec.js",
              "line": 48,
              "column": 3
            },
            {
              "title": "with session → home renders; regular user has no TM chrome",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 286,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 490,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:08.260Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-1b173c58aaf0c71cd499",
              "file": "rentveh.spec.js",
              "line": 54,
              "column": 3
            },
            {
              "title": "TM gets dual-mode segment + settings gear",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 286,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 622,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:08.770Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-314b8c56402d56ad989f",
              "file": "rentveh.spec.js",
              "line": 63,
              "column": 3
            }
          ]
        },
        {
          "title": "Rent Vehicle — tutorials (ADR-064/065)",
          "file": "rentveh.spec.js",
          "line": 73,
          "column": 6,
          "specs": [
            {
              "title": "screencast page serves with both language MP4s + view beacon",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 84,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 60,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:28.118Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-4b85182ea549149efab3",
              "file": "rentveh.spec.js",
              "line": 74,
              "column": 3
            },
            {
              "title": "scene guide JSON valid + every screenshot resolves",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 84,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 171,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:28.195Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-6979133bb9cf5874c90c",
              "file": "rentveh.spec.js",
              "line": 86,
              "column": 3
            },
            {
              "title": "both tutorials registered in learn catalog",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 84,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 14,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:28.383Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-60c345a7606a80dfa57c",
              "file": "rentveh.spec.js",
              "line": 100,
              "column": 3
            },
            {
              "title": "screencast page serves with both language MP4s + view beacon",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 286,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 73,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:09.418Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-3fea6cd30d9915cb6cb2",
              "file": "rentveh.spec.js",
              "line": 74,
              "column": 3
            },
            {
              "title": "scene guide JSON valid + every screenshot resolves",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 286,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 129,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:09.511Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-9d0bac8614ac81d98309",
              "file": "rentveh.spec.js",
              "line": 86,
              "column": 3
            },
            {
              "title": "both tutorials registered in learn catalog",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 286,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 14,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:09.653Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-fc37e2f8b2befcecaed4",
              "file": "rentveh.spec.js",
              "line": 100,
              "column": 3
            }
          ]
        },
        {
          "title": "Rent Vehicle — payment handoff to Fund Custodian",
          "file": "rentveh.spec.js",
          "line": 112,
          "column": 6,
          "specs": [
            {
              "title": "regular user (not TM/custodian) sees no Record Payment button",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 84,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 3069,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:28.412Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-1e4a1d82fc5b24fb6333",
              "file": "rentveh.spec.js",
              "line": 113,
              "column": 3
            },
            {
              "title": "TM/custodian: Record Payment → custodian transfer prefilled (party, amount, CTH, narration)",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 84,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 3394,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:31.502Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-96272164a948bd8e457d",
              "file": "rentveh.spec.js",
              "line": 122,
              "column": 3
            },
            {
              "title": "regular user (not TM/custodian) sees no Record Payment button",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 286,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 3127,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:09.682Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-4eaca7dcb6b1b1358ab5",
              "file": "rentveh.spec.js",
              "line": 113,
              "column": 3
            },
            {
              "title": "TM/custodian: Record Payment → custodian transfer prefilled (party, amount, CTH, narration)",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 286,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 3415,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:12.836Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-06afc0d23471ca2a2a43",
              "file": "rentveh.spec.js",
              "line": 122,
              "column": 3
            }
          ]
        },
        {
          "title": "Rent Vehicle — form & calculation",
          "file": "rentveh.spec.js",
          "line": 144,
          "column": 6,
          "specs": [
            {
              "title": "days rule: 26.5h with grace → 1 day + late-return flag",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 84,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 674,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:34.916Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-7742a47d2b380d2129a4",
              "file": "rentveh.spec.js",
              "line": 154,
              "column": 3
            },
            {
              "title": "full calculation: rent + fuel + toll + food − deductions = payable",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 84,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 763,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:35.655Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-1fe51e818bca76c35214",
              "file": "rentveh.spec.js",
              "line": 171,
              "column": 3
            },
            {
              "title": "submit → row lands in DB with payable amount",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 84,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 867,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:36.451Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-50658b83c0d3260aec24",
              "file": "rentveh.spec.js",
              "line": 193,
              "column": 3
            },
            {
              "title": "TM approval flow: team mode → approve → status approved",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 84,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 663,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:37.349Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-8ad395752dfe140948af",
              "file": "rentveh.spec.js",
              "line": 217,
              "column": 3
            },
            {
              "title": "empty submit shows validation toast",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 84,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 562,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:38.032Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-e33d8808ead9c2917330",
              "file": "rentveh.spec.js",
              "line": 232,
              "column": 3
            },
            {
              "title": "days rule: 26.5h with grace → 1 day + late-return flag",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 286,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 700,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:16.269Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-86cf35297a38b518f224",
              "file": "rentveh.spec.js",
              "line": 154,
              "column": 3
            },
            {
              "title": "full calculation: rent + fuel + toll + food − deductions = payable",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 286,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 862,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:17.023Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-6eb69b36af3b48587f11",
              "file": "rentveh.spec.js",
              "line": 171,
              "column": 3
            },
            {
              "title": "submit → row lands in DB with payable amount",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 286,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 812,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:17.911Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-49c356903b6295c6ea20",
              "file": "rentveh.spec.js",
              "line": 193,
              "column": 3
            },
            {
              "title": "TM approval flow: team mode → approve → status approved",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 286,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 707,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:18.758Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-1b045b1b6a8243aba1f1",
              "file": "rentveh.spec.js",
              "line": 217,
              "column": 3
            },
            {
              "title": "empty submit shows validation toast",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 286,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 613,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:19.492Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "61f16f2fd58ccb1dd4f3-ce2f1fcd6d336082ddeb",
              "file": "rentveh.spec.js",
              "line": 232,
              "column": 3
            }
          ]
        }
      ]
    },
    {
      "title": "sales_billing.spec.js",
      "file": "sales_billing.spec.js",
      "column": 0,
      "line": 0,
      "specs": [],
      "suites": [
        {
          "title": "Sales Billing — Smoke",
          "file": "sales_billing.spec.js",
          "line": 51,
          "column": 6,
          "specs": [
            {
              "title": "page returns 200",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 84,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 211,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:54:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 54
                        },
                        "snippet": "  52 |   test('page returns 200', async ({ page }) => {\n  53 |     const r = await page.goto(BASE_URL);\n> 54 |     expect(r?.status()).toBe(200);\n     |                         ^\n  55 |   });\n  56 |\n  57 |   test('SW version is current', async () => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 54
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n  52 |   test('page returns 200', async ({ page }) => {\n  53 |     const r = await page.goto(BASE_URL);\n> 54 |     expect(r?.status()).toBe(200);\n     |                         ^\n  55 |   });\n  56 |\n  57 |   test('SW version is current', async () => {\n    at /var/www/360lm/tests/sales_billing.spec.js:54:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:38.687Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billing-—-Smoke-page-returns-200-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billing-—-Smoke-page-returns-200-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 54
                      }
                    },
                    {
                      "workerIndex": 85,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 346,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:54:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 54
                        },
                        "snippet": "  52 |   test('page returns 200', async ({ page }) => {\n  53 |     const r = await page.goto(BASE_URL);\n> 54 |     expect(r?.status()).toBe(200);\n     |                         ^\n  55 |   });\n  56 |\n  57 |   test('SW version is current', async () => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 54
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n  52 |   test('page returns 200', async ({ page }) => {\n  53 |     const r = await page.goto(BASE_URL);\n> 54 |     expect(r?.status()).toBe(200);\n     |                         ^\n  55 |   });\n  56 |\n  57 |   test('SW version is current', async () => {\n    at /var/www/360lm/tests/sales_billing.spec.js:54:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:20:39.835Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billing-—-Smoke-page-returns-200-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billing-—-Smoke-page-returns-200-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 54
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-b2e1c3f63ccb67778f06",
              "file": "sales_billing.spec.js",
              "line": 52,
              "column": 3
            },
            {
              "title": "SW version is current",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 86,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 57,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:61:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 17,
                          "line": 61
                        },
                        "snippet": "  59 |     const r = await ctx.get(BASE_URL + 'sw.js');\n  60 |     const txt = await r.text();\n> 61 |     expect(txt).toMatch(/360sales-v\\d+/);\n     |                 ^\n  62 |     await ctx.dispose();\n  63 |   });\n  64 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 17,
                            "line": 61
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  59 |     const r = await ctx.get(BASE_URL + 'sw.js');\n  60 |     const txt = await r.text();\n> 61 |     expect(txt).toMatch(/360sales-v\\d+/);\n     |                 ^\n  62 |     await ctx.dispose();\n  63 |   });\n  64 |\n    at /var/www/360lm/tests/sales_billing.spec.js:61:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:41.282Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billing-—-Smoke-SW-version-is-current-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 17,
                        "line": 61
                      }
                    },
                    {
                      "workerIndex": 87,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 69,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:61:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 17,
                          "line": 61
                        },
                        "snippet": "  59 |     const r = await ctx.get(BASE_URL + 'sw.js');\n  60 |     const txt = await r.text();\n> 61 |     expect(txt).toMatch(/360sales-v\\d+/);\n     |                 ^\n  62 |     await ctx.dispose();\n  63 |   });\n  64 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 17,
                            "line": 61
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  59 |     const r = await ctx.get(BASE_URL + 'sw.js');\n  60 |     const txt = await r.text();\n> 61 |     expect(txt).toMatch(/360sales-v\\d+/);\n     |                 ^\n  62 |     await ctx.dispose();\n  63 |   });\n  64 |\n    at /var/www/360lm/tests/sales_billing.spec.js:61:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:20:42.301Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billing-—-Smoke-SW-version-is-current-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 17,
                        "line": 61
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-460cd72153ceac3f0c7f",
              "file": "sales_billing.spec.js",
              "line": 57,
              "column": 3
            },
            {
              "title": "HTML contains invoice + challan screens",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 88,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 64,
                      "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\"screen-invoice-form\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"screen-invoice-form\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:69:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 69
                        },
                        "snippet": "  67 |     const r = await ctx.get(BASE_URL);\n  68 |     const html = await r.text();\n> 69 |     expect(html).toContain('screen-invoice-form');\n     |                  ^\n  70 |     expect(html).toContain('screen-challan-form');\n  71 |     expect(html).toContain('modal-payment');\n  72 |     expect(html).toContain('buildTaxInvoiceHtml');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 69
                          },
                          "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\"screen-invoice-form\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  67 |     const r = await ctx.get(BASE_URL);\n  68 |     const html = await r.text();\n> 69 |     expect(html).toContain('screen-invoice-form');\n     |                  ^\n  70 |     expect(html).toContain('screen-challan-form');\n  71 |     expect(html).toContain('modal-payment');\n  72 |     expect(html).toContain('buildTaxInvoiceHtml');\n    at /var/www/360lm/tests/sales_billing.spec.js:69:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:43.244Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-3d778-ins-invoice-challan-screens-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 69
                      }
                    },
                    {
                      "workerIndex": 89,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 57,
                      "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\"screen-invoice-form\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"screen-invoice-form\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:69:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 69
                        },
                        "snippet": "  67 |     const r = await ctx.get(BASE_URL);\n  68 |     const html = await r.text();\n> 69 |     expect(html).toContain('screen-invoice-form');\n     |                  ^\n  70 |     expect(html).toContain('screen-challan-form');\n  71 |     expect(html).toContain('modal-payment');\n  72 |     expect(html).toContain('buildTaxInvoiceHtml');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 69
                          },
                          "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\"screen-invoice-form\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  67 |     const r = await ctx.get(BASE_URL);\n  68 |     const html = await r.text();\n> 69 |     expect(html).toContain('screen-invoice-form');\n     |                  ^\n  70 |     expect(html).toContain('screen-challan-form');\n  71 |     expect(html).toContain('modal-payment');\n  72 |     expect(html).toContain('buildTaxInvoiceHtml');\n    at /var/www/360lm/tests/sales_billing.spec.js:69:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:20:44.263Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-3d778-ins-invoice-challan-screens-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 69
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-f2cc72b9cc93f9eff3b5",
              "file": "sales_billing.spec.js",
              "line": 65,
              "column": 3
            },
            {
              "title": "page returns 200",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 286,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 199,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:54:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 54
                        },
                        "snippet": "  52 |   test('page returns 200', async ({ page }) => {\n  53 |     const r = await page.goto(BASE_URL);\n> 54 |     expect(r?.status()).toBe(200);\n     |                         ^\n  55 |   });\n  56 |\n  57 |   test('SW version is current', async () => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 54
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n  52 |   test('page returns 200', async ({ page }) => {\n  53 |     const r = await page.goto(BASE_URL);\n> 54 |     expect(r?.status()).toBe(200);\n     |                         ^\n  55 |   });\n  56 |\n  57 |   test('SW version is current', async () => {\n    at /var/www/360lm/tests/sales_billing.spec.js:54:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:20.190Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billing-—-Smoke-page-returns-200-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billing-—-Smoke-page-returns-200-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 54
                      }
                    },
                    {
                      "workerIndex": 287,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 291,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:54:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 54
                        },
                        "snippet": "  52 |   test('page returns 200', async ({ page }) => {\n  53 |     const r = await page.goto(BASE_URL);\n> 54 |     expect(r?.status()).toBe(200);\n     |                         ^\n  55 |   });\n  56 |\n  57 |   test('SW version is current', async () => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 54
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n  52 |   test('page returns 200', async ({ page }) => {\n  53 |     const r = await page.goto(BASE_URL);\n> 54 |     expect(r?.status()).toBe(200);\n     |                         ^\n  55 |   });\n  56 |\n  57 |   test('SW version is current', async () => {\n    at /var/www/360lm/tests/sales_billing.spec.js:54:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:37:21.266Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billing-—-Smoke-page-returns-200-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billing-—-Smoke-page-returns-200-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 54
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-7bdf803ebcfe73b92882",
              "file": "sales_billing.spec.js",
              "line": 52,
              "column": 3
            },
            {
              "title": "SW version is current",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 288,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 60,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:61:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 17,
                          "line": 61
                        },
                        "snippet": "  59 |     const r = await ctx.get(BASE_URL + 'sw.js');\n  60 |     const txt = await r.text();\n> 61 |     expect(txt).toMatch(/360sales-v\\d+/);\n     |                 ^\n  62 |     await ctx.dispose();\n  63 |   });\n  64 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 17,
                            "line": 61
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  59 |     const r = await ctx.get(BASE_URL + 'sw.js');\n  60 |     const txt = await r.text();\n> 61 |     expect(txt).toMatch(/360sales-v\\d+/);\n     |                 ^\n  62 |     await ctx.dispose();\n  63 |   });\n  64 |\n    at /var/www/360lm/tests/sales_billing.spec.js:61:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:22.616Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billing-—-Smoke-SW-version-is-current-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 17,
                        "line": 61
                      }
                    },
                    {
                      "workerIndex": 289,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 51,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:61:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 17,
                          "line": 61
                        },
                        "snippet": "  59 |     const r = await ctx.get(BASE_URL + 'sw.js');\n  60 |     const txt = await r.text();\n> 61 |     expect(txt).toMatch(/360sales-v\\d+/);\n     |                 ^\n  62 |     await ctx.dispose();\n  63 |   });\n  64 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 17,
                            "line": 61
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  59 |     const r = await ctx.get(BASE_URL + 'sw.js');\n  60 |     const txt = await r.text();\n> 61 |     expect(txt).toMatch(/360sales-v\\d+/);\n     |                 ^\n  62 |     await ctx.dispose();\n  63 |   });\n  64 |\n    at /var/www/360lm/tests/sales_billing.spec.js:61:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:37:23.536Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billing-—-Smoke-SW-version-is-current-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 17,
                        "line": 61
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-487a12261d499eaa8af3",
              "file": "sales_billing.spec.js",
              "line": 57,
              "column": 3
            },
            {
              "title": "HTML contains invoice + challan screens",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 290,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 52,
                      "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\"screen-invoice-form\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"screen-invoice-form\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:69:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 69
                        },
                        "snippet": "  67 |     const r = await ctx.get(BASE_URL);\n  68 |     const html = await r.text();\n> 69 |     expect(html).toContain('screen-invoice-form');\n     |                  ^\n  70 |     expect(html).toContain('screen-challan-form');\n  71 |     expect(html).toContain('modal-payment');\n  72 |     expect(html).toContain('buildTaxInvoiceHtml');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 69
                          },
                          "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\"screen-invoice-form\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  67 |     const r = await ctx.get(BASE_URL);\n  68 |     const html = await r.text();\n> 69 |     expect(html).toContain('screen-invoice-form');\n     |                  ^\n  70 |     expect(html).toContain('screen-challan-form');\n  71 |     expect(html).toContain('modal-payment');\n  72 |     expect(html).toContain('buildTaxInvoiceHtml');\n    at /var/www/360lm/tests/sales_billing.spec.js:69:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:24.510Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-3d778-ins-invoice-challan-screens-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 69
                      }
                    },
                    {
                      "workerIndex": 291,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 52,
                      "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\"screen-invoice-form\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"screen-invoice-form\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:69:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 69
                        },
                        "snippet": "  67 |     const r = await ctx.get(BASE_URL);\n  68 |     const html = await r.text();\n> 69 |     expect(html).toContain('screen-invoice-form');\n     |                  ^\n  70 |     expect(html).toContain('screen-challan-form');\n  71 |     expect(html).toContain('modal-payment');\n  72 |     expect(html).toContain('buildTaxInvoiceHtml');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 69
                          },
                          "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\"screen-invoice-form\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  67 |     const r = await ctx.get(BASE_URL);\n  68 |     const html = await r.text();\n> 69 |     expect(html).toContain('screen-invoice-form');\n     |                  ^\n  70 |     expect(html).toContain('screen-challan-form');\n  71 |     expect(html).toContain('modal-payment');\n  72 |     expect(html).toContain('buildTaxInvoiceHtml');\n    at /var/www/360lm/tests/sales_billing.spec.js:69:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:37:25.333Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-3d778-ins-invoice-challan-screens-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 69
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-01a33095bab19da9e4b5",
              "file": "sales_billing.spec.js",
              "line": 65,
              "column": 3
            }
          ]
        },
        {
          "title": "Sales Billing — Stage A+B: Offer schema",
          "file": "sales_billing.spec.js",
          "line": 81,
          "column": 6,
          "specs": [
            {
              "title": "offer_lines has hsn_sac + line_type columns",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 90,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 71,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m4\u001b[39m\nReceived:    \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m4\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:84:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 84
                        },
                        "snippet": "  82 |   test('offer_lines has hsn_sac + line_type columns', async () => {\n  83 |     const rows = await dbGet('/offer_lines?offer_id=eq.bt-off-3&select=element,hsn_sac,line_type&order=sr_no');\n> 84 |     expect(rows.length).toBeGreaterThanOrEqual(4);\n     |                         ^\n  85 |     const svc = rows.find(r => r.line_type === 'service');\n  86 |     const mat = rows.find(r => r.line_type === 'material');\n  87 |     expect(svc).toBeTruthy();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 84
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m4\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n\n  82 |   test('offer_lines has hsn_sac + line_type columns', async () => {\n  83 |     const rows = await dbGet('/offer_lines?offer_id=eq.bt-off-3&select=element,hsn_sac,line_type&order=sr_no');\n> 84 |     expect(rows.length).toBeGreaterThanOrEqual(4);\n     |                         ^\n  85 |     const svc = rows.find(r => r.line_type === 'service');\n  86 |     const mat = rows.find(r => r.line_type === 'material');\n  87 |     expect(svc).toBeTruthy();\n    at /var/www/360lm/tests/sales_billing.spec.js:84:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:45.258Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-876eb-s-hsn-sac-line-type-columns-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 84
                      }
                    },
                    {
                      "workerIndex": 91,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 62,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m4\u001b[39m\nReceived:    \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m4\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:84:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 84
                        },
                        "snippet": "  82 |   test('offer_lines has hsn_sac + line_type columns', async () => {\n  83 |     const rows = await dbGet('/offer_lines?offer_id=eq.bt-off-3&select=element,hsn_sac,line_type&order=sr_no');\n> 84 |     expect(rows.length).toBeGreaterThanOrEqual(4);\n     |                         ^\n  85 |     const svc = rows.find(r => r.line_type === 'service');\n  86 |     const mat = rows.find(r => r.line_type === 'material');\n  87 |     expect(svc).toBeTruthy();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 84
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m4\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n\n  82 |   test('offer_lines has hsn_sac + line_type columns', async () => {\n  83 |     const rows = await dbGet('/offer_lines?offer_id=eq.bt-off-3&select=element,hsn_sac,line_type&order=sr_no');\n> 84 |     expect(rows.length).toBeGreaterThanOrEqual(4);\n     |                         ^\n  85 |     const svc = rows.find(r => r.line_type === 'service');\n  86 |     const mat = rows.find(r => r.line_type === 'material');\n  87 |     expect(svc).toBeTruthy();\n    at /var/www/360lm/tests/sales_billing.spec.js:84:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:20:46.181Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-876eb-s-hsn-sac-line-type-columns-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 84
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-c73a5c1c1d16a7cb20a3",
              "file": "sales_billing.spec.js",
              "line": 82,
              "column": 3
            },
            {
              "title": "offer_lines.amount is generated (rate*qty)",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 92,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 61,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:47.132Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-48a092d4a1fd6b430390",
              "file": "sales_billing.spec.js",
              "line": 93,
              "column": 3
            },
            {
              "title": "accepted offer has po_number + po_date + po_amount",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 92,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 22,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'status')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'status')\n    at /var/www/360lm/tests/sales_billing.spec.js:104:14",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 14,
                          "line": 104
                        },
                        "snippet": "  102 |     const rows = await dbGet('/offers?offer_id=eq.bt-off-3&select=status,po_number,po_date,po_amount,accepted_at');\n  103 |     const o = rows[0];\n> 104 |     expect(o.status).toBe('accepted');\n      |              ^\n  105 |     expect(o.po_number).toBe('PO/VERVE/2025-26/047');\n  106 |     expect(o.po_date).toBe('2026-06-01');\n  107 |     expect(Number(o.po_amount)).toBe(850000);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 14,
                            "line": 104
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'status')\n\n  102 |     const rows = await dbGet('/offers?offer_id=eq.bt-off-3&select=status,po_number,po_date,po_amount,accepted_at');\n  103 |     const o = rows[0];\n> 104 |     expect(o.status).toBe('accepted');\n      |              ^\n  105 |     expect(o.po_number).toBe('PO/VERVE/2025-26/047');\n  106 |     expect(o.po_date).toBe('2026-06-01');\n  107 |     expect(Number(o.po_amount)).toBe(850000);\n    at /var/www/360lm/tests/sales_billing.spec.js:104:14"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:47.239Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-8e992-po-number-po-date-po-amount-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 14,
                        "line": 104
                      }
                    },
                    {
                      "workerIndex": 93,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 63,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'status')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'status')\n    at /var/www/360lm/tests/sales_billing.spec.js:104:14",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 14,
                          "line": 104
                        },
                        "snippet": "  102 |     const rows = await dbGet('/offers?offer_id=eq.bt-off-3&select=status,po_number,po_date,po_amount,accepted_at');\n  103 |     const o = rows[0];\n> 104 |     expect(o.status).toBe('accepted');\n      |              ^\n  105 |     expect(o.po_number).toBe('PO/VERVE/2025-26/047');\n  106 |     expect(o.po_date).toBe('2026-06-01');\n  107 |     expect(Number(o.po_amount)).toBe(850000);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 14,
                            "line": 104
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'status')\n\n  102 |     const rows = await dbGet('/offers?offer_id=eq.bt-off-3&select=status,po_number,po_date,po_amount,accepted_at');\n  103 |     const o = rows[0];\n> 104 |     expect(o.status).toBe('accepted');\n      |              ^\n  105 |     expect(o.po_number).toBe('PO/VERVE/2025-26/047');\n  106 |     expect(o.po_date).toBe('2026-06-01');\n  107 |     expect(Number(o.po_amount)).toBe(850000);\n    at /var/www/360lm/tests/sales_billing.spec.js:104:14"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:20:48.193Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-8e992-po-number-po-date-po-amount-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 14,
                        "line": 104
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-f3faf960e2a800ec43e0",
              "file": "sales_billing.spec.js",
              "line": 101,
              "column": 3
            },
            {
              "title": "HTML form has po_number + po_date + po_amount fields",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 94,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 83,
                      "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\"id=\\\"off-po-number\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"off-po-number\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:114:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 114
                        },
                        "snippet": "  112 |     const ctx = await request.newContext();\n  113 |     const html = await (await ctx.get(BASE_URL)).text();\n> 114 |     expect(html).toContain('id=\"off-po-number\"');\n      |                  ^\n  115 |     expect(html).toContain('id=\"off-po-date\"');\n  116 |     expect(html).toContain('id=\"off-po-amount\"');\n  117 |     await ctx.dispose();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 114
                          },
                          "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\"id=\\\"off-po-number\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  112 |     const ctx = await request.newContext();\n  113 |     const html = await (await ctx.get(BASE_URL)).text();\n> 114 |     expect(html).toContain('id=\"off-po-number\"');\n      |                  ^\n  115 |     expect(html).toContain('id=\"off-po-date\"');\n  116 |     expect(html).toContain('id=\"off-po-amount\"');\n  117 |     await ctx.dispose();\n    at /var/www/360lm/tests/sales_billing.spec.js:114:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:49.140Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-db99b-er-po-date-po-amount-fields-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 114
                      }
                    },
                    {
                      "workerIndex": 95,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 72,
                      "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\"id=\\\"off-po-number\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"off-po-number\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:114:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 114
                        },
                        "snippet": "  112 |     const ctx = await request.newContext();\n  113 |     const html = await (await ctx.get(BASE_URL)).text();\n> 114 |     expect(html).toContain('id=\"off-po-number\"');\n      |                  ^\n  115 |     expect(html).toContain('id=\"off-po-date\"');\n  116 |     expect(html).toContain('id=\"off-po-amount\"');\n  117 |     await ctx.dispose();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 114
                          },
                          "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\"id=\\\"off-po-number\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  112 |     const ctx = await request.newContext();\n  113 |     const html = await (await ctx.get(BASE_URL)).text();\n> 114 |     expect(html).toContain('id=\"off-po-number\"');\n      |                  ^\n  115 |     expect(html).toContain('id=\"off-po-date\"');\n  116 |     expect(html).toContain('id=\"off-po-amount\"');\n  117 |     await ctx.dispose();\n    at /var/www/360lm/tests/sales_billing.spec.js:114:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:20:50.207Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-db99b-er-po-date-po-amount-fields-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 114
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-219f3bfb2a6274531e36",
              "file": "sales_billing.spec.js",
              "line": 111,
              "column": 3
            },
            {
              "title": "company select visible on offer form (not just hidden input)",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 96,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 57,
                      "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\"id=\\\"off-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"off-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:123:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 123
                        },
                        "snippet": "  121 |     const ctx = await request.newContext();\n  122 |     const html = await (await ctx.get(BASE_URL)).text();\n> 123 |     expect(html).toContain('id=\"off-company-select\"');\n      |                  ^\n  124 |     await ctx.dispose();\n  125 |   });\n  126 | });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 123
                          },
                          "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\"id=\\\"off-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  121 |     const ctx = await request.newContext();\n  122 |     const html = await (await ctx.get(BASE_URL)).text();\n> 123 |     expect(html).toContain('id=\"off-company-select\"');\n      |                  ^\n  124 |     await ctx.dispose();\n  125 |   });\n  126 | });\n    at /var/www/360lm/tests/sales_billing.spec.js:123:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:51.334Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-15035-form-not-just-hidden-input--android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 123
                      }
                    },
                    {
                      "workerIndex": 97,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 72,
                      "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\"id=\\\"off-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"off-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:123:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 123
                        },
                        "snippet": "  121 |     const ctx = await request.newContext();\n  122 |     const html = await (await ctx.get(BASE_URL)).text();\n> 123 |     expect(html).toContain('id=\"off-company-select\"');\n      |                  ^\n  124 |     await ctx.dispose();\n  125 |   });\n  126 | });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 123
                          },
                          "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\"id=\\\"off-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  121 |     const ctx = await request.newContext();\n  122 |     const html = await (await ctx.get(BASE_URL)).text();\n> 123 |     expect(html).toContain('id=\"off-company-select\"');\n      |                  ^\n  124 |     await ctx.dispose();\n  125 |   });\n  126 | });\n    at /var/www/360lm/tests/sales_billing.spec.js:123:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:20:52.406Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-15035-form-not-just-hidden-input--android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 123
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-8f7fe54045c9943e6182",
              "file": "sales_billing.spec.js",
              "line": 120,
              "column": 3
            },
            {
              "title": "offer_lines has hsn_sac + line_type columns",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 292,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 70,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m4\u001b[39m\nReceived:    \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m4\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:84:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 84
                        },
                        "snippet": "  82 |   test('offer_lines has hsn_sac + line_type columns', async () => {\n  83 |     const rows = await dbGet('/offer_lines?offer_id=eq.bt-off-3&select=element,hsn_sac,line_type&order=sr_no');\n> 84 |     expect(rows.length).toBeGreaterThanOrEqual(4);\n     |                         ^\n  85 |     const svc = rows.find(r => r.line_type === 'service');\n  86 |     const mat = rows.find(r => r.line_type === 'material');\n  87 |     expect(svc).toBeTruthy();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 84
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m4\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n\n  82 |   test('offer_lines has hsn_sac + line_type columns', async () => {\n  83 |     const rows = await dbGet('/offer_lines?offer_id=eq.bt-off-3&select=element,hsn_sac,line_type&order=sr_no');\n> 84 |     expect(rows.length).toBeGreaterThanOrEqual(4);\n     |                         ^\n  85 |     const svc = rows.find(r => r.line_type === 'service');\n  86 |     const mat = rows.find(r => r.line_type === 'material');\n  87 |     expect(svc).toBeTruthy();\n    at /var/www/360lm/tests/sales_billing.spec.js:84:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:26.399Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-876eb-s-hsn-sac-line-type-columns-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 84
                      }
                    },
                    {
                      "workerIndex": 293,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 67,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m4\u001b[39m\nReceived:    \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m4\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:84:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 84
                        },
                        "snippet": "  82 |   test('offer_lines has hsn_sac + line_type columns', async () => {\n  83 |     const rows = await dbGet('/offer_lines?offer_id=eq.bt-off-3&select=element,hsn_sac,line_type&order=sr_no');\n> 84 |     expect(rows.length).toBeGreaterThanOrEqual(4);\n     |                         ^\n  85 |     const svc = rows.find(r => r.line_type === 'service');\n  86 |     const mat = rows.find(r => r.line_type === 'material');\n  87 |     expect(svc).toBeTruthy();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 84
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m4\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n\n  82 |   test('offer_lines has hsn_sac + line_type columns', async () => {\n  83 |     const rows = await dbGet('/offer_lines?offer_id=eq.bt-off-3&select=element,hsn_sac,line_type&order=sr_no');\n> 84 |     expect(rows.length).toBeGreaterThanOrEqual(4);\n     |                         ^\n  85 |     const svc = rows.find(r => r.line_type === 'service');\n  86 |     const mat = rows.find(r => r.line_type === 'material');\n  87 |     expect(svc).toBeTruthy();\n    at /var/www/360lm/tests/sales_billing.spec.js:84:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:37:27.328Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-876eb-s-hsn-sac-line-type-columns-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 84
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-89c28f86915253fc6540",
              "file": "sales_billing.spec.js",
              "line": 82,
              "column": 3
            },
            {
              "title": "offer_lines.amount is generated (rate*qty)",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 294,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 65,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:28.269Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-ba02c85258c2ca998846",
              "file": "sales_billing.spec.js",
              "line": 93,
              "column": 3
            },
            {
              "title": "accepted offer has po_number + po_date + po_amount",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 294,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 21,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'status')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'status')\n    at /var/www/360lm/tests/sales_billing.spec.js:104:14",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 14,
                          "line": 104
                        },
                        "snippet": "  102 |     const rows = await dbGet('/offers?offer_id=eq.bt-off-3&select=status,po_number,po_date,po_amount,accepted_at');\n  103 |     const o = rows[0];\n> 104 |     expect(o.status).toBe('accepted');\n      |              ^\n  105 |     expect(o.po_number).toBe('PO/VERVE/2025-26/047');\n  106 |     expect(o.po_date).toBe('2026-06-01');\n  107 |     expect(Number(o.po_amount)).toBe(850000);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 14,
                            "line": 104
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'status')\n\n  102 |     const rows = await dbGet('/offers?offer_id=eq.bt-off-3&select=status,po_number,po_date,po_amount,accepted_at');\n  103 |     const o = rows[0];\n> 104 |     expect(o.status).toBe('accepted');\n      |              ^\n  105 |     expect(o.po_number).toBe('PO/VERVE/2025-26/047');\n  106 |     expect(o.po_date).toBe('2026-06-01');\n  107 |     expect(Number(o.po_amount)).toBe(850000);\n    at /var/www/360lm/tests/sales_billing.spec.js:104:14"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:28.393Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-8e992-po-number-po-date-po-amount-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 14,
                        "line": 104
                      }
                    },
                    {
                      "workerIndex": 295,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 83,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'status')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'status')\n    at /var/www/360lm/tests/sales_billing.spec.js:104:14",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 14,
                          "line": 104
                        },
                        "snippet": "  102 |     const rows = await dbGet('/offers?offer_id=eq.bt-off-3&select=status,po_number,po_date,po_amount,accepted_at');\n  103 |     const o = rows[0];\n> 104 |     expect(o.status).toBe('accepted');\n      |              ^\n  105 |     expect(o.po_number).toBe('PO/VERVE/2025-26/047');\n  106 |     expect(o.po_date).toBe('2026-06-01');\n  107 |     expect(Number(o.po_amount)).toBe(850000);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 14,
                            "line": 104
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'status')\n\n  102 |     const rows = await dbGet('/offers?offer_id=eq.bt-off-3&select=status,po_number,po_date,po_amount,accepted_at');\n  103 |     const o = rows[0];\n> 104 |     expect(o.status).toBe('accepted');\n      |              ^\n  105 |     expect(o.po_number).toBe('PO/VERVE/2025-26/047');\n  106 |     expect(o.po_date).toBe('2026-06-01');\n  107 |     expect(Number(o.po_amount)).toBe(850000);\n    at /var/www/360lm/tests/sales_billing.spec.js:104:14"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:37:29.329Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-8e992-po-number-po-date-po-amount-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 14,
                        "line": 104
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-0e753758df5f00116801",
              "file": "sales_billing.spec.js",
              "line": 101,
              "column": 3
            },
            {
              "title": "HTML form has po_number + po_date + po_amount fields",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 296,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 62,
                      "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\"id=\\\"off-po-number\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"off-po-number\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:114:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 114
                        },
                        "snippet": "  112 |     const ctx = await request.newContext();\n  113 |     const html = await (await ctx.get(BASE_URL)).text();\n> 114 |     expect(html).toContain('id=\"off-po-number\"');\n      |                  ^\n  115 |     expect(html).toContain('id=\"off-po-date\"');\n  116 |     expect(html).toContain('id=\"off-po-amount\"');\n  117 |     await ctx.dispose();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 114
                          },
                          "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\"id=\\\"off-po-number\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  112 |     const ctx = await request.newContext();\n  113 |     const html = await (await ctx.get(BASE_URL)).text();\n> 114 |     expect(html).toContain('id=\"off-po-number\"');\n      |                  ^\n  115 |     expect(html).toContain('id=\"off-po-date\"');\n  116 |     expect(html).toContain('id=\"off-po-amount\"');\n  117 |     await ctx.dispose();\n    at /var/www/360lm/tests/sales_billing.spec.js:114:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:30.383Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-db99b-er-po-date-po-amount-fields-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 114
                      }
                    },
                    {
                      "workerIndex": 297,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 58,
                      "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\"id=\\\"off-po-number\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"off-po-number\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:114:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 114
                        },
                        "snippet": "  112 |     const ctx = await request.newContext();\n  113 |     const html = await (await ctx.get(BASE_URL)).text();\n> 114 |     expect(html).toContain('id=\"off-po-number\"');\n      |                  ^\n  115 |     expect(html).toContain('id=\"off-po-date\"');\n  116 |     expect(html).toContain('id=\"off-po-amount\"');\n  117 |     await ctx.dispose();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 114
                          },
                          "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\"id=\\\"off-po-number\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  112 |     const ctx = await request.newContext();\n  113 |     const html = await (await ctx.get(BASE_URL)).text();\n> 114 |     expect(html).toContain('id=\"off-po-number\"');\n      |                  ^\n  115 |     expect(html).toContain('id=\"off-po-date\"');\n  116 |     expect(html).toContain('id=\"off-po-amount\"');\n  117 |     await ctx.dispose();\n    at /var/www/360lm/tests/sales_billing.spec.js:114:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:37:31.340Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-db99b-er-po-date-po-amount-fields-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 114
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-3862404d1881dd50a29c",
              "file": "sales_billing.spec.js",
              "line": 111,
              "column": 3
            },
            {
              "title": "company select visible on offer form (not just hidden input)",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 298,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 78,
                      "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\"id=\\\"off-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"off-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:123:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 123
                        },
                        "snippet": "  121 |     const ctx = await request.newContext();\n  122 |     const html = await (await ctx.get(BASE_URL)).text();\n> 123 |     expect(html).toContain('id=\"off-company-select\"');\n      |                  ^\n  124 |     await ctx.dispose();\n  125 |   });\n  126 | });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 123
                          },
                          "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\"id=\\\"off-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  121 |     const ctx = await request.newContext();\n  122 |     const html = await (await ctx.get(BASE_URL)).text();\n> 123 |     expect(html).toContain('id=\"off-company-select\"');\n      |                  ^\n  124 |     await ctx.dispose();\n  125 |   });\n  126 | });\n    at /var/www/360lm/tests/sales_billing.spec.js:123:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:32.385Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-15035-form-not-just-hidden-input--desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 123
                      }
                    },
                    {
                      "workerIndex": 299,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 66,
                      "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\"id=\\\"off-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"off-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:123:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 123
                        },
                        "snippet": "  121 |     const ctx = await request.newContext();\n  122 |     const html = await (await ctx.get(BASE_URL)).text();\n> 123 |     expect(html).toContain('id=\"off-company-select\"');\n      |                  ^\n  124 |     await ctx.dispose();\n  125 |   });\n  126 | });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 123
                          },
                          "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\"id=\\\"off-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  121 |     const ctx = await request.newContext();\n  122 |     const html = await (await ctx.get(BASE_URL)).text();\n> 123 |     expect(html).toContain('id=\"off-company-select\"');\n      |                  ^\n  124 |     await ctx.dispose();\n  125 |   });\n  126 | });\n    at /var/www/360lm/tests/sales_billing.spec.js:123:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:37:33.399Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-15035-form-not-just-hidden-input--desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 123
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-a607723350d4f6e376e0",
              "file": "sales_billing.spec.js",
              "line": 120,
              "column": 3
            }
          ]
        },
        {
          "title": "Sales Billing — Stage E: Invoices",
          "file": "sales_billing.spec.js",
          "line": 131,
          "column": 6,
          "specs": [
            {
              "title": "three test invoices exist with correct statuses",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 98,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 78,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:134:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 134
                        },
                        "snippet": "  132 |   test('three test invoices exist with correct statuses', async () => {\n  133 |     const rows = await dbGet('/invoices?invoice_id=in.(bt-inv-1,bt-inv-2,bt-inv-3)&select=invoice_id,invoice_no,status,company,gst_type&order=invoice_id');\n> 134 |     expect(rows.length).toBe(3);\n      |                         ^\n  135 |     const byId = Object.fromEntries(rows.map(r => [r.invoice_id, r]));\n  136 |     expect(byId['bt-inv-1'].status).toBe('draft');\n  137 |     expect(byId['bt-inv-2'].status).toBe('issued');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 134
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  132 |   test('three test invoices exist with correct statuses', async () => {\n  133 |     const rows = await dbGet('/invoices?invoice_id=in.(bt-inv-1,bt-inv-2,bt-inv-3)&select=invoice_id,invoice_no,status,company,gst_type&order=invoice_id');\n> 134 |     expect(rows.length).toBe(3);\n      |                         ^\n  135 |     const byId = Object.fromEntries(rows.map(r => [r.invoice_id, r]));\n  136 |     expect(byId['bt-inv-1'].status).toBe('draft');\n  137 |     expect(byId['bt-inv-2'].status).toBe('issued');\n    at /var/www/360lm/tests/sales_billing.spec.js:134:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:53.722Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-d46dc-exist-with-correct-statuses-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 134
                      }
                    },
                    {
                      "workerIndex": 99,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 77,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:134:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 134
                        },
                        "snippet": "  132 |   test('three test invoices exist with correct statuses', async () => {\n  133 |     const rows = await dbGet('/invoices?invoice_id=in.(bt-inv-1,bt-inv-2,bt-inv-3)&select=invoice_id,invoice_no,status,company,gst_type&order=invoice_id');\n> 134 |     expect(rows.length).toBe(3);\n      |                         ^\n  135 |     const byId = Object.fromEntries(rows.map(r => [r.invoice_id, r]));\n  136 |     expect(byId['bt-inv-1'].status).toBe('draft');\n  137 |     expect(byId['bt-inv-2'].status).toBe('issued');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 134
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  132 |   test('three test invoices exist with correct statuses', async () => {\n  133 |     const rows = await dbGet('/invoices?invoice_id=in.(bt-inv-1,bt-inv-2,bt-inv-3)&select=invoice_id,invoice_no,status,company,gst_type&order=invoice_id');\n> 134 |     expect(rows.length).toBe(3);\n      |                         ^\n  135 |     const byId = Object.fromEntries(rows.map(r => [r.invoice_id, r]));\n  136 |     expect(byId['bt-inv-1'].status).toBe('draft');\n  137 |     expect(byId['bt-inv-2'].status).toBe('issued');\n    at /var/www/360lm/tests/sales_billing.spec.js:134:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:20:54.825Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-d46dc-exist-with-correct-statuses-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 134
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-5e01ca4365b0dc64c89f",
              "file": "sales_billing.spec.js",
              "line": 132,
              "column": 3
            },
            {
              "title": "invoice_lines have hsn_sac + amount GENERATED correctly",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 100,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 66,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:145:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 145
                        },
                        "snippet": "  143 |   test('invoice_lines have hsn_sac + amount GENERATED correctly', async () => {\n  144 |     const rows = await dbGet('/invoice_lines?invoice_id=eq.bt-inv-2&select=element,rate,qty,amount,hsn_sac,line_type&order=sr_no');\n> 145 |     expect(rows.length).toBe(2);\n      |                         ^\n  146 |     rows.forEach(r => {\n  147 |       expect(Number(r.amount)).toBeCloseTo(Number(r.rate) * Number(r.qty), 1);\n  148 |       expect(r.hsn_sac).toBeTruthy();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 145
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  143 |   test('invoice_lines have hsn_sac + amount GENERATED correctly', async () => {\n  144 |     const rows = await dbGet('/invoice_lines?invoice_id=eq.bt-inv-2&select=element,rate,qty,amount,hsn_sac,line_type&order=sr_no');\n> 145 |     expect(rows.length).toBe(2);\n      |                         ^\n  146 |     rows.forEach(r => {\n  147 |       expect(Number(r.amount)).toBeCloseTo(Number(r.rate) * Number(r.qty), 1);\n  148 |       expect(r.hsn_sac).toBeTruthy();\n    at /var/www/360lm/tests/sales_billing.spec.js:145:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:55.798Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-63eb2--amount-GENERATED-correctly-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 145
                      }
                    },
                    {
                      "workerIndex": 101,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 76,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:145:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 145
                        },
                        "snippet": "  143 |   test('invoice_lines have hsn_sac + amount GENERATED correctly', async () => {\n  144 |     const rows = await dbGet('/invoice_lines?invoice_id=eq.bt-inv-2&select=element,rate,qty,amount,hsn_sac,line_type&order=sr_no');\n> 145 |     expect(rows.length).toBe(2);\n      |                         ^\n  146 |     rows.forEach(r => {\n  147 |       expect(Number(r.amount)).toBeCloseTo(Number(r.rate) * Number(r.qty), 1);\n  148 |       expect(r.hsn_sac).toBeTruthy();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 145
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  143 |   test('invoice_lines have hsn_sac + amount GENERATED correctly', async () => {\n  144 |     const rows = await dbGet('/invoice_lines?invoice_id=eq.bt-inv-2&select=element,rate,qty,amount,hsn_sac,line_type&order=sr_no');\n> 145 |     expect(rows.length).toBe(2);\n      |                         ^\n  146 |     rows.forEach(r => {\n  147 |       expect(Number(r.amount)).toBeCloseTo(Number(r.rate) * Number(r.qty), 1);\n  148 |       expect(r.hsn_sac).toBeTruthy();\n    at /var/www/360lm/tests/sales_billing.spec.js:145:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:20:56.739Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-63eb2--amount-GENERATED-correctly-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 145
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-492f2479ee1ea452ea4c",
              "file": "sales_billing.spec.js",
              "line": 143,
              "column": 3
            },
            {
              "title": "invoice_no is FY-aware per company",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 102,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 69,
                      "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\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must not be null nor undefined\n\nReceived has value: \u001b[31mundefined\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\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must not be null nor undefined\n\nReceived has value: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:158:29",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 29,
                          "line": 158
                        },
                        "snippet": "  156 |     const pms = rows.find(r => r.company === 'pms');\n  157 |     const dlm = rows.find(r => r.company === '360dlm');\n> 158 |     expect(pms?.invoice_no).toContain('PMS');\n      |                             ^\n  159 |     expect(dlm?.invoice_no).toContain('360DLM');\n  160 |     // Both contain a FY-style string YY-YY\n  161 |     [pms, dlm].forEach(r => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 29,
                            "line": 158
                          },
                          "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\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must not be null nor undefined\n\nReceived has value: \u001b[31mundefined\u001b[39m\n\n  156 |     const pms = rows.find(r => r.company === 'pms');\n  157 |     const dlm = rows.find(r => r.company === '360dlm');\n> 158 |     expect(pms?.invoice_no).toContain('PMS');\n      |                             ^\n  159 |     expect(dlm?.invoice_no).toContain('360DLM');\n  160 |     // Both contain a FY-style string YY-YY\n  161 |     [pms, dlm].forEach(r => {\n    at /var/www/360lm/tests/sales_billing.spec.js:158:29"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:57.701Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-80868--no-is-FY-aware-per-company-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 29,
                        "line": 158
                      }
                    },
                    {
                      "workerIndex": 103,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 71,
                      "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\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must not be null nor undefined\n\nReceived has value: \u001b[31mundefined\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\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must not be null nor undefined\n\nReceived has value: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:158:29",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 29,
                          "line": 158
                        },
                        "snippet": "  156 |     const pms = rows.find(r => r.company === 'pms');\n  157 |     const dlm = rows.find(r => r.company === '360dlm');\n> 158 |     expect(pms?.invoice_no).toContain('PMS');\n      |                             ^\n  159 |     expect(dlm?.invoice_no).toContain('360DLM');\n  160 |     // Both contain a FY-style string YY-YY\n  161 |     [pms, dlm].forEach(r => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 29,
                            "line": 158
                          },
                          "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\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must not be null nor undefined\n\nReceived has value: \u001b[31mundefined\u001b[39m\n\n  156 |     const pms = rows.find(r => r.company === 'pms');\n  157 |     const dlm = rows.find(r => r.company === '360dlm');\n> 158 |     expect(pms?.invoice_no).toContain('PMS');\n      |                             ^\n  159 |     expect(dlm?.invoice_no).toContain('360DLM');\n  160 |     // Both contain a FY-style string YY-YY\n  161 |     [pms, dlm].forEach(r => {\n    at /var/www/360lm/tests/sales_billing.spec.js:158:29"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:20:58.667Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-80868--no-is-FY-aware-per-company-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 29,
                        "line": 158
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-cc786299a0f23e219f93",
              "file": "sales_billing.spec.js",
              "line": 154,
              "column": 3
            },
            {
              "title": "issued invoice has issued_at stamped",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 104,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 75,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'status')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'status')\n    at /var/www/360lm/tests/sales_billing.spec.js:169:16",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 16,
                          "line": 169
                        },
                        "snippet": "  167 |     const rows = await dbGet('/invoices?invoice_id=eq.bt-inv-2&select=status,issued_at,paid_at');\n  168 |     const inv = rows[0];\n> 169 |     expect(inv.status).toBe('issued');\n      |                ^\n  170 |     expect(inv.issued_at).toBeTruthy();\n  171 |     expect(inv.paid_at).toBeNull();\n  172 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 16,
                            "line": 169
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'status')\n\n  167 |     const rows = await dbGet('/invoices?invoice_id=eq.bt-inv-2&select=status,issued_at,paid_at');\n  168 |     const inv = rows[0];\n> 169 |     expect(inv.status).toBe('issued');\n      |                ^\n  170 |     expect(inv.issued_at).toBeTruthy();\n  171 |     expect(inv.paid_at).toBeNull();\n  172 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:169:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:20:59.751Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-e6e2c-voice-has-issued-at-stamped-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 16,
                        "line": 169
                      }
                    },
                    {
                      "workerIndex": 105,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 91,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'status')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'status')\n    at /var/www/360lm/tests/sales_billing.spec.js:169:16",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 16,
                          "line": 169
                        },
                        "snippet": "  167 |     const rows = await dbGet('/invoices?invoice_id=eq.bt-inv-2&select=status,issued_at,paid_at');\n  168 |     const inv = rows[0];\n> 169 |     expect(inv.status).toBe('issued');\n      |                ^\n  170 |     expect(inv.issued_at).toBeTruthy();\n  171 |     expect(inv.paid_at).toBeNull();\n  172 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 16,
                            "line": 169
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'status')\n\n  167 |     const rows = await dbGet('/invoices?invoice_id=eq.bt-inv-2&select=status,issued_at,paid_at');\n  168 |     const inv = rows[0];\n> 169 |     expect(inv.status).toBe('issued');\n      |                ^\n  170 |     expect(inv.issued_at).toBeTruthy();\n  171 |     expect(inv.paid_at).toBeNull();\n  172 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:169:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:00.945Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-e6e2c-voice-has-issued-at-stamped-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 16,
                        "line": 169
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-d8d8e5509c582d41250c",
              "file": "sales_billing.spec.js",
              "line": 166,
              "column": 3
            },
            {
              "title": "paid invoice has both issued_at and paid_at",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 106,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 127,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'status')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'status')\n    at /var/www/360lm/tests/sales_billing.spec.js:177:16",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 16,
                          "line": 177
                        },
                        "snippet": "  175 |     const rows = await dbGet('/invoices?invoice_id=eq.bt-inv-3&select=status,issued_at,paid_at');\n  176 |     const inv = rows[0];\n> 177 |     expect(inv.status).toBe('paid');\n      |                ^\n  178 |     expect(inv.issued_at).toBeTruthy();\n  179 |     expect(inv.paid_at).toBeTruthy();\n  180 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 16,
                            "line": 177
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'status')\n\n  175 |     const rows = await dbGet('/invoices?invoice_id=eq.bt-inv-3&select=status,issued_at,paid_at');\n  176 |     const inv = rows[0];\n> 177 |     expect(inv.status).toBe('paid');\n      |                ^\n  178 |     expect(inv.issued_at).toBeTruthy();\n  179 |     expect(inv.paid_at).toBeTruthy();\n  180 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:177:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:02.940Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-aa91b--both-issued-at-and-paid-at-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 16,
                        "line": 177
                      }
                    },
                    {
                      "workerIndex": 107,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 70,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'status')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'status')\n    at /var/www/360lm/tests/sales_billing.spec.js:177:16",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 16,
                          "line": 177
                        },
                        "snippet": "  175 |     const rows = await dbGet('/invoices?invoice_id=eq.bt-inv-3&select=status,issued_at,paid_at');\n  176 |     const inv = rows[0];\n> 177 |     expect(inv.status).toBe('paid');\n      |                ^\n  178 |     expect(inv.issued_at).toBeTruthy();\n  179 |     expect(inv.paid_at).toBeTruthy();\n  180 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 16,
                            "line": 177
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'status')\n\n  175 |     const rows = await dbGet('/invoices?invoice_id=eq.bt-inv-3&select=status,issued_at,paid_at');\n  176 |     const inv = rows[0];\n> 177 |     expect(inv.status).toBe('paid');\n      |                ^\n  178 |     expect(inv.issued_at).toBeTruthy();\n  179 |     expect(inv.paid_at).toBeTruthy();\n  180 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:177:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:04.291Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-aa91b--both-issued-at-and-paid-at-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 16,
                        "line": 177
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-9bfd631fbbe61c678055",
              "file": "sales_billing.spec.js",
              "line": 174,
              "column": 3
            },
            {
              "title": "invoice KPI reflects billing test data",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 108,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 91,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m2\u001b[39m\nReceived:    \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m2\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:185:41",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 41,
                          "line": 185
                        },
                        "snippet": "  183 |     const rows = await dbGet('/invoice_kpi');\n  184 |     const kpi = rows[0];\n> 185 |     expect(Number(kpi.invoices_issued)).toBeGreaterThanOrEqual(2); // bt-inv-2 + bt-inv-3\n      |                                         ^\n  186 |     expect(Number(kpi.billed_total)).toBeGreaterThan(0);\n  187 |     expect(Number(kpi.collected_total)).toBeGreaterThan(0);\n  188 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 41,
                            "line": 185
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m2\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n\n  183 |     const rows = await dbGet('/invoice_kpi');\n  184 |     const kpi = rows[0];\n> 185 |     expect(Number(kpi.invoices_issued)).toBeGreaterThanOrEqual(2); // bt-inv-2 + bt-inv-3\n      |                                         ^\n  186 |     expect(Number(kpi.billed_total)).toBeGreaterThan(0);\n  187 |     expect(Number(kpi.collected_total)).toBeGreaterThan(0);\n  188 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:185:41"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:05.390Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-f95b5--reflects-billing-test-data-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 41,
                        "line": 185
                      }
                    },
                    {
                      "workerIndex": 109,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 72,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m2\u001b[39m\nReceived:    \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m2\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:185:41",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 41,
                          "line": 185
                        },
                        "snippet": "  183 |     const rows = await dbGet('/invoice_kpi');\n  184 |     const kpi = rows[0];\n> 185 |     expect(Number(kpi.invoices_issued)).toBeGreaterThanOrEqual(2); // bt-inv-2 + bt-inv-3\n      |                                         ^\n  186 |     expect(Number(kpi.billed_total)).toBeGreaterThan(0);\n  187 |     expect(Number(kpi.collected_total)).toBeGreaterThan(0);\n  188 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 41,
                            "line": 185
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m2\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n\n  183 |     const rows = await dbGet('/invoice_kpi');\n  184 |     const kpi = rows[0];\n> 185 |     expect(Number(kpi.invoices_issued)).toBeGreaterThanOrEqual(2); // bt-inv-2 + bt-inv-3\n      |                                         ^\n  186 |     expect(Number(kpi.billed_total)).toBeGreaterThan(0);\n  187 |     expect(Number(kpi.collected_total)).toBeGreaterThan(0);\n  188 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:185:41"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:06.535Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-f95b5--reflects-billing-test-data-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 41,
                        "line": 185
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-ffe2cfe8c955a0605499",
              "file": "sales_billing.spec.js",
              "line": 182,
              "column": 3
            },
            {
              "title": "Invoices tab button present in Job Detail HTML",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 110,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 63,
                      "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\"renderInvoicesTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"renderInvoicesTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:193:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 193
                        },
                        "snippet": "  191 |     const ctx = await request.newContext();\n  192 |     const html = await (await ctx.get(BASE_URL)).text();\n> 193 |     expect(html).toContain('renderInvoicesTab()');\n      |                  ^\n  194 |     expect(html).toContain('id=\"tab-invoices\"');\n  195 |     expect(html).toContain('id=\"inv-form-title\"');\n  196 |     expect(html).toContain('id=\"inv-lines-container\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 193
                          },
                          "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\"renderInvoicesTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  191 |     const ctx = await request.newContext();\n  192 |     const html = await (await ctx.get(BASE_URL)).text();\n> 193 |     expect(html).toContain('renderInvoicesTab()');\n      |                  ^\n  194 |     expect(html).toContain('id=\"tab-invoices\"');\n  195 |     expect(html).toContain('id=\"inv-form-title\"');\n  196 |     expect(html).toContain('id=\"inv-lines-container\"');\n    at /var/www/360lm/tests/sales_billing.spec.js:193:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:07.567Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-432ce--present-in-Job-Detail-HTML-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 193
                      }
                    },
                    {
                      "workerIndex": 111,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 56,
                      "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\"renderInvoicesTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"renderInvoicesTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:193:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 193
                        },
                        "snippet": "  191 |     const ctx = await request.newContext();\n  192 |     const html = await (await ctx.get(BASE_URL)).text();\n> 193 |     expect(html).toContain('renderInvoicesTab()');\n      |                  ^\n  194 |     expect(html).toContain('id=\"tab-invoices\"');\n  195 |     expect(html).toContain('id=\"inv-form-title\"');\n  196 |     expect(html).toContain('id=\"inv-lines-container\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 193
                          },
                          "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\"renderInvoicesTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  191 |     const ctx = await request.newContext();\n  192 |     const html = await (await ctx.get(BASE_URL)).text();\n> 193 |     expect(html).toContain('renderInvoicesTab()');\n      |                  ^\n  194 |     expect(html).toContain('id=\"tab-invoices\"');\n  195 |     expect(html).toContain('id=\"inv-form-title\"');\n  196 |     expect(html).toContain('id=\"inv-lines-container\"');\n    at /var/www/360lm/tests/sales_billing.spec.js:193:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:08.492Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-432ce--present-in-Job-Detail-HTML-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 193
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-77f9a702eebab64128aa",
              "file": "sales_billing.spec.js",
              "line": 190,
              "column": 3
            },
            {
              "title": "buildTaxInvoiceHtml exists in Sales JS",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 112,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 68,
                      "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\"function buildTaxInvoiceHtml\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"function buildTaxInvoiceHtml\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:203:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 203
                        },
                        "snippet": "  201 |     const ctx = await request.newContext();\n  202 |     const html = await (await ctx.get(BASE_URL)).text();\n> 203 |     expect(html).toContain('function buildTaxInvoiceHtml');\n      |                  ^\n  204 |     expect(html).toContain('ORIGINAL FOR RECIPIENT');\n  205 |     expect(html).toContain('amountInWords');\n  206 |     expect(html).toContain('GST Rule 55'); // in challan builder nearby"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 203
                          },
                          "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\"function buildTaxInvoiceHtml\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  201 |     const ctx = await request.newContext();\n  202 |     const html = await (await ctx.get(BASE_URL)).text();\n> 203 |     expect(html).toContain('function buildTaxInvoiceHtml');\n      |                  ^\n  204 |     expect(html).toContain('ORIGINAL FOR RECIPIENT');\n  205 |     expect(html).toContain('amountInWords');\n  206 |     expect(html).toContain('GST Rule 55'); // in challan builder nearby\n    at /var/www/360lm/tests/sales_billing.spec.js:203:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:09.442Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-1d72e-oiceHtml-exists-in-Sales-JS-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 203
                      }
                    },
                    {
                      "workerIndex": 113,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 58,
                      "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\"function buildTaxInvoiceHtml\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"function buildTaxInvoiceHtml\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:203:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 203
                        },
                        "snippet": "  201 |     const ctx = await request.newContext();\n  202 |     const html = await (await ctx.get(BASE_URL)).text();\n> 203 |     expect(html).toContain('function buildTaxInvoiceHtml');\n      |                  ^\n  204 |     expect(html).toContain('ORIGINAL FOR RECIPIENT');\n  205 |     expect(html).toContain('amountInWords');\n  206 |     expect(html).toContain('GST Rule 55'); // in challan builder nearby"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 203
                          },
                          "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\"function buildTaxInvoiceHtml\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  201 |     const ctx = await request.newContext();\n  202 |     const html = await (await ctx.get(BASE_URL)).text();\n> 203 |     expect(html).toContain('function buildTaxInvoiceHtml');\n      |                  ^\n  204 |     expect(html).toContain('ORIGINAL FOR RECIPIENT');\n  205 |     expect(html).toContain('amountInWords');\n  206 |     expect(html).toContain('GST Rule 55'); // in challan builder nearby\n    at /var/www/360lm/tests/sales_billing.spec.js:203:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:10.463Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-1d72e-oiceHtml-exists-in-Sales-JS-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 203
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-2a66d65a5db623d5cfd3",
              "file": "sales_billing.spec.js",
              "line": 200,
              "column": 3
            },
            {
              "title": "invoice tab visible in Job Detail screen (rendered UI)",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 114,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 1118,
                      "error": {
                        "message": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)",
                        "stack": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at /var/www/360lm/tests/sales_billing.spec.js:216:16",
                        "location": {
                          "file": "eval at evaluate (:302:30), <anonymous>",
                          "column": 7,
                          "line": 1
                        }
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "eval at evaluate (:302:30), <anonymous>",
                            "column": 7,
                            "line": 1
                          },
                          "message": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at /var/www/360lm/tests/sales_billing.spec.js:216:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:11.441Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-ff49a--Detail-screen-rendered-UI--android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-ff49a--Detail-screen-rendered-UI--android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "eval at evaluate (:302:30), <anonymous>",
                        "column": 7,
                        "line": 1
                      }
                    },
                    {
                      "workerIndex": 115,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 1119,
                      "error": {
                        "message": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)",
                        "stack": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at /var/www/360lm/tests/sales_billing.spec.js:216:16",
                        "location": {
                          "file": "eval at evaluate (:302:30), <anonymous>",
                          "column": 7,
                          "line": 1
                        }
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "eval at evaluate (:302:30), <anonymous>",
                            "column": 7,
                            "line": 1
                          },
                          "message": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at /var/www/360lm/tests/sales_billing.spec.js:216:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:13.630Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-ff49a--Detail-screen-rendered-UI--android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-ff49a--Detail-screen-rendered-UI--android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "eval at evaluate (:302:30), <anonymous>",
                        "column": 7,
                        "line": 1
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-c6f67048ea174871ca18",
              "file": "sales_billing.spec.js",
              "line": 211,
              "column": 3
            },
            {
              "title": "three test invoices exist with correct statuses",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 300,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 61,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:134:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 134
                        },
                        "snippet": "  132 |   test('three test invoices exist with correct statuses', async () => {\n  133 |     const rows = await dbGet('/invoices?invoice_id=in.(bt-inv-1,bt-inv-2,bt-inv-3)&select=invoice_id,invoice_no,status,company,gst_type&order=invoice_id');\n> 134 |     expect(rows.length).toBe(3);\n      |                         ^\n  135 |     const byId = Object.fromEntries(rows.map(r => [r.invoice_id, r]));\n  136 |     expect(byId['bt-inv-1'].status).toBe('draft');\n  137 |     expect(byId['bt-inv-2'].status).toBe('issued');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 134
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  132 |   test('three test invoices exist with correct statuses', async () => {\n  133 |     const rows = await dbGet('/invoices?invoice_id=in.(bt-inv-1,bt-inv-2,bt-inv-3)&select=invoice_id,invoice_no,status,company,gst_type&order=invoice_id');\n> 134 |     expect(rows.length).toBe(3);\n      |                         ^\n  135 |     const byId = Object.fromEntries(rows.map(r => [r.invoice_id, r]));\n  136 |     expect(byId['bt-inv-1'].status).toBe('draft');\n  137 |     expect(byId['bt-inv-2'].status).toBe('issued');\n    at /var/www/360lm/tests/sales_billing.spec.js:134:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:34.403Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-d46dc-exist-with-correct-statuses-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 134
                      }
                    },
                    {
                      "workerIndex": 301,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 79,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:134:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 134
                        },
                        "snippet": "  132 |   test('three test invoices exist with correct statuses', async () => {\n  133 |     const rows = await dbGet('/invoices?invoice_id=in.(bt-inv-1,bt-inv-2,bt-inv-3)&select=invoice_id,invoice_no,status,company,gst_type&order=invoice_id');\n> 134 |     expect(rows.length).toBe(3);\n      |                         ^\n  135 |     const byId = Object.fromEntries(rows.map(r => [r.invoice_id, r]));\n  136 |     expect(byId['bt-inv-1'].status).toBe('draft');\n  137 |     expect(byId['bt-inv-2'].status).toBe('issued');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 134
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  132 |   test('three test invoices exist with correct statuses', async () => {\n  133 |     const rows = await dbGet('/invoices?invoice_id=in.(bt-inv-1,bt-inv-2,bt-inv-3)&select=invoice_id,invoice_no,status,company,gst_type&order=invoice_id');\n> 134 |     expect(rows.length).toBe(3);\n      |                         ^\n  135 |     const byId = Object.fromEntries(rows.map(r => [r.invoice_id, r]));\n  136 |     expect(byId['bt-inv-1'].status).toBe('draft');\n  137 |     expect(byId['bt-inv-2'].status).toBe('issued');\n    at /var/www/360lm/tests/sales_billing.spec.js:134:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:37:35.355Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-d46dc-exist-with-correct-statuses-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 134
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-0a5c67733c7a3b009770",
              "file": "sales_billing.spec.js",
              "line": 132,
              "column": 3
            },
            {
              "title": "invoice_lines have hsn_sac + amount GENERATED correctly",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 302,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 87,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:145:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 145
                        },
                        "snippet": "  143 |   test('invoice_lines have hsn_sac + amount GENERATED correctly', async () => {\n  144 |     const rows = await dbGet('/invoice_lines?invoice_id=eq.bt-inv-2&select=element,rate,qty,amount,hsn_sac,line_type&order=sr_no');\n> 145 |     expect(rows.length).toBe(2);\n      |                         ^\n  146 |     rows.forEach(r => {\n  147 |       expect(Number(r.amount)).toBeCloseTo(Number(r.rate) * Number(r.qty), 1);\n  148 |       expect(r.hsn_sac).toBeTruthy();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 145
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  143 |   test('invoice_lines have hsn_sac + amount GENERATED correctly', async () => {\n  144 |     const rows = await dbGet('/invoice_lines?invoice_id=eq.bt-inv-2&select=element,rate,qty,amount,hsn_sac,line_type&order=sr_no');\n> 145 |     expect(rows.length).toBe(2);\n      |                         ^\n  146 |     rows.forEach(r => {\n  147 |       expect(Number(r.amount)).toBeCloseTo(Number(r.rate) * Number(r.qty), 1);\n  148 |       expect(r.hsn_sac).toBeTruthy();\n    at /var/www/360lm/tests/sales_billing.spec.js:145:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:36.464Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-63eb2--amount-GENERATED-correctly-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 145
                      }
                    },
                    {
                      "workerIndex": 303,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 88,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:145:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 145
                        },
                        "snippet": "  143 |   test('invoice_lines have hsn_sac + amount GENERATED correctly', async () => {\n  144 |     const rows = await dbGet('/invoice_lines?invoice_id=eq.bt-inv-2&select=element,rate,qty,amount,hsn_sac,line_type&order=sr_no');\n> 145 |     expect(rows.length).toBe(2);\n      |                         ^\n  146 |     rows.forEach(r => {\n  147 |       expect(Number(r.amount)).toBeCloseTo(Number(r.rate) * Number(r.qty), 1);\n  148 |       expect(r.hsn_sac).toBeTruthy();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 145
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  143 |   test('invoice_lines have hsn_sac + amount GENERATED correctly', async () => {\n  144 |     const rows = await dbGet('/invoice_lines?invoice_id=eq.bt-inv-2&select=element,rate,qty,amount,hsn_sac,line_type&order=sr_no');\n> 145 |     expect(rows.length).toBe(2);\n      |                         ^\n  146 |     rows.forEach(r => {\n  147 |       expect(Number(r.amount)).toBeCloseTo(Number(r.rate) * Number(r.qty), 1);\n  148 |       expect(r.hsn_sac).toBeTruthy();\n    at /var/www/360lm/tests/sales_billing.spec.js:145:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:37:37.745Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-63eb2--amount-GENERATED-correctly-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 145
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-1a5f8be11db218732130",
              "file": "sales_billing.spec.js",
              "line": 143,
              "column": 3
            },
            {
              "title": "invoice_no is FY-aware per company",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 304,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 77,
                      "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\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must not be null nor undefined\n\nReceived has value: \u001b[31mundefined\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\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must not be null nor undefined\n\nReceived has value: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:158:29",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 29,
                          "line": 158
                        },
                        "snippet": "  156 |     const pms = rows.find(r => r.company === 'pms');\n  157 |     const dlm = rows.find(r => r.company === '360dlm');\n> 158 |     expect(pms?.invoice_no).toContain('PMS');\n      |                             ^\n  159 |     expect(dlm?.invoice_no).toContain('360DLM');\n  160 |     // Both contain a FY-style string YY-YY\n  161 |     [pms, dlm].forEach(r => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 29,
                            "line": 158
                          },
                          "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\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must not be null nor undefined\n\nReceived has value: \u001b[31mundefined\u001b[39m\n\n  156 |     const pms = rows.find(r => r.company === 'pms');\n  157 |     const dlm = rows.find(r => r.company === '360dlm');\n> 158 |     expect(pms?.invoice_no).toContain('PMS');\n      |                             ^\n  159 |     expect(dlm?.invoice_no).toContain('360DLM');\n  160 |     // Both contain a FY-style string YY-YY\n  161 |     [pms, dlm].forEach(r => {\n    at /var/www/360lm/tests/sales_billing.spec.js:158:29"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:38.768Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-80868--no-is-FY-aware-per-company-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 29,
                        "line": 158
                      }
                    },
                    {
                      "workerIndex": 305,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 68,
                      "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\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must not be null nor undefined\n\nReceived has value: \u001b[31mundefined\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\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must not be null nor undefined\n\nReceived has value: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:158:29",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 29,
                          "line": 158
                        },
                        "snippet": "  156 |     const pms = rows.find(r => r.company === 'pms');\n  157 |     const dlm = rows.find(r => r.company === '360dlm');\n> 158 |     expect(pms?.invoice_no).toContain('PMS');\n      |                             ^\n  159 |     expect(dlm?.invoice_no).toContain('360DLM');\n  160 |     // Both contain a FY-style string YY-YY\n  161 |     [pms, dlm].forEach(r => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 29,
                            "line": 158
                          },
                          "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\n\u001b[1mMatcher error\u001b[22m: \u001b[31mreceived\u001b[39m value must not be null nor undefined\n\nReceived has value: \u001b[31mundefined\u001b[39m\n\n  156 |     const pms = rows.find(r => r.company === 'pms');\n  157 |     const dlm = rows.find(r => r.company === '360dlm');\n> 158 |     expect(pms?.invoice_no).toContain('PMS');\n      |                             ^\n  159 |     expect(dlm?.invoice_no).toContain('360DLM');\n  160 |     // Both contain a FY-style string YY-YY\n  161 |     [pms, dlm].forEach(r => {\n    at /var/www/360lm/tests/sales_billing.spec.js:158:29"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:37:39.911Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-80868--no-is-FY-aware-per-company-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 29,
                        "line": 158
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-8d93caf851cc97f0f339",
              "file": "sales_billing.spec.js",
              "line": 154,
              "column": 3
            },
            {
              "title": "issued invoice has issued_at stamped",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 306,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 93,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'status')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'status')\n    at /var/www/360lm/tests/sales_billing.spec.js:169:16",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 16,
                          "line": 169
                        },
                        "snippet": "  167 |     const rows = await dbGet('/invoices?invoice_id=eq.bt-inv-2&select=status,issued_at,paid_at');\n  168 |     const inv = rows[0];\n> 169 |     expect(inv.status).toBe('issued');\n      |                ^\n  170 |     expect(inv.issued_at).toBeTruthy();\n  171 |     expect(inv.paid_at).toBeNull();\n  172 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 16,
                            "line": 169
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'status')\n\n  167 |     const rows = await dbGet('/invoices?invoice_id=eq.bt-inv-2&select=status,issued_at,paid_at');\n  168 |     const inv = rows[0];\n> 169 |     expect(inv.status).toBe('issued');\n      |                ^\n  170 |     expect(inv.issued_at).toBeTruthy();\n  171 |     expect(inv.paid_at).toBeNull();\n  172 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:169:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:40.974Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-e6e2c-voice-has-issued-at-stamped-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 16,
                        "line": 169
                      }
                    },
                    {
                      "workerIndex": 307,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 59,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'status')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'status')\n    at /var/www/360lm/tests/sales_billing.spec.js:169:16",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 16,
                          "line": 169
                        },
                        "snippet": "  167 |     const rows = await dbGet('/invoices?invoice_id=eq.bt-inv-2&select=status,issued_at,paid_at');\n  168 |     const inv = rows[0];\n> 169 |     expect(inv.status).toBe('issued');\n      |                ^\n  170 |     expect(inv.issued_at).toBeTruthy();\n  171 |     expect(inv.paid_at).toBeNull();\n  172 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 16,
                            "line": 169
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'status')\n\n  167 |     const rows = await dbGet('/invoices?invoice_id=eq.bt-inv-2&select=status,issued_at,paid_at');\n  168 |     const inv = rows[0];\n> 169 |     expect(inv.status).toBe('issued');\n      |                ^\n  170 |     expect(inv.issued_at).toBeTruthy();\n  171 |     expect(inv.paid_at).toBeNull();\n  172 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:169:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:37:42.023Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-e6e2c-voice-has-issued-at-stamped-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 16,
                        "line": 169
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-5bacc7858b1d79b6bec7",
              "file": "sales_billing.spec.js",
              "line": 166,
              "column": 3
            },
            {
              "title": "paid invoice has both issued_at and paid_at",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 308,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 63,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'status')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'status')\n    at /var/www/360lm/tests/sales_billing.spec.js:177:16",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 16,
                          "line": 177
                        },
                        "snippet": "  175 |     const rows = await dbGet('/invoices?invoice_id=eq.bt-inv-3&select=status,issued_at,paid_at');\n  176 |     const inv = rows[0];\n> 177 |     expect(inv.status).toBe('paid');\n      |                ^\n  178 |     expect(inv.issued_at).toBeTruthy();\n  179 |     expect(inv.paid_at).toBeTruthy();\n  180 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 16,
                            "line": 177
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'status')\n\n  175 |     const rows = await dbGet('/invoices?invoice_id=eq.bt-inv-3&select=status,issued_at,paid_at');\n  176 |     const inv = rows[0];\n> 177 |     expect(inv.status).toBe('paid');\n      |                ^\n  178 |     expect(inv.issued_at).toBeTruthy();\n  179 |     expect(inv.paid_at).toBeTruthy();\n  180 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:177:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:43.027Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-aa91b--both-issued-at-and-paid-at-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 16,
                        "line": 177
                      }
                    },
                    {
                      "workerIndex": 309,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 76,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'status')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'status')\n    at /var/www/360lm/tests/sales_billing.spec.js:177:16",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 16,
                          "line": 177
                        },
                        "snippet": "  175 |     const rows = await dbGet('/invoices?invoice_id=eq.bt-inv-3&select=status,issued_at,paid_at');\n  176 |     const inv = rows[0];\n> 177 |     expect(inv.status).toBe('paid');\n      |                ^\n  178 |     expect(inv.issued_at).toBeTruthy();\n  179 |     expect(inv.paid_at).toBeTruthy();\n  180 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 16,
                            "line": 177
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'status')\n\n  175 |     const rows = await dbGet('/invoices?invoice_id=eq.bt-inv-3&select=status,issued_at,paid_at');\n  176 |     const inv = rows[0];\n> 177 |     expect(inv.status).toBe('paid');\n      |                ^\n  178 |     expect(inv.issued_at).toBeTruthy();\n  179 |     expect(inv.paid_at).toBeTruthy();\n  180 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:177:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:37:44.002Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-aa91b--both-issued-at-and-paid-at-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 16,
                        "line": 177
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-c9a5bf4756443a758e34",
              "file": "sales_billing.spec.js",
              "line": 174,
              "column": 3
            },
            {
              "title": "invoice KPI reflects billing test data",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 310,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 65,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m2\u001b[39m\nReceived:    \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m2\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:185:41",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 41,
                          "line": 185
                        },
                        "snippet": "  183 |     const rows = await dbGet('/invoice_kpi');\n  184 |     const kpi = rows[0];\n> 185 |     expect(Number(kpi.invoices_issued)).toBeGreaterThanOrEqual(2); // bt-inv-2 + bt-inv-3\n      |                                         ^\n  186 |     expect(Number(kpi.billed_total)).toBeGreaterThan(0);\n  187 |     expect(Number(kpi.collected_total)).toBeGreaterThan(0);\n  188 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 41,
                            "line": 185
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m2\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n\n  183 |     const rows = await dbGet('/invoice_kpi');\n  184 |     const kpi = rows[0];\n> 185 |     expect(Number(kpi.invoices_issued)).toBeGreaterThanOrEqual(2); // bt-inv-2 + bt-inv-3\n      |                                         ^\n  186 |     expect(Number(kpi.billed_total)).toBeGreaterThan(0);\n  187 |     expect(Number(kpi.collected_total)).toBeGreaterThan(0);\n  188 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:185:41"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:45.016Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-f95b5--reflects-billing-test-data-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 41,
                        "line": 185
                      }
                    },
                    {
                      "workerIndex": 311,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 74,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m2\u001b[39m\nReceived:    \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m2\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:185:41",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 41,
                          "line": 185
                        },
                        "snippet": "  183 |     const rows = await dbGet('/invoice_kpi');\n  184 |     const kpi = rows[0];\n> 185 |     expect(Number(kpi.invoices_issued)).toBeGreaterThanOrEqual(2); // bt-inv-2 + bt-inv-3\n      |                                         ^\n  186 |     expect(Number(kpi.billed_total)).toBeGreaterThan(0);\n  187 |     expect(Number(kpi.collected_total)).toBeGreaterThan(0);\n  188 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 41,
                            "line": 185
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThanOrEqual\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: >= \u001b[32m2\u001b[39m\nReceived:    \u001b[31m0\u001b[39m\n\n  183 |     const rows = await dbGet('/invoice_kpi');\n  184 |     const kpi = rows[0];\n> 185 |     expect(Number(kpi.invoices_issued)).toBeGreaterThanOrEqual(2); // bt-inv-2 + bt-inv-3\n      |                                         ^\n  186 |     expect(Number(kpi.billed_total)).toBeGreaterThan(0);\n  187 |     expect(Number(kpi.collected_total)).toBeGreaterThan(0);\n  188 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:185:41"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:37:45.957Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-f95b5--reflects-billing-test-data-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 41,
                        "line": 185
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-896862aa52aa7869acde",
              "file": "sales_billing.spec.js",
              "line": 182,
              "column": 3
            },
            {
              "title": "Invoices tab button present in Job Detail HTML",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 312,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 80,
                      "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\"renderInvoicesTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"renderInvoicesTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:193:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 193
                        },
                        "snippet": "  191 |     const ctx = await request.newContext();\n  192 |     const html = await (await ctx.get(BASE_URL)).text();\n> 193 |     expect(html).toContain('renderInvoicesTab()');\n      |                  ^\n  194 |     expect(html).toContain('id=\"tab-invoices\"');\n  195 |     expect(html).toContain('id=\"inv-form-title\"');\n  196 |     expect(html).toContain('id=\"inv-lines-container\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 193
                          },
                          "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\"renderInvoicesTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  191 |     const ctx = await request.newContext();\n  192 |     const html = await (await ctx.get(BASE_URL)).text();\n> 193 |     expect(html).toContain('renderInvoicesTab()');\n      |                  ^\n  194 |     expect(html).toContain('id=\"tab-invoices\"');\n  195 |     expect(html).toContain('id=\"inv-form-title\"');\n  196 |     expect(html).toContain('id=\"inv-lines-container\"');\n    at /var/www/360lm/tests/sales_billing.spec.js:193:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:46.986Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-432ce--present-in-Job-Detail-HTML-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 193
                      }
                    },
                    {
                      "workerIndex": 313,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 69,
                      "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\"renderInvoicesTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"renderInvoicesTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:193:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 193
                        },
                        "snippet": "  191 |     const ctx = await request.newContext();\n  192 |     const html = await (await ctx.get(BASE_URL)).text();\n> 193 |     expect(html).toContain('renderInvoicesTab()');\n      |                  ^\n  194 |     expect(html).toContain('id=\"tab-invoices\"');\n  195 |     expect(html).toContain('id=\"inv-form-title\"');\n  196 |     expect(html).toContain('id=\"inv-lines-container\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 193
                          },
                          "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\"renderInvoicesTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  191 |     const ctx = await request.newContext();\n  192 |     const html = await (await ctx.get(BASE_URL)).text();\n> 193 |     expect(html).toContain('renderInvoicesTab()');\n      |                  ^\n  194 |     expect(html).toContain('id=\"tab-invoices\"');\n  195 |     expect(html).toContain('id=\"inv-form-title\"');\n  196 |     expect(html).toContain('id=\"inv-lines-container\"');\n    at /var/www/360lm/tests/sales_billing.spec.js:193:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:37:48.036Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-432ce--present-in-Job-Detail-HTML-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 193
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-f312dfb15ea98f8d9a55",
              "file": "sales_billing.spec.js",
              "line": 190,
              "column": 3
            },
            {
              "title": "buildTaxInvoiceHtml exists in Sales JS",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 314,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 73,
                      "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\"function buildTaxInvoiceHtml\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"function buildTaxInvoiceHtml\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:203:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 203
                        },
                        "snippet": "  201 |     const ctx = await request.newContext();\n  202 |     const html = await (await ctx.get(BASE_URL)).text();\n> 203 |     expect(html).toContain('function buildTaxInvoiceHtml');\n      |                  ^\n  204 |     expect(html).toContain('ORIGINAL FOR RECIPIENT');\n  205 |     expect(html).toContain('amountInWords');\n  206 |     expect(html).toContain('GST Rule 55'); // in challan builder nearby"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 203
                          },
                          "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\"function buildTaxInvoiceHtml\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  201 |     const ctx = await request.newContext();\n  202 |     const html = await (await ctx.get(BASE_URL)).text();\n> 203 |     expect(html).toContain('function buildTaxInvoiceHtml');\n      |                  ^\n  204 |     expect(html).toContain('ORIGINAL FOR RECIPIENT');\n  205 |     expect(html).toContain('amountInWords');\n  206 |     expect(html).toContain('GST Rule 55'); // in challan builder nearby\n    at /var/www/360lm/tests/sales_billing.spec.js:203:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:49.165Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-1d72e-oiceHtml-exists-in-Sales-JS-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 203
                      }
                    },
                    {
                      "workerIndex": 315,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 64,
                      "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\"function buildTaxInvoiceHtml\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"function buildTaxInvoiceHtml\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:203:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 203
                        },
                        "snippet": "  201 |     const ctx = await request.newContext();\n  202 |     const html = await (await ctx.get(BASE_URL)).text();\n> 203 |     expect(html).toContain('function buildTaxInvoiceHtml');\n      |                  ^\n  204 |     expect(html).toContain('ORIGINAL FOR RECIPIENT');\n  205 |     expect(html).toContain('amountInWords');\n  206 |     expect(html).toContain('GST Rule 55'); // in challan builder nearby"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 203
                          },
                          "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\"function buildTaxInvoiceHtml\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  201 |     const ctx = await request.newContext();\n  202 |     const html = await (await ctx.get(BASE_URL)).text();\n> 203 |     expect(html).toContain('function buildTaxInvoiceHtml');\n      |                  ^\n  204 |     expect(html).toContain('ORIGINAL FOR RECIPIENT');\n  205 |     expect(html).toContain('amountInWords');\n  206 |     expect(html).toContain('GST Rule 55'); // in challan builder nearby\n    at /var/www/360lm/tests/sales_billing.spec.js:203:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:37:50.139Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-1d72e-oiceHtml-exists-in-Sales-JS-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 203
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-5a606089e4d5682238bb",
              "file": "sales_billing.spec.js",
              "line": 200,
              "column": 3
            },
            {
              "title": "invoice tab visible in Job Detail screen (rendered UI)",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 316,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 1136,
                      "error": {
                        "message": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)",
                        "stack": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at /var/www/360lm/tests/sales_billing.spec.js:216:16",
                        "location": {
                          "file": "eval at evaluate (:302:30), <anonymous>",
                          "column": 7,
                          "line": 1
                        }
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "eval at evaluate (:302:30), <anonymous>",
                            "column": 7,
                            "line": 1
                          },
                          "message": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at /var/www/360lm/tests/sales_billing.spec.js:216:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:51.075Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-ff49a--Detail-screen-rendered-UI--desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-ff49a--Detail-screen-rendered-UI--desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "eval at evaluate (:302:30), <anonymous>",
                        "column": 7,
                        "line": 1
                      }
                    },
                    {
                      "workerIndex": 317,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 1117,
                      "error": {
                        "message": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)",
                        "stack": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at /var/www/360lm/tests/sales_billing.spec.js:216:16",
                        "location": {
                          "file": "eval at evaluate (:302:30), <anonymous>",
                          "column": 7,
                          "line": 1
                        }
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "eval at evaluate (:302:30), <anonymous>",
                            "column": 7,
                            "line": 1
                          },
                          "message": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at /var/www/360lm/tests/sales_billing.spec.js:216:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:37:53.217Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-ff49a--Detail-screen-rendered-UI--desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-ff49a--Detail-screen-rendered-UI--desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "eval at evaluate (:302:30), <anonymous>",
                        "column": 7,
                        "line": 1
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-4fb5348960974fa600c2",
              "file": "sales_billing.spec.js",
              "line": 211,
              "column": 3
            }
          ]
        },
        {
          "title": "Sales Billing — Stage F: Challans",
          "file": "sales_billing.spec.js",
          "line": 231,
          "column": 6,
          "specs": [
            {
              "title": "three test challans exist with correct statuses",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 116,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 73,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:234:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 234
                        },
                        "snippet": "  232 |   test('three test challans exist with correct statuses', async () => {\n  233 |     const rows = await dbGet('/challans?challan_id=in.(bt-dc-1,bt-dc-2,bt-dc-3)&select=challan_id,challan_no,status,invoice_id,company&order=challan_id');\n> 234 |     expect(rows.length).toBe(3);\n      |                         ^\n  235 |     const byId = Object.fromEntries(rows.map(r => [r.challan_id, r]));\n  236 |     expect(byId['bt-dc-1'].status).toBe('open');\n  237 |     expect(byId['bt-dc-2'].status).toBe('delivered');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 234
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  232 |   test('three test challans exist with correct statuses', async () => {\n  233 |     const rows = await dbGet('/challans?challan_id=in.(bt-dc-1,bt-dc-2,bt-dc-3)&select=challan_id,challan_no,status,invoice_id,company&order=challan_id');\n> 234 |     expect(rows.length).toBe(3);\n      |                         ^\n  235 |     const byId = Object.fromEntries(rows.map(r => [r.challan_id, r]));\n  236 |     expect(byId['bt-dc-1'].status).toBe('open');\n  237 |     expect(byId['bt-dc-2'].status).toBe('delivered');\n    at /var/www/360lm/tests/sales_billing.spec.js:234:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:15.805Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-0974a-exist-with-correct-statuses-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 234
                      }
                    },
                    {
                      "workerIndex": 117,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 62,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:234:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 234
                        },
                        "snippet": "  232 |   test('three test challans exist with correct statuses', async () => {\n  233 |     const rows = await dbGet('/challans?challan_id=in.(bt-dc-1,bt-dc-2,bt-dc-3)&select=challan_id,challan_no,status,invoice_id,company&order=challan_id');\n> 234 |     expect(rows.length).toBe(3);\n      |                         ^\n  235 |     const byId = Object.fromEntries(rows.map(r => [r.challan_id, r]));\n  236 |     expect(byId['bt-dc-1'].status).toBe('open');\n  237 |     expect(byId['bt-dc-2'].status).toBe('delivered');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 234
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  232 |   test('three test challans exist with correct statuses', async () => {\n  233 |     const rows = await dbGet('/challans?challan_id=in.(bt-dc-1,bt-dc-2,bt-dc-3)&select=challan_id,challan_no,status,invoice_id,company&order=challan_id');\n> 234 |     expect(rows.length).toBe(3);\n      |                         ^\n  235 |     const byId = Object.fromEntries(rows.map(r => [r.challan_id, r]));\n  236 |     expect(byId['bt-dc-1'].status).toBe('open');\n  237 |     expect(byId['bt-dc-2'].status).toBe('delivered');\n    at /var/www/360lm/tests/sales_billing.spec.js:234:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:16.720Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-0974a-exist-with-correct-statuses-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 234
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-d1479c0dab6d0d537a9d",
              "file": "sales_billing.spec.js",
              "line": 232,
              "column": 3
            },
            {
              "title": "delivered challan has delivered_at stamped",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 118,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 54,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'status')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'status')\n    at /var/www/360lm/tests/sales_billing.spec.js:247:20",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 20,
                          "line": 247
                        },
                        "snippet": "  245 |   test('delivered challan has delivered_at stamped', async () => {\n  246 |     const rows = await dbGet('/challans?challan_id=eq.bt-dc-2&select=status,delivered_at');\n> 247 |     expect(rows[0].status).toBe('delivered');\n      |                    ^\n  248 |     expect(rows[0].delivered_at).toBeTruthy();\n  249 |   });\n  250 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 20,
                            "line": 247
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'status')\n\n  245 |   test('delivered challan has delivered_at stamped', async () => {\n  246 |     const rows = await dbGet('/challans?challan_id=eq.bt-dc-2&select=status,delivered_at');\n> 247 |     expect(rows[0].status).toBe('delivered');\n      |                    ^\n  248 |     expect(rows[0].delivered_at).toBeTruthy();\n  249 |   });\n  250 |\n    at /var/www/360lm/tests/sales_billing.spec.js:247:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:17.624Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-17a7b-an-has-delivered-at-stamped-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 20,
                        "line": 247
                      }
                    },
                    {
                      "workerIndex": 119,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 75,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'status')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'status')\n    at /var/www/360lm/tests/sales_billing.spec.js:247:20",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 20,
                          "line": 247
                        },
                        "snippet": "  245 |   test('delivered challan has delivered_at stamped', async () => {\n  246 |     const rows = await dbGet('/challans?challan_id=eq.bt-dc-2&select=status,delivered_at');\n> 247 |     expect(rows[0].status).toBe('delivered');\n      |                    ^\n  248 |     expect(rows[0].delivered_at).toBeTruthy();\n  249 |   });\n  250 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 20,
                            "line": 247
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'status')\n\n  245 |   test('delivered challan has delivered_at stamped', async () => {\n  246 |     const rows = await dbGet('/challans?challan_id=eq.bt-dc-2&select=status,delivered_at');\n> 247 |     expect(rows[0].status).toBe('delivered');\n      |                    ^\n  248 |     expect(rows[0].delivered_at).toBeTruthy();\n  249 |   });\n  250 |\n    at /var/www/360lm/tests/sales_billing.spec.js:247:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:18.585Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-17a7b-an-has-delivered-at-stamped-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 20,
                        "line": 247
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-b10c3c51b0d2b09b1b1a",
              "file": "sales_billing.spec.js",
              "line": 245,
              "column": 3
            },
            {
              "title": "challan lines carry HSN/SAC + unit",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 120,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 79,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:253:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 253
                        },
                        "snippet": "  251 |   test('challan lines carry HSN/SAC + unit', async () => {\n  252 |     const rows = await dbGet('/challan_lines?challan_id=eq.bt-dc-1&select=element,hsn_sac,unit,qty&order=sr_no');\n> 253 |     expect(rows.length).toBe(3);\n      |                         ^\n  254 |     rows.forEach(r => {\n  255 |       expect(r.hsn_sac).toBeTruthy();\n  256 |       expect(r.unit).toBeTruthy();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 253
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  251 |   test('challan lines carry HSN/SAC + unit', async () => {\n  252 |     const rows = await dbGet('/challan_lines?challan_id=eq.bt-dc-1&select=element,hsn_sac,unit,qty&order=sr_no');\n> 253 |     expect(rows.length).toBe(3);\n      |                         ^\n  254 |     rows.forEach(r => {\n  255 |       expect(r.hsn_sac).toBeTruthy();\n  256 |       expect(r.unit).toBeTruthy();\n    at /var/www/360lm/tests/sales_billing.spec.js:253:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:19.581Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-d2de6-an-lines-carry-HSN-SAC-unit-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 253
                      }
                    },
                    {
                      "workerIndex": 121,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 75,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:253:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 253
                        },
                        "snippet": "  251 |   test('challan lines carry HSN/SAC + unit', async () => {\n  252 |     const rows = await dbGet('/challan_lines?challan_id=eq.bt-dc-1&select=element,hsn_sac,unit,qty&order=sr_no');\n> 253 |     expect(rows.length).toBe(3);\n      |                         ^\n  254 |     rows.forEach(r => {\n  255 |       expect(r.hsn_sac).toBeTruthy();\n  256 |       expect(r.unit).toBeTruthy();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 253
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  251 |   test('challan lines carry HSN/SAC + unit', async () => {\n  252 |     const rows = await dbGet('/challan_lines?challan_id=eq.bt-dc-1&select=element,hsn_sac,unit,qty&order=sr_no');\n> 253 |     expect(rows.length).toBe(3);\n      |                         ^\n  254 |     rows.forEach(r => {\n  255 |       expect(r.hsn_sac).toBeTruthy();\n  256 |       expect(r.unit).toBeTruthy();\n    at /var/www/360lm/tests/sales_billing.spec.js:253:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:20.570Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-d2de6-an-lines-carry-HSN-SAC-unit-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 253
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-cc365ac0eb13382d269f",
              "file": "sales_billing.spec.js",
              "line": 251,
              "column": 3
            },
            {
              "title": "challans_v view enriches with job_name + invoice_no",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 122,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 83,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'job_name')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'job_name')\n    at /var/www/360lm/tests/sales_billing.spec.js:264:15",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 15,
                          "line": 264
                        },
                        "snippet": "  262 |     const rows = await dbGet('/challans_v?challan_id=eq.bt-dc-2&select=challan_no,status,job_name,invoice_no,line_count');\n  263 |     const dc = rows[0];\n> 264 |     expect(dc.job_name).toBeTruthy();\n      |               ^\n  265 |     expect(dc.invoice_no).toBeTruthy();\n  266 |     expect(Number(dc.line_count)).toBe(2);\n  267 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 15,
                            "line": 264
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'job_name')\n\n  262 |     const rows = await dbGet('/challans_v?challan_id=eq.bt-dc-2&select=challan_no,status,job_name,invoice_no,line_count');\n  263 |     const dc = rows[0];\n> 264 |     expect(dc.job_name).toBeTruthy();\n      |               ^\n  265 |     expect(dc.invoice_no).toBeTruthy();\n  266 |     expect(Number(dc.line_count)).toBe(2);\n  267 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:264:15"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:21.558Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-2c922-es-with-job-name-invoice-no-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 15,
                        "line": 264
                      }
                    },
                    {
                      "workerIndex": 123,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 70,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'job_name')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'job_name')\n    at /var/www/360lm/tests/sales_billing.spec.js:264:15",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 15,
                          "line": 264
                        },
                        "snippet": "  262 |     const rows = await dbGet('/challans_v?challan_id=eq.bt-dc-2&select=challan_no,status,job_name,invoice_no,line_count');\n  263 |     const dc = rows[0];\n> 264 |     expect(dc.job_name).toBeTruthy();\n      |               ^\n  265 |     expect(dc.invoice_no).toBeTruthy();\n  266 |     expect(Number(dc.line_count)).toBe(2);\n  267 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 15,
                            "line": 264
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'job_name')\n\n  262 |     const rows = await dbGet('/challans_v?challan_id=eq.bt-dc-2&select=challan_no,status,job_name,invoice_no,line_count');\n  263 |     const dc = rows[0];\n> 264 |     expect(dc.job_name).toBeTruthy();\n      |               ^\n  265 |     expect(dc.invoice_no).toBeTruthy();\n  266 |     expect(Number(dc.line_count)).toBe(2);\n  267 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:264:15"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:22.523Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-2c922-es-with-job-name-invoice-no-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 15,
                        "line": 264
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-dea92ee2b8213e4e643b",
              "file": "sales_billing.spec.js",
              "line": 261,
              "column": 3
            },
            {
              "title": "next_dc_no function generates DC-{COMPANY}/YY-YY/NNN format",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 124,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 123,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:23.485Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-6f151884189ed9a95289",
              "file": "sales_billing.spec.js",
              "line": 269,
              "column": 3
            },
            {
              "title": "Challans tab button present in Job Detail HTML",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 124,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 32,
                      "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\"renderChallansTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"renderChallansTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:284:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 284
                        },
                        "snippet": "  282 |     const ctx = await request.newContext();\n  283 |     const html = await (await ctx.get(BASE_URL)).text();\n> 284 |     expect(html).toContain('renderChallansTab()');\n      |                  ^\n  285 |     expect(html).toContain('id=\"tab-challans\"');\n  286 |     expect(html).toContain('id=\"dc-form-title\"');\n  287 |     expect(html).toContain('id=\"dc-lines-container\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 284
                          },
                          "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\"renderChallansTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  282 |     const ctx = await request.newContext();\n  283 |     const html = await (await ctx.get(BASE_URL)).text();\n> 284 |     expect(html).toContain('renderChallansTab()');\n      |                  ^\n  285 |     expect(html).toContain('id=\"tab-challans\"');\n  286 |     expect(html).toContain('id=\"dc-form-title\"');\n  287 |     expect(html).toContain('id=\"dc-lines-container\"');\n    at /var/www/360lm/tests/sales_billing.spec.js:284:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:23.673Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-4fa44--present-in-Job-Detail-HTML-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 284
                      }
                    },
                    {
                      "workerIndex": 125,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 76,
                      "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\"renderChallansTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"renderChallansTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:284:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 284
                        },
                        "snippet": "  282 |     const ctx = await request.newContext();\n  283 |     const html = await (await ctx.get(BASE_URL)).text();\n> 284 |     expect(html).toContain('renderChallansTab()');\n      |                  ^\n  285 |     expect(html).toContain('id=\"tab-challans\"');\n  286 |     expect(html).toContain('id=\"dc-form-title\"');\n  287 |     expect(html).toContain('id=\"dc-lines-container\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 284
                          },
                          "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\"renderChallansTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  282 |     const ctx = await request.newContext();\n  283 |     const html = await (await ctx.get(BASE_URL)).text();\n> 284 |     expect(html).toContain('renderChallansTab()');\n      |                  ^\n  285 |     expect(html).toContain('id=\"tab-challans\"');\n  286 |     expect(html).toContain('id=\"dc-form-title\"');\n  287 |     expect(html).toContain('id=\"dc-lines-container\"');\n    at /var/www/360lm/tests/sales_billing.spec.js:284:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:24.800Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-4fa44--present-in-Job-Detail-HTML-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 284
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-3cf4a6bb8dae82700e28",
              "file": "sales_billing.spec.js",
              "line": 281,
              "column": 3
            },
            {
              "title": "three test challans exist with correct statuses",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 318,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 75,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:234:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 234
                        },
                        "snippet": "  232 |   test('three test challans exist with correct statuses', async () => {\n  233 |     const rows = await dbGet('/challans?challan_id=in.(bt-dc-1,bt-dc-2,bt-dc-3)&select=challan_id,challan_no,status,invoice_id,company&order=challan_id');\n> 234 |     expect(rows.length).toBe(3);\n      |                         ^\n  235 |     const byId = Object.fromEntries(rows.map(r => [r.challan_id, r]));\n  236 |     expect(byId['bt-dc-1'].status).toBe('open');\n  237 |     expect(byId['bt-dc-2'].status).toBe('delivered');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 234
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  232 |   test('three test challans exist with correct statuses', async () => {\n  233 |     const rows = await dbGet('/challans?challan_id=in.(bt-dc-1,bt-dc-2,bt-dc-3)&select=challan_id,challan_no,status,invoice_id,company&order=challan_id');\n> 234 |     expect(rows.length).toBe(3);\n      |                         ^\n  235 |     const byId = Object.fromEntries(rows.map(r => [r.challan_id, r]));\n  236 |     expect(byId['bt-dc-1'].status).toBe('open');\n  237 |     expect(byId['bt-dc-2'].status).toBe('delivered');\n    at /var/www/360lm/tests/sales_billing.spec.js:234:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:55.451Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-0974a-exist-with-correct-statuses-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 234
                      }
                    },
                    {
                      "workerIndex": 319,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 67,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:234:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 234
                        },
                        "snippet": "  232 |   test('three test challans exist with correct statuses', async () => {\n  233 |     const rows = await dbGet('/challans?challan_id=in.(bt-dc-1,bt-dc-2,bt-dc-3)&select=challan_id,challan_no,status,invoice_id,company&order=challan_id');\n> 234 |     expect(rows.length).toBe(3);\n      |                         ^\n  235 |     const byId = Object.fromEntries(rows.map(r => [r.challan_id, r]));\n  236 |     expect(byId['bt-dc-1'].status).toBe('open');\n  237 |     expect(byId['bt-dc-2'].status).toBe('delivered');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 234
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  232 |   test('three test challans exist with correct statuses', async () => {\n  233 |     const rows = await dbGet('/challans?challan_id=in.(bt-dc-1,bt-dc-2,bt-dc-3)&select=challan_id,challan_no,status,invoice_id,company&order=challan_id');\n> 234 |     expect(rows.length).toBe(3);\n      |                         ^\n  235 |     const byId = Object.fromEntries(rows.map(r => [r.challan_id, r]));\n  236 |     expect(byId['bt-dc-1'].status).toBe('open');\n  237 |     expect(byId['bt-dc-2'].status).toBe('delivered');\n    at /var/www/360lm/tests/sales_billing.spec.js:234:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:37:56.330Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-0974a-exist-with-correct-statuses-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 234
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-8bef41b31fb4c786c50d",
              "file": "sales_billing.spec.js",
              "line": 232,
              "column": 3
            },
            {
              "title": "delivered challan has delivered_at stamped",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 320,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 63,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'status')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'status')\n    at /var/www/360lm/tests/sales_billing.spec.js:247:20",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 20,
                          "line": 247
                        },
                        "snippet": "  245 |   test('delivered challan has delivered_at stamped', async () => {\n  246 |     const rows = await dbGet('/challans?challan_id=eq.bt-dc-2&select=status,delivered_at');\n> 247 |     expect(rows[0].status).toBe('delivered');\n      |                    ^\n  248 |     expect(rows[0].delivered_at).toBeTruthy();\n  249 |   });\n  250 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 20,
                            "line": 247
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'status')\n\n  245 |   test('delivered challan has delivered_at stamped', async () => {\n  246 |     const rows = await dbGet('/challans?challan_id=eq.bt-dc-2&select=status,delivered_at');\n> 247 |     expect(rows[0].status).toBe('delivered');\n      |                    ^\n  248 |     expect(rows[0].delivered_at).toBeTruthy();\n  249 |   });\n  250 |\n    at /var/www/360lm/tests/sales_billing.spec.js:247:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:57.204Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-17a7b-an-has-delivered-at-stamped-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 20,
                        "line": 247
                      }
                    },
                    {
                      "workerIndex": 321,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 60,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'status')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'status')\n    at /var/www/360lm/tests/sales_billing.spec.js:247:20",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 20,
                          "line": 247
                        },
                        "snippet": "  245 |   test('delivered challan has delivered_at stamped', async () => {\n  246 |     const rows = await dbGet('/challans?challan_id=eq.bt-dc-2&select=status,delivered_at');\n> 247 |     expect(rows[0].status).toBe('delivered');\n      |                    ^\n  248 |     expect(rows[0].delivered_at).toBeTruthy();\n  249 |   });\n  250 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 20,
                            "line": 247
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'status')\n\n  245 |   test('delivered challan has delivered_at stamped', async () => {\n  246 |     const rows = await dbGet('/challans?challan_id=eq.bt-dc-2&select=status,delivered_at');\n> 247 |     expect(rows[0].status).toBe('delivered');\n      |                    ^\n  248 |     expect(rows[0].delivered_at).toBeTruthy();\n  249 |   });\n  250 |\n    at /var/www/360lm/tests/sales_billing.spec.js:247:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:37:58.129Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-17a7b-an-has-delivered-at-stamped-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 20,
                        "line": 247
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-c860c10ce83e328b08fb",
              "file": "sales_billing.spec.js",
              "line": 245,
              "column": 3
            },
            {
              "title": "challan lines carry HSN/SAC + unit",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 322,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 72,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:253:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 253
                        },
                        "snippet": "  251 |   test('challan lines carry HSN/SAC + unit', async () => {\n  252 |     const rows = await dbGet('/challan_lines?challan_id=eq.bt-dc-1&select=element,hsn_sac,unit,qty&order=sr_no');\n> 253 |     expect(rows.length).toBe(3);\n      |                         ^\n  254 |     rows.forEach(r => {\n  255 |       expect(r.hsn_sac).toBeTruthy();\n  256 |       expect(r.unit).toBeTruthy();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 253
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  251 |   test('challan lines carry HSN/SAC + unit', async () => {\n  252 |     const rows = await dbGet('/challan_lines?challan_id=eq.bt-dc-1&select=element,hsn_sac,unit,qty&order=sr_no');\n> 253 |     expect(rows.length).toBe(3);\n      |                         ^\n  254 |     rows.forEach(r => {\n  255 |       expect(r.hsn_sac).toBeTruthy();\n  256 |       expect(r.unit).toBeTruthy();\n    at /var/www/360lm/tests/sales_billing.spec.js:253:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:37:59.031Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-d2de6-an-lines-carry-HSN-SAC-unit-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 253
                      }
                    },
                    {
                      "workerIndex": 323,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 99,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:253:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 253
                        },
                        "snippet": "  251 |   test('challan lines carry HSN/SAC + unit', async () => {\n  252 |     const rows = await dbGet('/challan_lines?challan_id=eq.bt-dc-1&select=element,hsn_sac,unit,qty&order=sr_no');\n> 253 |     expect(rows.length).toBe(3);\n      |                         ^\n  254 |     rows.forEach(r => {\n  255 |       expect(r.hsn_sac).toBeTruthy();\n  256 |       expect(r.unit).toBeTruthy();"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 253
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  251 |   test('challan lines carry HSN/SAC + unit', async () => {\n  252 |     const rows = await dbGet('/challan_lines?challan_id=eq.bt-dc-1&select=element,hsn_sac,unit,qty&order=sr_no');\n> 253 |     expect(rows.length).toBe(3);\n      |                         ^\n  254 |     rows.forEach(r => {\n  255 |       expect(r.hsn_sac).toBeTruthy();\n  256 |       expect(r.unit).toBeTruthy();\n    at /var/www/360lm/tests/sales_billing.spec.js:253:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:38:00.097Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-d2de6-an-lines-carry-HSN-SAC-unit-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 253
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-00bc5c2b0b6c975dc19b",
              "file": "sales_billing.spec.js",
              "line": 251,
              "column": 3
            },
            {
              "title": "challans_v view enriches with job_name + invoice_no",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 324,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 216,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'job_name')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'job_name')\n    at /var/www/360lm/tests/sales_billing.spec.js:264:15",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 15,
                          "line": 264
                        },
                        "snippet": "  262 |     const rows = await dbGet('/challans_v?challan_id=eq.bt-dc-2&select=challan_no,status,job_name,invoice_no,line_count');\n  263 |     const dc = rows[0];\n> 264 |     expect(dc.job_name).toBeTruthy();\n      |               ^\n  265 |     expect(dc.invoice_no).toBeTruthy();\n  266 |     expect(Number(dc.line_count)).toBe(2);\n  267 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 15,
                            "line": 264
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'job_name')\n\n  262 |     const rows = await dbGet('/challans_v?challan_id=eq.bt-dc-2&select=challan_no,status,job_name,invoice_no,line_count');\n  263 |     const dc = rows[0];\n> 264 |     expect(dc.job_name).toBeTruthy();\n      |               ^\n  265 |     expect(dc.invoice_no).toBeTruthy();\n  266 |     expect(Number(dc.line_count)).toBe(2);\n  267 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:264:15"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:01.421Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-2c922-es-with-job-name-invoice-no-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 15,
                        "line": 264
                      }
                    },
                    {
                      "workerIndex": 325,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 101,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'job_name')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'job_name')\n    at /var/www/360lm/tests/sales_billing.spec.js:264:15",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 15,
                          "line": 264
                        },
                        "snippet": "  262 |     const rows = await dbGet('/challans_v?challan_id=eq.bt-dc-2&select=challan_no,status,job_name,invoice_no,line_count');\n  263 |     const dc = rows[0];\n> 264 |     expect(dc.job_name).toBeTruthy();\n      |               ^\n  265 |     expect(dc.invoice_no).toBeTruthy();\n  266 |     expect(Number(dc.line_count)).toBe(2);\n  267 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 15,
                            "line": 264
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'job_name')\n\n  262 |     const rows = await dbGet('/challans_v?challan_id=eq.bt-dc-2&select=challan_no,status,job_name,invoice_no,line_count');\n  263 |     const dc = rows[0];\n> 264 |     expect(dc.job_name).toBeTruthy();\n      |               ^\n  265 |     expect(dc.invoice_no).toBeTruthy();\n  266 |     expect(Number(dc.line_count)).toBe(2);\n  267 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:264:15"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:38:03.542Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-2c922-es-with-job-name-invoice-no-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 15,
                        "line": 264
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-ff99621f738ad0cb3bdf",
              "file": "sales_billing.spec.js",
              "line": 261,
              "column": 3
            },
            {
              "title": "next_dc_no function generates DC-{COMPANY}/YY-YY/NNN format",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 326,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 108,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:04.840Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-e857101f0cba566e4ad8",
              "file": "sales_billing.spec.js",
              "line": 269,
              "column": 3
            },
            {
              "title": "Challans tab button present in Job Detail HTML",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 326,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 35,
                      "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\"renderChallansTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"renderChallansTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:284:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 284
                        },
                        "snippet": "  282 |     const ctx = await request.newContext();\n  283 |     const html = await (await ctx.get(BASE_URL)).text();\n> 284 |     expect(html).toContain('renderChallansTab()');\n      |                  ^\n  285 |     expect(html).toContain('id=\"tab-challans\"');\n  286 |     expect(html).toContain('id=\"dc-form-title\"');\n  287 |     expect(html).toContain('id=\"dc-lines-container\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 284
                          },
                          "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\"renderChallansTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  282 |     const ctx = await request.newContext();\n  283 |     const html = await (await ctx.get(BASE_URL)).text();\n> 284 |     expect(html).toContain('renderChallansTab()');\n      |                  ^\n  285 |     expect(html).toContain('id=\"tab-challans\"');\n  286 |     expect(html).toContain('id=\"dc-form-title\"');\n  287 |     expect(html).toContain('id=\"dc-lines-container\"');\n    at /var/www/360lm/tests/sales_billing.spec.js:284:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:04.996Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-4fa44--present-in-Job-Detail-HTML-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 284
                      }
                    },
                    {
                      "workerIndex": 327,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 58,
                      "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\"renderChallansTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"renderChallansTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:284:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 284
                        },
                        "snippet": "  282 |     const ctx = await request.newContext();\n  283 |     const html = await (await ctx.get(BASE_URL)).text();\n> 284 |     expect(html).toContain('renderChallansTab()');\n      |                  ^\n  285 |     expect(html).toContain('id=\"tab-challans\"');\n  286 |     expect(html).toContain('id=\"dc-form-title\"');\n  287 |     expect(html).toContain('id=\"dc-lines-container\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 284
                          },
                          "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\"renderChallansTab()\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  282 |     const ctx = await request.newContext();\n  283 |     const html = await (await ctx.get(BASE_URL)).text();\n> 284 |     expect(html).toContain('renderChallansTab()');\n      |                  ^\n  285 |     expect(html).toContain('id=\"tab-challans\"');\n  286 |     expect(html).toContain('id=\"dc-form-title\"');\n  287 |     expect(html).toContain('id=\"dc-lines-container\"');\n    at /var/www/360lm/tests/sales_billing.spec.js:284:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:38:06.074Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-4fa44--present-in-Job-Detail-HTML-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 284
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-240ca32fb39112171a1c",
              "file": "sales_billing.spec.js",
              "line": 281,
              "column": 3
            }
          ]
        },
        {
          "title": "Sales Billing — Stage G: Payments",
          "file": "sales_billing.spec.js",
          "line": 296,
          "column": 6,
          "specs": [
            {
              "title": "invoice_receipts exist for bt-inv-2 and bt-inv-3",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 126,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 63,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:299:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 299
                        },
                        "snippet": "  297 |   test('invoice_receipts exist for bt-inv-2 and bt-inv-3', async () => {\n  298 |     const rows = await dbGet('/invoice_receipts?invoice_id=in.(bt-inv-2,bt-inv-3)&select=invoice_id,amount,payment_mode,receipt_id&order=invoice_id,payment_date');\n> 299 |     expect(rows.length).toBe(3); // 1 for inv-2, 2 for inv-3\n      |                         ^\n  300 |     const inv2 = rows.filter(r => r.invoice_id === 'bt-inv-2');\n  301 |     const inv3 = rows.filter(r => r.invoice_id === 'bt-inv-3');\n  302 |     expect(inv2.length).toBe(1);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 299
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  297 |   test('invoice_receipts exist for bt-inv-2 and bt-inv-3', async () => {\n  298 |     const rows = await dbGet('/invoice_receipts?invoice_id=in.(bt-inv-2,bt-inv-3)&select=invoice_id,amount,payment_mode,receipt_id&order=invoice_id,payment_date');\n> 299 |     expect(rows.length).toBe(3); // 1 for inv-2, 2 for inv-3\n      |                         ^\n  300 |     const inv2 = rows.filter(r => r.invoice_id === 'bt-inv-2');\n  301 |     const inv3 = rows.filter(r => r.invoice_id === 'bt-inv-3');\n  302 |     expect(inv2.length).toBe(1);\n    at /var/www/360lm/tests/sales_billing.spec.js:299:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:25.929Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-84fcd-t-for-bt-inv-2-and-bt-inv-3-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 299
                      }
                    },
                    {
                      "workerIndex": 127,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 78,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:299:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 299
                        },
                        "snippet": "  297 |   test('invoice_receipts exist for bt-inv-2 and bt-inv-3', async () => {\n  298 |     const rows = await dbGet('/invoice_receipts?invoice_id=in.(bt-inv-2,bt-inv-3)&select=invoice_id,amount,payment_mode,receipt_id&order=invoice_id,payment_date');\n> 299 |     expect(rows.length).toBe(3); // 1 for inv-2, 2 for inv-3\n      |                         ^\n  300 |     const inv2 = rows.filter(r => r.invoice_id === 'bt-inv-2');\n  301 |     const inv3 = rows.filter(r => r.invoice_id === 'bt-inv-3');\n  302 |     expect(inv2.length).toBe(1);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 299
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  297 |   test('invoice_receipts exist for bt-inv-2 and bt-inv-3', async () => {\n  298 |     const rows = await dbGet('/invoice_receipts?invoice_id=in.(bt-inv-2,bt-inv-3)&select=invoice_id,amount,payment_mode,receipt_id&order=invoice_id,payment_date');\n> 299 |     expect(rows.length).toBe(3); // 1 for inv-2, 2 for inv-3\n      |                         ^\n  300 |     const inv2 = rows.filter(r => r.invoice_id === 'bt-inv-2');\n  301 |     const inv3 = rows.filter(r => r.invoice_id === 'bt-inv-3');\n  302 |     expect(inv2.length).toBe(1);\n    at /var/www/360lm/tests/sales_billing.spec.js:299:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:26.808Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-84fcd-t-for-bt-inv-2-and-bt-inv-3-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 299
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-c3e7c7db489c059d6bec",
              "file": "sales_billing.spec.js",
              "line": 297,
              "column": 3
            },
            {
              "title": "invoice_payment_summary shows correct paid_amount and balance_due",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 128,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 62,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'paid_amount')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'paid_amount')\n    at /var/www/360lm/tests/sales_billing.spec.js:314:36",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 36,
                          "line": 314
                        },
                        "snippet": "  312 |     const byId = Object.fromEntries(rows.map(r => [r.invoice_id, r]));\n  313 |     // Invoice 2: partial — 107085 paid of 214170\n> 314 |     expect(Number(byId['bt-inv-2'].paid_amount)).toBeCloseTo(107085, 0);\n      |                                    ^\n  315 |     expect(Number(byId['bt-inv-2'].balance_due)).toBeCloseTo(107085, 0);\n  316 |     expect(byId['bt-inv-2'].status).toBe('issued');\n  317 |     // Invoice 3: fully paid"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 36,
                            "line": 314
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'paid_amount')\n\n  312 |     const byId = Object.fromEntries(rows.map(r => [r.invoice_id, r]));\n  313 |     // Invoice 2: partial — 107085 paid of 214170\n> 314 |     expect(Number(byId['bt-inv-2'].paid_amount)).toBeCloseTo(107085, 0);\n      |                                    ^\n  315 |     expect(Number(byId['bt-inv-2'].balance_due)).toBeCloseTo(107085, 0);\n  316 |     expect(byId['bt-inv-2'].status).toBe('issued');\n  317 |     // Invoice 3: fully paid\n    at /var/www/360lm/tests/sales_billing.spec.js:314:36"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:27.722Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-aede4-paid-amount-and-balance-due-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 36,
                        "line": 314
                      }
                    },
                    {
                      "workerIndex": 129,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 61,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'paid_amount')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'paid_amount')\n    at /var/www/360lm/tests/sales_billing.spec.js:314:36",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 36,
                          "line": 314
                        },
                        "snippet": "  312 |     const byId = Object.fromEntries(rows.map(r => [r.invoice_id, r]));\n  313 |     // Invoice 2: partial — 107085 paid of 214170\n> 314 |     expect(Number(byId['bt-inv-2'].paid_amount)).toBeCloseTo(107085, 0);\n      |                                    ^\n  315 |     expect(Number(byId['bt-inv-2'].balance_due)).toBeCloseTo(107085, 0);\n  316 |     expect(byId['bt-inv-2'].status).toBe('issued');\n  317 |     // Invoice 3: fully paid"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 36,
                            "line": 314
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'paid_amount')\n\n  312 |     const byId = Object.fromEntries(rows.map(r => [r.invoice_id, r]));\n  313 |     // Invoice 2: partial — 107085 paid of 214170\n> 314 |     expect(Number(byId['bt-inv-2'].paid_amount)).toBeCloseTo(107085, 0);\n      |                                    ^\n  315 |     expect(Number(byId['bt-inv-2'].balance_due)).toBeCloseTo(107085, 0);\n  316 |     expect(byId['bt-inv-2'].status).toBe('issued');\n  317 |     // Invoice 3: fully paid\n    at /var/www/360lm/tests/sales_billing.spec.js:314:36"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:28.656Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-aede4-paid-amount-and-balance-due-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 36,
                        "line": 314
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-e561eefd6ff3aa3e9e25",
              "file": "sales_billing.spec.js",
              "line": 310,
              "column": 3
            },
            {
              "title": "auto-paid: new receipt that covers balance flips invoice to paid",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 130,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 69,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m201\u001b[39m\nReceived: \u001b[31m409\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m201\u001b[39m\nReceived: \u001b[31m409\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:334:20",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 20,
                          "line": 334
                        },
                        "snippet": "  332 |       created_by:   'pw-test',\n  333 |     });\n> 334 |     expect(status).toBe(201);\n      |                    ^\n  335 |\n  336 |     // Trigger auto-paid check\n  337 |     const invRows = await dbGet('/invoices?invoice_id=eq.bt-inv-2&select=status,paid_at');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 20,
                            "line": 334
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m201\u001b[39m\nReceived: \u001b[31m409\u001b[39m\n\n  332 |       created_by:   'pw-test',\n  333 |     });\n> 334 |     expect(status).toBe(201);\n      |                    ^\n  335 |\n  336 |     // Trigger auto-paid check\n  337 |     const invRows = await dbGet('/invoices?invoice_id=eq.bt-inv-2&select=status,paid_at');\n    at /var/www/360lm/tests/sales_billing.spec.js:334:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:29.632Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-71b2a-lance-flips-invoice-to-paid-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 20,
                        "line": 334
                      }
                    },
                    {
                      "workerIndex": 131,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 73,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m201\u001b[39m\nReceived: \u001b[31m409\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m201\u001b[39m\nReceived: \u001b[31m409\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:334:20",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 20,
                          "line": 334
                        },
                        "snippet": "  332 |       created_by:   'pw-test',\n  333 |     });\n> 334 |     expect(status).toBe(201);\n      |                    ^\n  335 |\n  336 |     // Trigger auto-paid check\n  337 |     const invRows = await dbGet('/invoices?invoice_id=eq.bt-inv-2&select=status,paid_at');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 20,
                            "line": 334
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m201\u001b[39m\nReceived: \u001b[31m409\u001b[39m\n\n  332 |       created_by:   'pw-test',\n  333 |     });\n> 334 |     expect(status).toBe(201);\n      |                    ^\n  335 |\n  336 |     // Trigger auto-paid check\n  337 |     const invRows = await dbGet('/invoices?invoice_id=eq.bt-inv-2&select=status,paid_at');\n    at /var/www/360lm/tests/sales_billing.spec.js:334:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:30.625Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-71b2a-lance-flips-invoice-to-paid-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 20,
                        "line": 334
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-571809ded6a7b853d314",
              "file": "sales_billing.spec.js",
              "line": 322,
              "column": 3
            },
            {
              "title": "invoice_payment_summary view updates after receipt insert",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 132,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 91,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'balance_due')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'balance_due')\n    at /var/www/360lm/tests/sales_billing.spec.js:349:40",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 40,
                          "line": 349
                        },
                        "snippet": "  347 |   test('invoice_payment_summary view updates after receipt insert', async () => {\n  348 |     const before = await dbGet('/invoice_payment_summary?invoice_id=eq.bt-inv-2');\n> 349 |     const balBefore = Number(before[0].balance_due);\n      |                                        ^\n  350 |     expect(balBefore).toBeGreaterThan(0);\n  351 |     // Add a small part-payment\n  352 |     const probeId = 'bt-partial-' + RUN_ID;"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 40,
                            "line": 349
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'balance_due')\n\n  347 |   test('invoice_payment_summary view updates after receipt insert', async () => {\n  348 |     const before = await dbGet('/invoice_payment_summary?invoice_id=eq.bt-inv-2');\n> 349 |     const balBefore = Number(before[0].balance_due);\n      |                                        ^\n  350 |     expect(balBefore).toBeGreaterThan(0);\n  351 |     // Add a small part-payment\n  352 |     const probeId = 'bt-partial-' + RUN_ID;\n    at /var/www/360lm/tests/sales_billing.spec.js:349:40"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:31.696Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-a58f6-pdates-after-receipt-insert-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 40,
                        "line": 349
                      }
                    },
                    {
                      "workerIndex": 133,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 66,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'balance_due')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'balance_due')\n    at /var/www/360lm/tests/sales_billing.spec.js:349:40",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 40,
                          "line": 349
                        },
                        "snippet": "  347 |   test('invoice_payment_summary view updates after receipt insert', async () => {\n  348 |     const before = await dbGet('/invoice_payment_summary?invoice_id=eq.bt-inv-2');\n> 349 |     const balBefore = Number(before[0].balance_due);\n      |                                        ^\n  350 |     expect(balBefore).toBeGreaterThan(0);\n  351 |     // Add a small part-payment\n  352 |     const probeId = 'bt-partial-' + RUN_ID;"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 40,
                            "line": 349
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'balance_due')\n\n  347 |   test('invoice_payment_summary view updates after receipt insert', async () => {\n  348 |     const before = await dbGet('/invoice_payment_summary?invoice_id=eq.bt-inv-2');\n> 349 |     const balBefore = Number(before[0].balance_due);\n      |                                        ^\n  350 |     expect(balBefore).toBeGreaterThan(0);\n  351 |     // Add a small part-payment\n  352 |     const probeId = 'bt-partial-' + RUN_ID;\n    at /var/www/360lm/tests/sales_billing.spec.js:349:40"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:32.851Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-a58f6-pdates-after-receipt-insert-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 40,
                        "line": 349
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-4a78ae2627186e07b098",
              "file": "sales_billing.spec.js",
              "line": 347,
              "column": 3
            },
            {
              "title": "payment modal present in HTML",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 134,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 70,
                      "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\"id=\\\"modal-payment\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"modal-payment\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:366:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 366
                        },
                        "snippet": "  364 |     const ctx = await request.newContext();\n  365 |     const html = await (await ctx.get(BASE_URL)).text();\n> 366 |     expect(html).toContain('id=\"modal-payment\"');\n      |                  ^\n  367 |     expect(html).toContain('id=\"pay-amount\"');\n  368 |     expect(html).toContain('id=\"pay-mode\"');\n  369 |     expect(html).toContain('id=\"pay-ref\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 366
                          },
                          "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\"id=\\\"modal-payment\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  364 |     const ctx = await request.newContext();\n  365 |     const html = await (await ctx.get(BASE_URL)).text();\n> 366 |     expect(html).toContain('id=\"modal-payment\"');\n      |                  ^\n  367 |     expect(html).toContain('id=\"pay-amount\"');\n  368 |     expect(html).toContain('id=\"pay-mode\"');\n  369 |     expect(html).toContain('id=\"pay-ref\"');\n    at /var/www/360lm/tests/sales_billing.spec.js:366:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:33.865Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-afa01-yment-modal-present-in-HTML-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 366
                      }
                    },
                    {
                      "workerIndex": 135,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 74,
                      "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\"id=\\\"modal-payment\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"modal-payment\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:366:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 366
                        },
                        "snippet": "  364 |     const ctx = await request.newContext();\n  365 |     const html = await (await ctx.get(BASE_URL)).text();\n> 366 |     expect(html).toContain('id=\"modal-payment\"');\n      |                  ^\n  367 |     expect(html).toContain('id=\"pay-amount\"');\n  368 |     expect(html).toContain('id=\"pay-mode\"');\n  369 |     expect(html).toContain('id=\"pay-ref\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 366
                          },
                          "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\"id=\\\"modal-payment\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  364 |     const ctx = await request.newContext();\n  365 |     const html = await (await ctx.get(BASE_URL)).text();\n> 366 |     expect(html).toContain('id=\"modal-payment\"');\n      |                  ^\n  367 |     expect(html).toContain('id=\"pay-amount\"');\n  368 |     expect(html).toContain('id=\"pay-mode\"');\n  369 |     expect(html).toContain('id=\"pay-ref\"');\n    at /var/www/360lm/tests/sales_billing.spec.js:366:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:34.938Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-afa01-yment-modal-present-in-HTML-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 366
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-d305efc466173a28c889",
              "file": "sales_billing.spec.js",
              "line": 363,
              "column": 3
            },
            {
              "title": "Custodian invoice-link fields present in custodian HTML",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 136,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 83,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:35.962Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-f0d76067f824e128e747",
              "file": "sales_billing.spec.js",
              "line": 374,
              "column": 3
            },
            {
              "title": "invoice_receipts exist for bt-inv-2 and bt-inv-3",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 328,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 77,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:299:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 299
                        },
                        "snippet": "  297 |   test('invoice_receipts exist for bt-inv-2 and bt-inv-3', async () => {\n  298 |     const rows = await dbGet('/invoice_receipts?invoice_id=in.(bt-inv-2,bt-inv-3)&select=invoice_id,amount,payment_mode,receipt_id&order=invoice_id,payment_date');\n> 299 |     expect(rows.length).toBe(3); // 1 for inv-2, 2 for inv-3\n      |                         ^\n  300 |     const inv2 = rows.filter(r => r.invoice_id === 'bt-inv-2');\n  301 |     const inv3 = rows.filter(r => r.invoice_id === 'bt-inv-3');\n  302 |     expect(inv2.length).toBe(1);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 299
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  297 |   test('invoice_receipts exist for bt-inv-2 and bt-inv-3', async () => {\n  298 |     const rows = await dbGet('/invoice_receipts?invoice_id=in.(bt-inv-2,bt-inv-3)&select=invoice_id,amount,payment_mode,receipt_id&order=invoice_id,payment_date');\n> 299 |     expect(rows.length).toBe(3); // 1 for inv-2, 2 for inv-3\n      |                         ^\n  300 |     const inv2 = rows.filter(r => r.invoice_id === 'bt-inv-2');\n  301 |     const inv3 = rows.filter(r => r.invoice_id === 'bt-inv-3');\n  302 |     expect(inv2.length).toBe(1);\n    at /var/www/360lm/tests/sales_billing.spec.js:299:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:07.015Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-84fcd-t-for-bt-inv-2-and-bt-inv-3-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 299
                      }
                    },
                    {
                      "workerIndex": 329,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 85,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:299:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 299
                        },
                        "snippet": "  297 |   test('invoice_receipts exist for bt-inv-2 and bt-inv-3', async () => {\n  298 |     const rows = await dbGet('/invoice_receipts?invoice_id=in.(bt-inv-2,bt-inv-3)&select=invoice_id,amount,payment_mode,receipt_id&order=invoice_id,payment_date');\n> 299 |     expect(rows.length).toBe(3); // 1 for inv-2, 2 for inv-3\n      |                         ^\n  300 |     const inv2 = rows.filter(r => r.invoice_id === 'bt-inv-2');\n  301 |     const inv3 = rows.filter(r => r.invoice_id === 'bt-inv-3');\n  302 |     expect(inv2.length).toBe(1);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 299
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m3\u001b[39m\nReceived: \u001b[31m0\u001b[39m\n\n  297 |   test('invoice_receipts exist for bt-inv-2 and bt-inv-3', async () => {\n  298 |     const rows = await dbGet('/invoice_receipts?invoice_id=in.(bt-inv-2,bt-inv-3)&select=invoice_id,amount,payment_mode,receipt_id&order=invoice_id,payment_date');\n> 299 |     expect(rows.length).toBe(3); // 1 for inv-2, 2 for inv-3\n      |                         ^\n  300 |     const inv2 = rows.filter(r => r.invoice_id === 'bt-inv-2');\n  301 |     const inv3 = rows.filter(r => r.invoice_id === 'bt-inv-3');\n  302 |     expect(inv2.length).toBe(1);\n    at /var/www/360lm/tests/sales_billing.spec.js:299:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:38:08.255Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-84fcd-t-for-bt-inv-2-and-bt-inv-3-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 299
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-e04968d7229caaec0557",
              "file": "sales_billing.spec.js",
              "line": 297,
              "column": 3
            },
            {
              "title": "invoice_payment_summary shows correct paid_amount and balance_due",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 330,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 57,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'paid_amount')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'paid_amount')\n    at /var/www/360lm/tests/sales_billing.spec.js:314:36",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 36,
                          "line": 314
                        },
                        "snippet": "  312 |     const byId = Object.fromEntries(rows.map(r => [r.invoice_id, r]));\n  313 |     // Invoice 2: partial — 107085 paid of 214170\n> 314 |     expect(Number(byId['bt-inv-2'].paid_amount)).toBeCloseTo(107085, 0);\n      |                                    ^\n  315 |     expect(Number(byId['bt-inv-2'].balance_due)).toBeCloseTo(107085, 0);\n  316 |     expect(byId['bt-inv-2'].status).toBe('issued');\n  317 |     // Invoice 3: fully paid"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 36,
                            "line": 314
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'paid_amount')\n\n  312 |     const byId = Object.fromEntries(rows.map(r => [r.invoice_id, r]));\n  313 |     // Invoice 2: partial — 107085 paid of 214170\n> 314 |     expect(Number(byId['bt-inv-2'].paid_amount)).toBeCloseTo(107085, 0);\n      |                                    ^\n  315 |     expect(Number(byId['bt-inv-2'].balance_due)).toBeCloseTo(107085, 0);\n  316 |     expect(byId['bt-inv-2'].status).toBe('issued');\n  317 |     // Invoice 3: fully paid\n    at /var/www/360lm/tests/sales_billing.spec.js:314:36"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:09.473Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-aede4-paid-amount-and-balance-due-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 36,
                        "line": 314
                      }
                    },
                    {
                      "workerIndex": 331,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 59,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'paid_amount')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'paid_amount')\n    at /var/www/360lm/tests/sales_billing.spec.js:314:36",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 36,
                          "line": 314
                        },
                        "snippet": "  312 |     const byId = Object.fromEntries(rows.map(r => [r.invoice_id, r]));\n  313 |     // Invoice 2: partial — 107085 paid of 214170\n> 314 |     expect(Number(byId['bt-inv-2'].paid_amount)).toBeCloseTo(107085, 0);\n      |                                    ^\n  315 |     expect(Number(byId['bt-inv-2'].balance_due)).toBeCloseTo(107085, 0);\n  316 |     expect(byId['bt-inv-2'].status).toBe('issued');\n  317 |     // Invoice 3: fully paid"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 36,
                            "line": 314
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'paid_amount')\n\n  312 |     const byId = Object.fromEntries(rows.map(r => [r.invoice_id, r]));\n  313 |     // Invoice 2: partial — 107085 paid of 214170\n> 314 |     expect(Number(byId['bt-inv-2'].paid_amount)).toBeCloseTo(107085, 0);\n      |                                    ^\n  315 |     expect(Number(byId['bt-inv-2'].balance_due)).toBeCloseTo(107085, 0);\n  316 |     expect(byId['bt-inv-2'].status).toBe('issued');\n  317 |     // Invoice 3: fully paid\n    at /var/www/360lm/tests/sales_billing.spec.js:314:36"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:38:10.479Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-aede4-paid-amount-and-balance-due-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 36,
                        "line": 314
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-4f57e585d0d376f992f1",
              "file": "sales_billing.spec.js",
              "line": 310,
              "column": 3
            },
            {
              "title": "auto-paid: new receipt that covers balance flips invoice to paid",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 332,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 94,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m201\u001b[39m\nReceived: \u001b[31m409\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m201\u001b[39m\nReceived: \u001b[31m409\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:334:20",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 20,
                          "line": 334
                        },
                        "snippet": "  332 |       created_by:   'pw-test',\n  333 |     });\n> 334 |     expect(status).toBe(201);\n      |                    ^\n  335 |\n  336 |     // Trigger auto-paid check\n  337 |     const invRows = await dbGet('/invoices?invoice_id=eq.bt-inv-2&select=status,paid_at');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 20,
                            "line": 334
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m201\u001b[39m\nReceived: \u001b[31m409\u001b[39m\n\n  332 |       created_by:   'pw-test',\n  333 |     });\n> 334 |     expect(status).toBe(201);\n      |                    ^\n  335 |\n  336 |     // Trigger auto-paid check\n  337 |     const invRows = await dbGet('/invoices?invoice_id=eq.bt-inv-2&select=status,paid_at');\n    at /var/www/360lm/tests/sales_billing.spec.js:334:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:11.441Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-71b2a-lance-flips-invoice-to-paid-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 20,
                        "line": 334
                      }
                    },
                    {
                      "workerIndex": 333,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 79,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m201\u001b[39m\nReceived: \u001b[31m409\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m201\u001b[39m\nReceived: \u001b[31m409\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:334:20",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 20,
                          "line": 334
                        },
                        "snippet": "  332 |       created_by:   'pw-test',\n  333 |     });\n> 334 |     expect(status).toBe(201);\n      |                    ^\n  335 |\n  336 |     // Trigger auto-paid check\n  337 |     const invRows = await dbGet('/invoices?invoice_id=eq.bt-inv-2&select=status,paid_at');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 20,
                            "line": 334
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m201\u001b[39m\nReceived: \u001b[31m409\u001b[39m\n\n  332 |       created_by:   'pw-test',\n  333 |     });\n> 334 |     expect(status).toBe(201);\n      |                    ^\n  335 |\n  336 |     // Trigger auto-paid check\n  337 |     const invRows = await dbGet('/invoices?invoice_id=eq.bt-inv-2&select=status,paid_at');\n    at /var/www/360lm/tests/sales_billing.spec.js:334:20"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:38:12.513Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-71b2a-lance-flips-invoice-to-paid-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 20,
                        "line": 334
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-db8ce2afdc7db14c029c",
              "file": "sales_billing.spec.js",
              "line": 322,
              "column": 3
            },
            {
              "title": "invoice_payment_summary view updates after receipt insert",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 334,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 68,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'balance_due')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'balance_due')\n    at /var/www/360lm/tests/sales_billing.spec.js:349:40",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 40,
                          "line": 349
                        },
                        "snippet": "  347 |   test('invoice_payment_summary view updates after receipt insert', async () => {\n  348 |     const before = await dbGet('/invoice_payment_summary?invoice_id=eq.bt-inv-2');\n> 349 |     const balBefore = Number(before[0].balance_due);\n      |                                        ^\n  350 |     expect(balBefore).toBeGreaterThan(0);\n  351 |     // Add a small part-payment\n  352 |     const probeId = 'bt-partial-' + RUN_ID;"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 40,
                            "line": 349
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'balance_due')\n\n  347 |   test('invoice_payment_summary view updates after receipt insert', async () => {\n  348 |     const before = await dbGet('/invoice_payment_summary?invoice_id=eq.bt-inv-2');\n> 349 |     const balBefore = Number(before[0].balance_due);\n      |                                        ^\n  350 |     expect(balBefore).toBeGreaterThan(0);\n  351 |     // Add a small part-payment\n  352 |     const probeId = 'bt-partial-' + RUN_ID;\n    at /var/www/360lm/tests/sales_billing.spec.js:349:40"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:13.635Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-a58f6-pdates-after-receipt-insert-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 40,
                        "line": 349
                      }
                    },
                    {
                      "workerIndex": 335,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 71,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'balance_due')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'balance_due')\n    at /var/www/360lm/tests/sales_billing.spec.js:349:40",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 40,
                          "line": 349
                        },
                        "snippet": "  347 |   test('invoice_payment_summary view updates after receipt insert', async () => {\n  348 |     const before = await dbGet('/invoice_payment_summary?invoice_id=eq.bt-inv-2');\n> 349 |     const balBefore = Number(before[0].balance_due);\n      |                                        ^\n  350 |     expect(balBefore).toBeGreaterThan(0);\n  351 |     // Add a small part-payment\n  352 |     const probeId = 'bt-partial-' + RUN_ID;"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 40,
                            "line": 349
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'balance_due')\n\n  347 |   test('invoice_payment_summary view updates after receipt insert', async () => {\n  348 |     const before = await dbGet('/invoice_payment_summary?invoice_id=eq.bt-inv-2');\n> 349 |     const balBefore = Number(before[0].balance_due);\n      |                                        ^\n  350 |     expect(balBefore).toBeGreaterThan(0);\n  351 |     // Add a small part-payment\n  352 |     const probeId = 'bt-partial-' + RUN_ID;\n    at /var/www/360lm/tests/sales_billing.spec.js:349:40"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:38:14.611Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-a58f6-pdates-after-receipt-insert-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 40,
                        "line": 349
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-faac141af811ac6cb375",
              "file": "sales_billing.spec.js",
              "line": 347,
              "column": 3
            },
            {
              "title": "payment modal present in HTML",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 336,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 86,
                      "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\"id=\\\"modal-payment\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"modal-payment\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:366:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 366
                        },
                        "snippet": "  364 |     const ctx = await request.newContext();\n  365 |     const html = await (await ctx.get(BASE_URL)).text();\n> 366 |     expect(html).toContain('id=\"modal-payment\"');\n      |                  ^\n  367 |     expect(html).toContain('id=\"pay-amount\"');\n  368 |     expect(html).toContain('id=\"pay-mode\"');\n  369 |     expect(html).toContain('id=\"pay-ref\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 366
                          },
                          "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\"id=\\\"modal-payment\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  364 |     const ctx = await request.newContext();\n  365 |     const html = await (await ctx.get(BASE_URL)).text();\n> 366 |     expect(html).toContain('id=\"modal-payment\"');\n      |                  ^\n  367 |     expect(html).toContain('id=\"pay-amount\"');\n  368 |     expect(html).toContain('id=\"pay-mode\"');\n  369 |     expect(html).toContain('id=\"pay-ref\"');\n    at /var/www/360lm/tests/sales_billing.spec.js:366:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:15.616Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-afa01-yment-modal-present-in-HTML-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 366
                      }
                    },
                    {
                      "workerIndex": 337,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 65,
                      "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\"id=\\\"modal-payment\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"modal-payment\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:366:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 366
                        },
                        "snippet": "  364 |     const ctx = await request.newContext();\n  365 |     const html = await (await ctx.get(BASE_URL)).text();\n> 366 |     expect(html).toContain('id=\"modal-payment\"');\n      |                  ^\n  367 |     expect(html).toContain('id=\"pay-amount\"');\n  368 |     expect(html).toContain('id=\"pay-mode\"');\n  369 |     expect(html).toContain('id=\"pay-ref\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 366
                          },
                          "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\"id=\\\"modal-payment\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  364 |     const ctx = await request.newContext();\n  365 |     const html = await (await ctx.get(BASE_URL)).text();\n> 366 |     expect(html).toContain('id=\"modal-payment\"');\n      |                  ^\n  367 |     expect(html).toContain('id=\"pay-amount\"');\n  368 |     expect(html).toContain('id=\"pay-mode\"');\n  369 |     expect(html).toContain('id=\"pay-ref\"');\n    at /var/www/360lm/tests/sales_billing.spec.js:366:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:38:16.691Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-afa01-yment-modal-present-in-HTML-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 366
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-894a2804f368c26801d7",
              "file": "sales_billing.spec.js",
              "line": 363,
              "column": 3
            },
            {
              "title": "Custodian invoice-link fields present in custodian HTML",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 338,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 79,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:17.721Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-bbc2492678fd51052174",
              "file": "sales_billing.spec.js",
              "line": 374,
              "column": 3
            }
          ]
        },
        {
          "title": "Sales Billing — Cross-PWA: Stores ↔ Sales",
          "file": "sales_billing.spec.js",
          "line": 391,
          "column": 6,
          "specs": [
            {
              "title": "stores.inward has status + payment trigger working",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 136,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 22,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:36.092Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-09c749d6969f04b86517",
              "file": "sales_billing.spec.js",
              "line": 392,
              "column": 3
            },
            {
              "title": "payables_kpi view returns non-error",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 136,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 20,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:36.146Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-0cd5316f53944532e69f",
              "file": "sales_billing.spec.js",
              "line": 397,
              "column": 3
            },
            {
              "title": "job_material_cost rolls up issues per job",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 136,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 20,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:406:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 406
                        },
                        "snippet": "  404 |   test('job_material_cost rolls up issues per job', async () => {\n  405 |     const rows = await dbGet('/job_material_cost?job_id=in.(bt-job-b,bt-job-c)&order=job_id');\n> 406 |     expect(rows.length).toBe(2);\n      |                         ^\n  407 |     const byId = Object.fromEntries(rows.map(r => [r.job_id, r]));\n  408 |     // bt-job-b: 500 flex @70 + 80 standee @250 = 35000 + 20000 = 55000\n  409 |     expect(Number(byId['bt-job-b'].material_cost)).toBeCloseTo(55000, 0);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 406
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  404 |   test('job_material_cost rolls up issues per job', async () => {\n  405 |     const rows = await dbGet('/job_material_cost?job_id=in.(bt-job-b,bt-job-c)&order=job_id');\n> 406 |     expect(rows.length).toBe(2);\n      |                         ^\n  407 |     const byId = Object.fromEntries(rows.map(r => [r.job_id, r]));\n  408 |     // bt-job-b: 500 flex @70 + 80 standee @250 = 35000 + 20000 = 55000\n  409 |     expect(Number(byId['bt-job-b'].material_cost)).toBeCloseTo(55000, 0);\n    at /var/www/360lm/tests/sales_billing.spec.js:406:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:36.189Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-82d2b-ost-rolls-up-issues-per-job-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 406
                      }
                    },
                    {
                      "workerIndex": 137,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 62,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:406:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 406
                        },
                        "snippet": "  404 |   test('job_material_cost rolls up issues per job', async () => {\n  405 |     const rows = await dbGet('/job_material_cost?job_id=in.(bt-job-b,bt-job-c)&order=job_id');\n> 406 |     expect(rows.length).toBe(2);\n      |                         ^\n  407 |     const byId = Object.fromEntries(rows.map(r => [r.job_id, r]));\n  408 |     // bt-job-b: 500 flex @70 + 80 standee @250 = 35000 + 20000 = 55000\n  409 |     expect(Number(byId['bt-job-b'].material_cost)).toBeCloseTo(55000, 0);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 406
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  404 |   test('job_material_cost rolls up issues per job', async () => {\n  405 |     const rows = await dbGet('/job_material_cost?job_id=in.(bt-job-b,bt-job-c)&order=job_id');\n> 406 |     expect(rows.length).toBe(2);\n      |                         ^\n  407 |     const byId = Object.fromEntries(rows.map(r => [r.job_id, r]));\n  408 |     // bt-job-b: 500 flex @70 + 80 standee @250 = 35000 + 20000 = 55000\n  409 |     expect(Number(byId['bt-job-b'].material_cost)).toBeCloseTo(55000, 0);\n    at /var/www/360lm/tests/sales_billing.spec.js:406:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:37.036Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-82d2b-ost-rolls-up-issues-per-job-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 406
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-f7eca347bf4ebd1cffa6",
              "file": "sales_billing.spec.js",
              "line": 404,
              "column": 3
            },
            {
              "title": "job_profitability_v shows positive margin for paid invoice",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 138,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 81,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')\n    at /var/www/360lm/tests/sales_billing.spec.js:419:21",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 21,
                          "line": 419
                        },
                        "snippet": "  417 |     const rows = await dbGet('/job_profitability_v?job_id=eq.bt-job-b');\n  418 |     const p = rows[0];\n> 419 |     expect(Number(p.invoiced_amount)).toBeCloseTo(1002056, 0);\n      |                     ^\n  420 |     expect(Number(p.collected_amount)).toBeCloseTo(1002056, 0);\n  421 |     expect(Number(p.material_cost)).toBeCloseTo(55000, 0);\n  422 |     expect(Number(p.gross_margin)).toBeCloseTo(947056, 0);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 21,
                            "line": 419
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')\n\n  417 |     const rows = await dbGet('/job_profitability_v?job_id=eq.bt-job-b');\n  418 |     const p = rows[0];\n> 419 |     expect(Number(p.invoiced_amount)).toBeCloseTo(1002056, 0);\n      |                     ^\n  420 |     expect(Number(p.collected_amount)).toBeCloseTo(1002056, 0);\n  421 |     expect(Number(p.material_cost)).toBeCloseTo(55000, 0);\n  422 |     expect(Number(p.gross_margin)).toBeCloseTo(947056, 0);\n    at /var/www/360lm/tests/sales_billing.spec.js:419:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:38.000Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-9abe5-ive-margin-for-paid-invoice-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 21,
                        "line": 419
                      }
                    },
                    {
                      "workerIndex": 139,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 57,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')\n    at /var/www/360lm/tests/sales_billing.spec.js:419:21",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 21,
                          "line": 419
                        },
                        "snippet": "  417 |     const rows = await dbGet('/job_profitability_v?job_id=eq.bt-job-b');\n  418 |     const p = rows[0];\n> 419 |     expect(Number(p.invoiced_amount)).toBeCloseTo(1002056, 0);\n      |                     ^\n  420 |     expect(Number(p.collected_amount)).toBeCloseTo(1002056, 0);\n  421 |     expect(Number(p.material_cost)).toBeCloseTo(55000, 0);\n  422 |     expect(Number(p.gross_margin)).toBeCloseTo(947056, 0);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 21,
                            "line": 419
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')\n\n  417 |     const rows = await dbGet('/job_profitability_v?job_id=eq.bt-job-b');\n  418 |     const p = rows[0];\n> 419 |     expect(Number(p.invoiced_amount)).toBeCloseTo(1002056, 0);\n      |                     ^\n  420 |     expect(Number(p.collected_amount)).toBeCloseTo(1002056, 0);\n  421 |     expect(Number(p.material_cost)).toBeCloseTo(55000, 0);\n  422 |     expect(Number(p.gross_margin)).toBeCloseTo(947056, 0);\n    at /var/www/360lm/tests/sales_billing.spec.js:419:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:38.874Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-9abe5-ive-margin-for-paid-invoice-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 21,
                        "line": 419
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-b7af5bce65a8f1bfb222",
              "file": "sales_billing.spec.js",
              "line": 416,
              "column": 3
            },
            {
              "title": "job_profitability_v shows negative margin when only costs (no invoice)",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 140,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 61,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')\n    at /var/www/360lm/tests/sales_billing.spec.js:429:21",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 21,
                          "line": 429
                        },
                        "snippet": "  427 |     const rows = await dbGet('/job_profitability_v?job_id=eq.bt-job-c');\n  428 |     const p = rows[0];\n> 429 |     expect(Number(p.invoiced_amount)).toBe(0);\n      |                     ^\n  430 |     expect(Number(p.material_cost)).toBeCloseTo(29000, 0);\n  431 |     expect(Number(p.gross_margin)).toBeCloseTo(-29000, 0);\n  432 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 21,
                            "line": 429
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')\n\n  427 |     const rows = await dbGet('/job_profitability_v?job_id=eq.bt-job-c');\n  428 |     const p = rows[0];\n> 429 |     expect(Number(p.invoiced_amount)).toBe(0);\n      |                     ^\n  430 |     expect(Number(p.material_cost)).toBeCloseTo(29000, 0);\n  431 |     expect(Number(p.gross_margin)).toBeCloseTo(-29000, 0);\n  432 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:429:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:39.789Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-d695a-when-only-costs-no-invoice--android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 21,
                        "line": 429
                      }
                    },
                    {
                      "workerIndex": 141,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 66,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')\n    at /var/www/360lm/tests/sales_billing.spec.js:429:21",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 21,
                          "line": 429
                        },
                        "snippet": "  427 |     const rows = await dbGet('/job_profitability_v?job_id=eq.bt-job-c');\n  428 |     const p = rows[0];\n> 429 |     expect(Number(p.invoiced_amount)).toBe(0);\n      |                     ^\n  430 |     expect(Number(p.material_cost)).toBeCloseTo(29000, 0);\n  431 |     expect(Number(p.gross_margin)).toBeCloseTo(-29000, 0);\n  432 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 21,
                            "line": 429
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')\n\n  427 |     const rows = await dbGet('/job_profitability_v?job_id=eq.bt-job-c');\n  428 |     const p = rows[0];\n> 429 |     expect(Number(p.invoiced_amount)).toBe(0);\n      |                     ^\n  430 |     expect(Number(p.material_cost)).toBeCloseTo(29000, 0);\n  431 |     expect(Number(p.gross_margin)).toBeCloseTo(-29000, 0);\n  432 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:429:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:40.860Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-d695a-when-only-costs-no-invoice--android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 21,
                        "line": 429
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-631339f44f773424aee9",
              "file": "sales_billing.spec.js",
              "line": 425,
              "column": 3
            },
            {
              "title": "item_avg_cost computes weighted average from inward_lines",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 142,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 84,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThan\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: > \u001b[32m0\u001b[39m\nReceived:   \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThan\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: > \u001b[32m0\u001b[39m\nReceived:   \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:437:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 437
                        },
                        "snippet": "  435 |     // Items have a single inward batch each in the test seed, so WAC = unit_price\n  436 |     const rows = await dbGet('/item_avg_cost?inward_batches=gte.1&limit=5', 'stores');\n> 437 |     expect(rows.length).toBeGreaterThan(0);\n      |                         ^\n  438 |     rows.forEach(r => {\n  439 |       expect(Number(r.avg_unit_cost)).toBeGreaterThan(0);\n  440 |     });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 437
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThan\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: > \u001b[32m0\u001b[39m\nReceived:   \u001b[31m0\u001b[39m\n\n  435 |     // Items have a single inward batch each in the test seed, so WAC = unit_price\n  436 |     const rows = await dbGet('/item_avg_cost?inward_batches=gte.1&limit=5', 'stores');\n> 437 |     expect(rows.length).toBeGreaterThan(0);\n      |                         ^\n  438 |     rows.forEach(r => {\n  439 |       expect(Number(r.avg_unit_cost)).toBeGreaterThan(0);\n  440 |     });\n    at /var/www/360lm/tests/sales_billing.spec.js:437:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:41.855Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-31904-d-average-from-inward-lines-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 437
                      }
                    },
                    {
                      "workerIndex": 143,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 67,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThan\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: > \u001b[32m0\u001b[39m\nReceived:   \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThan\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: > \u001b[32m0\u001b[39m\nReceived:   \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:437:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 437
                        },
                        "snippet": "  435 |     // Items have a single inward batch each in the test seed, so WAC = unit_price\n  436 |     const rows = await dbGet('/item_avg_cost?inward_batches=gte.1&limit=5', 'stores');\n> 437 |     expect(rows.length).toBeGreaterThan(0);\n      |                         ^\n  438 |     rows.forEach(r => {\n  439 |       expect(Number(r.avg_unit_cost)).toBeGreaterThan(0);\n  440 |     });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 437
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThan\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: > \u001b[32m0\u001b[39m\nReceived:   \u001b[31m0\u001b[39m\n\n  435 |     // Items have a single inward batch each in the test seed, so WAC = unit_price\n  436 |     const rows = await dbGet('/item_avg_cost?inward_batches=gte.1&limit=5', 'stores');\n> 437 |     expect(rows.length).toBeGreaterThan(0);\n      |                         ^\n  438 |     rows.forEach(r => {\n  439 |       expect(Number(r.avg_unit_cost)).toBeGreaterThan(0);\n  440 |     });\n    at /var/www/360lm/tests/sales_billing.spec.js:437:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:42.885Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-31904-d-average-from-inward-lines-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 437
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-fc16c23b16eda97dcebb",
              "file": "sales_billing.spec.js",
              "line": 434,
              "column": 3
            },
            {
              "title": "Sales PWA has job profitability + materials JS functions",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 144,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 56,
                      "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\"loadJobProfitability\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"loadJobProfitability\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:446:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 446
                        },
                        "snippet": "  444 |     const ctx = await request.newContext();\n  445 |     const html = await (await ctx.get(BASE_URL)).text();\n> 446 |     expect(html).toContain('loadJobProfitability');\n      |                  ^\n  447 |     expect(html).toContain('loadJobMaterials');\n  448 |     expect(html).toContain('job-profit-card');\n  449 |     expect(html).toContain('job-materials-card');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 446
                          },
                          "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\"loadJobProfitability\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  444 |     const ctx = await request.newContext();\n  445 |     const html = await (await ctx.get(BASE_URL)).text();\n> 446 |     expect(html).toContain('loadJobProfitability');\n      |                  ^\n  447 |     expect(html).toContain('loadJobMaterials');\n  448 |     expect(html).toContain('job-profit-card');\n  449 |     expect(html).toContain('job-materials-card');\n    at /var/www/360lm/tests/sales_billing.spec.js:446:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:43.872Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-64ced-lity-materials-JS-functions-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 446
                      }
                    },
                    {
                      "workerIndex": 145,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 56,
                      "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\"loadJobProfitability\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"loadJobProfitability\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:446:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 446
                        },
                        "snippet": "  444 |     const ctx = await request.newContext();\n  445 |     const html = await (await ctx.get(BASE_URL)).text();\n> 446 |     expect(html).toContain('loadJobProfitability');\n      |                  ^\n  447 |     expect(html).toContain('loadJobMaterials');\n  448 |     expect(html).toContain('job-profit-card');\n  449 |     expect(html).toContain('job-materials-card');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 446
                          },
                          "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\"loadJobProfitability\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  444 |     const ctx = await request.newContext();\n  445 |     const html = await (await ctx.get(BASE_URL)).text();\n> 446 |     expect(html).toContain('loadJobProfitability');\n      |                  ^\n  447 |     expect(html).toContain('loadJobMaterials');\n  448 |     expect(html).toContain('job-profit-card');\n  449 |     expect(html).toContain('job-materials-card');\n    at /var/www/360lm/tests/sales_billing.spec.js:446:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:44.748Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-64ced-lity-materials-JS-functions-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 446
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-5e8ef4663b483e63ebec",
              "file": "sales_billing.spec.js",
              "line": 443,
              "column": 3
            },
            {
              "title": "Custodian PWA has vendor bill link fields",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 146,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 71,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:45.629Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-6523978e661071c772ad",
              "file": "sales_billing.spec.js",
              "line": 453,
              "column": 3
            },
            {
              "title": "stores.inward has status + payment trigger working",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 338,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 23,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:17.854Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-059e1a3db7c6aaf5abc8",
              "file": "sales_billing.spec.js",
              "line": 392,
              "column": 3
            },
            {
              "title": "payables_kpi view returns non-error",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 338,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 16,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:17.899Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-62a7694acfada42987d9",
              "file": "sales_billing.spec.js",
              "line": 397,
              "column": 3
            },
            {
              "title": "job_material_cost rolls up issues per job",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 338,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 21,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:406:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 406
                        },
                        "snippet": "  404 |   test('job_material_cost rolls up issues per job', async () => {\n  405 |     const rows = await dbGet('/job_material_cost?job_id=in.(bt-job-b,bt-job-c)&order=job_id');\n> 406 |     expect(rows.length).toBe(2);\n      |                         ^\n  407 |     const byId = Object.fromEntries(rows.map(r => [r.job_id, r]));\n  408 |     // bt-job-b: 500 flex @70 + 80 standee @250 = 35000 + 20000 = 55000\n  409 |     expect(Number(byId['bt-job-b'].material_cost)).toBeCloseTo(55000, 0);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 406
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  404 |   test('job_material_cost rolls up issues per job', async () => {\n  405 |     const rows = await dbGet('/job_material_cost?job_id=in.(bt-job-b,bt-job-c)&order=job_id');\n> 406 |     expect(rows.length).toBe(2);\n      |                         ^\n  407 |     const byId = Object.fromEntries(rows.map(r => [r.job_id, r]));\n  408 |     // bt-job-b: 500 flex @70 + 80 standee @250 = 35000 + 20000 = 55000\n  409 |     expect(Number(byId['bt-job-b'].material_cost)).toBeCloseTo(55000, 0);\n    at /var/www/360lm/tests/sales_billing.spec.js:406:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:17.938Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-82d2b-ost-rolls-up-issues-per-job-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 406
                      }
                    },
                    {
                      "workerIndex": 339,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 77,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:406:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 406
                        },
                        "snippet": "  404 |   test('job_material_cost rolls up issues per job', async () => {\n  405 |     const rows = await dbGet('/job_material_cost?job_id=in.(bt-job-b,bt-job-c)&order=job_id');\n> 406 |     expect(rows.length).toBe(2);\n      |                         ^\n  407 |     const byId = Object.fromEntries(rows.map(r => [r.job_id, r]));\n  408 |     // bt-job-b: 500 flex @70 + 80 standee @250 = 35000 + 20000 = 55000\n  409 |     expect(Number(byId['bt-job-b'].material_cost)).toBeCloseTo(55000, 0);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 406
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m2\u001b[39m\nReceived: \u001b[31mundefined\u001b[39m\n\n  404 |   test('job_material_cost rolls up issues per job', async () => {\n  405 |     const rows = await dbGet('/job_material_cost?job_id=in.(bt-job-b,bt-job-c)&order=job_id');\n> 406 |     expect(rows.length).toBe(2);\n      |                         ^\n  407 |     const byId = Object.fromEntries(rows.map(r => [r.job_id, r]));\n  408 |     // bt-job-b: 500 flex @70 + 80 standee @250 = 35000 + 20000 = 55000\n  409 |     expect(Number(byId['bt-job-b'].material_cost)).toBeCloseTo(55000, 0);\n    at /var/www/360lm/tests/sales_billing.spec.js:406:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:38:18.735Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-82d2b-ost-rolls-up-issues-per-job-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 406
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-5a03013660ef627e22e8",
              "file": "sales_billing.spec.js",
              "line": 404,
              "column": 3
            },
            {
              "title": "job_profitability_v shows positive margin for paid invoice",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 340,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 61,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')\n    at /var/www/360lm/tests/sales_billing.spec.js:419:21",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 21,
                          "line": 419
                        },
                        "snippet": "  417 |     const rows = await dbGet('/job_profitability_v?job_id=eq.bt-job-b');\n  418 |     const p = rows[0];\n> 419 |     expect(Number(p.invoiced_amount)).toBeCloseTo(1002056, 0);\n      |                     ^\n  420 |     expect(Number(p.collected_amount)).toBeCloseTo(1002056, 0);\n  421 |     expect(Number(p.material_cost)).toBeCloseTo(55000, 0);\n  422 |     expect(Number(p.gross_margin)).toBeCloseTo(947056, 0);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 21,
                            "line": 419
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')\n\n  417 |     const rows = await dbGet('/job_profitability_v?job_id=eq.bt-job-b');\n  418 |     const p = rows[0];\n> 419 |     expect(Number(p.invoiced_amount)).toBeCloseTo(1002056, 0);\n      |                     ^\n  420 |     expect(Number(p.collected_amount)).toBeCloseTo(1002056, 0);\n  421 |     expect(Number(p.material_cost)).toBeCloseTo(55000, 0);\n  422 |     expect(Number(p.gross_margin)).toBeCloseTo(947056, 0);\n    at /var/www/360lm/tests/sales_billing.spec.js:419:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:19.673Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-9abe5-ive-margin-for-paid-invoice-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 21,
                        "line": 419
                      }
                    },
                    {
                      "workerIndex": 341,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 63,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')\n    at /var/www/360lm/tests/sales_billing.spec.js:419:21",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 21,
                          "line": 419
                        },
                        "snippet": "  417 |     const rows = await dbGet('/job_profitability_v?job_id=eq.bt-job-b');\n  418 |     const p = rows[0];\n> 419 |     expect(Number(p.invoiced_amount)).toBeCloseTo(1002056, 0);\n      |                     ^\n  420 |     expect(Number(p.collected_amount)).toBeCloseTo(1002056, 0);\n  421 |     expect(Number(p.material_cost)).toBeCloseTo(55000, 0);\n  422 |     expect(Number(p.gross_margin)).toBeCloseTo(947056, 0);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 21,
                            "line": 419
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')\n\n  417 |     const rows = await dbGet('/job_profitability_v?job_id=eq.bt-job-b');\n  418 |     const p = rows[0];\n> 419 |     expect(Number(p.invoiced_amount)).toBeCloseTo(1002056, 0);\n      |                     ^\n  420 |     expect(Number(p.collected_amount)).toBeCloseTo(1002056, 0);\n  421 |     expect(Number(p.material_cost)).toBeCloseTo(55000, 0);\n  422 |     expect(Number(p.gross_margin)).toBeCloseTo(947056, 0);\n    at /var/www/360lm/tests/sales_billing.spec.js:419:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:38:20.643Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-9abe5-ive-margin-for-paid-invoice-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 21,
                        "line": 419
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-1eca6e0d1e75ed8a0ffc",
              "file": "sales_billing.spec.js",
              "line": 416,
              "column": 3
            },
            {
              "title": "job_profitability_v shows negative margin when only costs (no invoice)",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 342,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 63,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')\n    at /var/www/360lm/tests/sales_billing.spec.js:429:21",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 21,
                          "line": 429
                        },
                        "snippet": "  427 |     const rows = await dbGet('/job_profitability_v?job_id=eq.bt-job-c');\n  428 |     const p = rows[0];\n> 429 |     expect(Number(p.invoiced_amount)).toBe(0);\n      |                     ^\n  430 |     expect(Number(p.material_cost)).toBeCloseTo(29000, 0);\n  431 |     expect(Number(p.gross_margin)).toBeCloseTo(-29000, 0);\n  432 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 21,
                            "line": 429
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')\n\n  427 |     const rows = await dbGet('/job_profitability_v?job_id=eq.bt-job-c');\n  428 |     const p = rows[0];\n> 429 |     expect(Number(p.invoiced_amount)).toBe(0);\n      |                     ^\n  430 |     expect(Number(p.material_cost)).toBeCloseTo(29000, 0);\n  431 |     expect(Number(p.gross_margin)).toBeCloseTo(-29000, 0);\n  432 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:429:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:21.587Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-d695a-when-only-costs-no-invoice--desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 21,
                        "line": 429
                      }
                    },
                    {
                      "workerIndex": 343,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 56,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')\n    at /var/www/360lm/tests/sales_billing.spec.js:429:21",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 21,
                          "line": 429
                        },
                        "snippet": "  427 |     const rows = await dbGet('/job_profitability_v?job_id=eq.bt-job-c');\n  428 |     const p = rows[0];\n> 429 |     expect(Number(p.invoiced_amount)).toBe(0);\n      |                     ^\n  430 |     expect(Number(p.material_cost)).toBeCloseTo(29000, 0);\n  431 |     expect(Number(p.gross_margin)).toBeCloseTo(-29000, 0);\n  432 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 21,
                            "line": 429
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'invoiced_amount')\n\n  427 |     const rows = await dbGet('/job_profitability_v?job_id=eq.bt-job-c');\n  428 |     const p = rows[0];\n> 429 |     expect(Number(p.invoiced_amount)).toBe(0);\n      |                     ^\n  430 |     expect(Number(p.material_cost)).toBeCloseTo(29000, 0);\n  431 |     expect(Number(p.gross_margin)).toBeCloseTo(-29000, 0);\n  432 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:429:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:38:22.494Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-d695a-when-only-costs-no-invoice--desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 21,
                        "line": 429
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-71f02e524d322ccca998",
              "file": "sales_billing.spec.js",
              "line": 425,
              "column": 3
            },
            {
              "title": "item_avg_cost computes weighted average from inward_lines",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 344,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 63,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThan\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: > \u001b[32m0\u001b[39m\nReceived:   \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThan\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: > \u001b[32m0\u001b[39m\nReceived:   \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:437:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 437
                        },
                        "snippet": "  435 |     // Items have a single inward batch each in the test seed, so WAC = unit_price\n  436 |     const rows = await dbGet('/item_avg_cost?inward_batches=gte.1&limit=5', 'stores');\n> 437 |     expect(rows.length).toBeGreaterThan(0);\n      |                         ^\n  438 |     rows.forEach(r => {\n  439 |       expect(Number(r.avg_unit_cost)).toBeGreaterThan(0);\n  440 |     });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 437
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThan\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: > \u001b[32m0\u001b[39m\nReceived:   \u001b[31m0\u001b[39m\n\n  435 |     // Items have a single inward batch each in the test seed, so WAC = unit_price\n  436 |     const rows = await dbGet('/item_avg_cost?inward_batches=gte.1&limit=5', 'stores');\n> 437 |     expect(rows.length).toBeGreaterThan(0);\n      |                         ^\n  438 |     rows.forEach(r => {\n  439 |       expect(Number(r.avg_unit_cost)).toBeGreaterThan(0);\n  440 |     });\n    at /var/www/360lm/tests/sales_billing.spec.js:437:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:23.324Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-31904-d-average-from-inward-lines-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 437
                      }
                    },
                    {
                      "workerIndex": 345,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 77,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThan\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: > \u001b[32m0\u001b[39m\nReceived:   \u001b[31m0\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThan\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: > \u001b[32m0\u001b[39m\nReceived:   \u001b[31m0\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:437:25",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 25,
                          "line": 437
                        },
                        "snippet": "  435 |     // Items have a single inward batch each in the test seed, so WAC = unit_price\n  436 |     const rows = await dbGet('/item_avg_cost?inward_batches=gte.1&limit=5', 'stores');\n> 437 |     expect(rows.length).toBeGreaterThan(0);\n      |                         ^\n  438 |     rows.forEach(r => {\n  439 |       expect(Number(r.avg_unit_cost)).toBeGreaterThan(0);\n  440 |     });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 25,
                            "line": 437
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeGreaterThan\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: > \u001b[32m0\u001b[39m\nReceived:   \u001b[31m0\u001b[39m\n\n  435 |     // Items have a single inward batch each in the test seed, so WAC = unit_price\n  436 |     const rows = await dbGet('/item_avg_cost?inward_batches=gte.1&limit=5', 'stores');\n> 437 |     expect(rows.length).toBeGreaterThan(0);\n      |                         ^\n  438 |     rows.forEach(r => {\n  439 |       expect(Number(r.avg_unit_cost)).toBeGreaterThan(0);\n  440 |     });\n    at /var/www/360lm/tests/sales_billing.spec.js:437:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:38:24.271Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-31904-d-average-from-inward-lines-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 25,
                        "line": 437
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-63af6e05204e85386392",
              "file": "sales_billing.spec.js",
              "line": 434,
              "column": 3
            },
            {
              "title": "Sales PWA has job profitability + materials JS functions",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 346,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 62,
                      "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\"loadJobProfitability\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"loadJobProfitability\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:446:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 446
                        },
                        "snippet": "  444 |     const ctx = await request.newContext();\n  445 |     const html = await (await ctx.get(BASE_URL)).text();\n> 446 |     expect(html).toContain('loadJobProfitability');\n      |                  ^\n  447 |     expect(html).toContain('loadJobMaterials');\n  448 |     expect(html).toContain('job-profit-card');\n  449 |     expect(html).toContain('job-materials-card');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 446
                          },
                          "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\"loadJobProfitability\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  444 |     const ctx = await request.newContext();\n  445 |     const html = await (await ctx.get(BASE_URL)).text();\n> 446 |     expect(html).toContain('loadJobProfitability');\n      |                  ^\n  447 |     expect(html).toContain('loadJobMaterials');\n  448 |     expect(html).toContain('job-profit-card');\n  449 |     expect(html).toContain('job-materials-card');\n    at /var/www/360lm/tests/sales_billing.spec.js:446:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:25.153Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-64ced-lity-materials-JS-functions-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 446
                      }
                    },
                    {
                      "workerIndex": 347,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 54,
                      "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\"loadJobProfitability\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"loadJobProfitability\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:446:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 446
                        },
                        "snippet": "  444 |     const ctx = await request.newContext();\n  445 |     const html = await (await ctx.get(BASE_URL)).text();\n> 446 |     expect(html).toContain('loadJobProfitability');\n      |                  ^\n  447 |     expect(html).toContain('loadJobMaterials');\n  448 |     expect(html).toContain('job-profit-card');\n  449 |     expect(html).toContain('job-materials-card');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 446
                          },
                          "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\"loadJobProfitability\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  444 |     const ctx = await request.newContext();\n  445 |     const html = await (await ctx.get(BASE_URL)).text();\n> 446 |     expect(html).toContain('loadJobProfitability');\n      |                  ^\n  447 |     expect(html).toContain('loadJobMaterials');\n  448 |     expect(html).toContain('job-profit-card');\n  449 |     expect(html).toContain('job-materials-card');\n    at /var/www/360lm/tests/sales_billing.spec.js:446:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:38:26.017Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-64ced-lity-materials-JS-functions-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 446
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-23a811a24707529685f4",
              "file": "sales_billing.spec.js",
              "line": 443,
              "column": 3
            },
            {
              "title": "Custodian PWA has vendor bill link fields",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 348,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 82,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:27.054Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-5ec9d4e05b602e6e76be",
              "file": "sales_billing.spec.js",
              "line": 453,
              "column": 3
            }
          ]
        },
        {
          "title": "Sales Billing — Cross-stage Integrity",
          "file": "sales_billing.spec.js",
          "line": 464,
          "column": 6,
          "specs": [
            {
              "title": "every challan with an invoice_id links to a real invoice",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 146,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 19,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:45.742Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-84e003c086879e2afec8",
              "file": "sales_billing.spec.js",
              "line": 465,
              "column": 3
            },
            {
              "title": "every invoice with job_id links to a real job",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 146,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 14,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:45.797Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-accde93380aa6c8c373d",
              "file": "sales_billing.spec.js",
              "line": 474,
              "column": 3
            },
            {
              "title": "invoice_receipts sum ≥ grand_total → invoice is paid",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 146,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 24,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'paid_amount')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'paid_amount')\n    at /var/www/360lm/tests/sales_billing.spec.js:486:21",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 21,
                          "line": 486
                        },
                        "snippet": "  484 |     const s = summary[0];\n  485 |     // bt-inv-3 total = 1002056, receipts = 500000 + 502056 = 1002056\n> 486 |     expect(Number(s.paid_amount)).toBeGreaterThanOrEqual(Number(s.grand_total) - 1);\n      |                     ^\n  487 |     expect(s.status).toBe('paid');\n  488 |   });\n  489 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 21,
                            "line": 486
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'paid_amount')\n\n  484 |     const s = summary[0];\n  485 |     // bt-inv-3 total = 1002056, receipts = 500000 + 502056 = 1002056\n> 486 |     expect(Number(s.paid_amount)).toBeGreaterThanOrEqual(Number(s.grand_total) - 1);\n      |                     ^\n  487 |     expect(s.status).toBe('paid');\n  488 |   });\n  489 |\n    at /var/www/360lm/tests/sales_billing.spec.js:486:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:45.836Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-42e0a-and-total-→-invoice-is-paid-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 21,
                        "line": 486
                      }
                    },
                    {
                      "workerIndex": 147,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 58,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'paid_amount')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'paid_amount')\n    at /var/www/360lm/tests/sales_billing.spec.js:486:21",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 21,
                          "line": 486
                        },
                        "snippet": "  484 |     const s = summary[0];\n  485 |     // bt-inv-3 total = 1002056, receipts = 500000 + 502056 = 1002056\n> 486 |     expect(Number(s.paid_amount)).toBeGreaterThanOrEqual(Number(s.grand_total) - 1);\n      |                     ^\n  487 |     expect(s.status).toBe('paid');\n  488 |   });\n  489 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 21,
                            "line": 486
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'paid_amount')\n\n  484 |     const s = summary[0];\n  485 |     // bt-inv-3 total = 1002056, receipts = 500000 + 502056 = 1002056\n> 486 |     expect(Number(s.paid_amount)).toBeGreaterThanOrEqual(Number(s.grand_total) - 1);\n      |                     ^\n  487 |     expect(s.status).toBe('paid');\n  488 |   });\n  489 |\n    at /var/www/360lm/tests/sales_billing.spec.js:486:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:46.694Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-42e0a-and-total-→-invoice-is-paid-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 21,
                        "line": 486
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-4b79ed3b74ab64b10da3",
              "file": "sales_billing.spec.js",
              "line": 482,
              "column": 3
            },
            {
              "title": "360DLM company in invoice resolved by getCompany cache (not hardcoded)",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 148,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 58,
                      "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\"function getCompany(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"function getCompany(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:496:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 496
                        },
                        "snippet": "  494 |     expect(html).not.toContain('const COMPANIES =');\n  495 |     // Must have getCompany function\n> 496 |     expect(html).toContain('function getCompany(');\n      |                  ^\n  497 |     expect(html).toContain('_companiesCache');\n  498 |     await ctx.dispose();\n  499 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 496
                          },
                          "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\"function getCompany(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  494 |     expect(html).not.toContain('const COMPANIES =');\n  495 |     // Must have getCompany function\n> 496 |     expect(html).toContain('function getCompany(');\n      |                  ^\n  497 |     expect(html).toContain('_companiesCache');\n  498 |     await ctx.dispose();\n  499 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:496:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:47.601Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-af910-ompany-cache-not-hardcoded--android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 496
                      }
                    },
                    {
                      "workerIndex": 149,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 73,
                      "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\"function getCompany(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"function getCompany(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:496:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 496
                        },
                        "snippet": "  494 |     expect(html).not.toContain('const COMPANIES =');\n  495 |     // Must have getCompany function\n> 496 |     expect(html).toContain('function getCompany(');\n      |                  ^\n  497 |     expect(html).toContain('_companiesCache');\n  498 |     await ctx.dispose();\n  499 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 496
                          },
                          "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\"function getCompany(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  494 |     expect(html).not.toContain('const COMPANIES =');\n  495 |     // Must have getCompany function\n> 496 |     expect(html).toContain('function getCompany(');\n      |                  ^\n  497 |     expect(html).toContain('_companiesCache');\n  498 |     await ctx.dispose();\n  499 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:496:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:48.579Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-af910-ompany-cache-not-hardcoded--android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 496
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-daa2c54712fa56c238d5",
              "file": "sales_billing.spec.js",
              "line": 490,
              "column": 3
            },
            {
              "title": "gst_type matches company vs client state codes",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 150,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 59,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:49.515Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-cafd74d55d0ab56318f0",
              "file": "sales_billing.spec.js",
              "line": 501,
              "column": 3
            },
            {
              "title": "every challan with an invoice_id links to a real invoice",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 348,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 15,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:27.199Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-475562a4a7496434391b",
              "file": "sales_billing.spec.js",
              "line": 465,
              "column": 3
            },
            {
              "title": "every invoice with job_id links to a real job",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 348,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 16,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:27.235Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-8381dea505235c0465de",
              "file": "sales_billing.spec.js",
              "line": 474,
              "column": 3
            },
            {
              "title": "invoice_receipts sum ≥ grand_total → invoice is paid",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 348,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 18,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'paid_amount')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'paid_amount')\n    at /var/www/360lm/tests/sales_billing.spec.js:486:21",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 21,
                          "line": 486
                        },
                        "snippet": "  484 |     const s = summary[0];\n  485 |     // bt-inv-3 total = 1002056, receipts = 500000 + 502056 = 1002056\n> 486 |     expect(Number(s.paid_amount)).toBeGreaterThanOrEqual(Number(s.grand_total) - 1);\n      |                     ^\n  487 |     expect(s.status).toBe('paid');\n  488 |   });\n  489 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 21,
                            "line": 486
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'paid_amount')\n\n  484 |     const s = summary[0];\n  485 |     // bt-inv-3 total = 1002056, receipts = 500000 + 502056 = 1002056\n> 486 |     expect(Number(s.paid_amount)).toBeGreaterThanOrEqual(Number(s.grand_total) - 1);\n      |                     ^\n  487 |     expect(s.status).toBe('paid');\n  488 |   });\n  489 |\n    at /var/www/360lm/tests/sales_billing.spec.js:486:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:27.278Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-42e0a-and-total-→-invoice-is-paid-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 21,
                        "line": 486
                      }
                    },
                    {
                      "workerIndex": 349,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 76,
                      "error": {
                        "message": "TypeError: Cannot read properties of undefined (reading 'paid_amount')",
                        "stack": "TypeError: Cannot read properties of undefined (reading 'paid_amount')\n    at /var/www/360lm/tests/sales_billing.spec.js:486:21",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 21,
                          "line": 486
                        },
                        "snippet": "  484 |     const s = summary[0];\n  485 |     // bt-inv-3 total = 1002056, receipts = 500000 + 502056 = 1002056\n> 486 |     expect(Number(s.paid_amount)).toBeGreaterThanOrEqual(Number(s.grand_total) - 1);\n      |                     ^\n  487 |     expect(s.status).toBe('paid');\n  488 |   });\n  489 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 21,
                            "line": 486
                          },
                          "message": "TypeError: Cannot read properties of undefined (reading 'paid_amount')\n\n  484 |     const s = summary[0];\n  485 |     // bt-inv-3 total = 1002056, receipts = 500000 + 502056 = 1002056\n> 486 |     expect(Number(s.paid_amount)).toBeGreaterThanOrEqual(Number(s.grand_total) - 1);\n      |                     ^\n  487 |     expect(s.status).toBe('paid');\n  488 |   });\n  489 |\n    at /var/www/360lm/tests/sales_billing.spec.js:486:21"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:38:28.165Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-42e0a-and-total-→-invoice-is-paid-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 21,
                        "line": 486
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-e8e542f7f677379fa291",
              "file": "sales_billing.spec.js",
              "line": 482,
              "column": 3
            },
            {
              "title": "360DLM company in invoice resolved by getCompany cache (not hardcoded)",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 350,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 63,
                      "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\"function getCompany(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"function getCompany(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:496:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 496
                        },
                        "snippet": "  494 |     expect(html).not.toContain('const COMPANIES =');\n  495 |     // Must have getCompany function\n> 496 |     expect(html).toContain('function getCompany(');\n      |                  ^\n  497 |     expect(html).toContain('_companiesCache');\n  498 |     await ctx.dispose();\n  499 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 496
                          },
                          "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\"function getCompany(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  494 |     expect(html).not.toContain('const COMPANIES =');\n  495 |     // Must have getCompany function\n> 496 |     expect(html).toContain('function getCompany(');\n      |                  ^\n  497 |     expect(html).toContain('_companiesCache');\n  498 |     await ctx.dispose();\n  499 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:496:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:29.161Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-af910-ompany-cache-not-hardcoded--desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 496
                      }
                    },
                    {
                      "workerIndex": 351,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 56,
                      "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\"function getCompany(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"function getCompany(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:496:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 496
                        },
                        "snippet": "  494 |     expect(html).not.toContain('const COMPANIES =');\n  495 |     // Must have getCompany function\n> 496 |     expect(html).toContain('function getCompany(');\n      |                  ^\n  497 |     expect(html).toContain('_companiesCache');\n  498 |     await ctx.dispose();\n  499 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 496
                          },
                          "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\"function getCompany(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  494 |     expect(html).not.toContain('const COMPANIES =');\n  495 |     // Must have getCompany function\n> 496 |     expect(html).toContain('function getCompany(');\n      |                  ^\n  497 |     expect(html).toContain('_companiesCache');\n  498 |     await ctx.dispose();\n  499 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:496:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:38:30.140Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-af910-ompany-cache-not-hardcoded--desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 496
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-95d95f5e8162dffa856c",
              "file": "sales_billing.spec.js",
              "line": 490,
              "column": 3
            },
            {
              "title": "gst_type matches company vs client state codes",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 352,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 88,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:31.113Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-822afe41cf880c3ab577",
              "file": "sales_billing.spec.js",
              "line": 501,
              "column": 3
            }
          ]
        },
        {
          "title": "Sales Billing — Rendered UI",
          "file": "sales_billing.spec.js",
          "line": 514,
          "column": 6,
          "specs": [
            {
              "title": "Dashboard loads and shows Billed ₹ KPI",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 150,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 6139,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#kpi-billed')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#kpi-billed')\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#kpi-billed')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#kpi-billed')\u001b[22m\n\n    at /var/www/360lm/tests/sales_billing.spec.js:519:47",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 47,
                          "line": 519
                        },
                        "snippet": "  517 |     await page.goto(BASE_URL);\n  518 |     await page.waitForTimeout(800);\n> 519 |     await expect(page.locator('#kpi-billed')).toBeVisible();\n      |                                               ^\n  520 |     const billed = await page.locator('#kpi-billed').textContent();\n  521 |     expect(billed).not.toBe('—');\n  522 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 47,
                            "line": 519
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#kpi-billed')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#kpi-billed')\u001b[22m\n\n\n  517 |     await page.goto(BASE_URL);\n  518 |     await page.waitForTimeout(800);\n> 519 |     await expect(page.locator('#kpi-billed')).toBeVisible();\n      |                                               ^\n  520 |     const billed = await page.locator('#kpi-billed').textContent();\n  521 |     expect(billed).not.toBe('—');\n  522 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:519:47"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:21:49.625Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-e6e30-oads-and-shows-Billed-₹-KPI-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-e6e30-oads-and-shows-Billed-₹-KPI-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 47,
                        "line": 519
                      }
                    },
                    {
                      "workerIndex": 151,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 6178,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#kpi-billed')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#kpi-billed')\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#kpi-billed')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#kpi-billed')\u001b[22m\n\n    at /var/www/360lm/tests/sales_billing.spec.js:519:47",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 47,
                          "line": 519
                        },
                        "snippet": "  517 |     await page.goto(BASE_URL);\n  518 |     await page.waitForTimeout(800);\n> 519 |     await expect(page.locator('#kpi-billed')).toBeVisible();\n      |                                               ^\n  520 |     const billed = await page.locator('#kpi-billed').textContent();\n  521 |     expect(billed).not.toBe('—');\n  522 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 47,
                            "line": 519
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#kpi-billed')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#kpi-billed')\u001b[22m\n\n\n  517 |     await page.goto(BASE_URL);\n  518 |     await page.waitForTimeout(800);\n> 519 |     await expect(page.locator('#kpi-billed')).toBeVisible();\n      |                                               ^\n  520 |     const billed = await page.locator('#kpi-billed').textContent();\n  521 |     expect(billed).not.toBe('—');\n  522 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:519:47"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:21:57.253Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-e6e30-oads-and-shows-Billed-₹-KPI-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-e6e30-oads-and-shows-Billed-₹-KPI-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 47,
                        "line": 519
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-67a02daaf103187498ec",
              "file": "sales_billing.spec.js",
              "line": 515,
              "column": 3
            },
            {
              "title": "All Jobs screen shows bt-job-c with in_execution status",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 152,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30093,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 16,
                            "line": 528
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-jobs')\u001b[22m\n\n\n  526 |     await page.goto(BASE_URL);\n  527 |     await page.waitForTimeout(500);\n> 528 |     await page.click('#nav-jobs');\n      |                ^\n  529 |     await page.waitForTimeout(600);\n  530 |     const jobCards = page.locator('.job-card');\n  531 |     const count = await jobCards.count();\n    at /var/www/360lm/tests/sales_billing.spec.js:528:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:22:04.714Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-20f3e--c-with-in-execution-status-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-20f3e--c-with-in-execution-status-android-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 153,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30160,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 16,
                            "line": 528
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-jobs')\u001b[22m\n\n\n  526 |     await page.goto(BASE_URL);\n  527 |     await page.waitForTimeout(500);\n> 528 |     await page.click('#nav-jobs');\n      |                ^\n  529 |     await page.waitForTimeout(600);\n  530 |     const jobCards = page.locator('.job-card');\n  531 |     const count = await jobCards.count();\n    at /var/www/360lm/tests/sales_billing.spec.js:528:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:22:35.969Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-20f3e--c-with-in-execution-status-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-20f3e--c-with-in-execution-status-android-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-93d1c1fc1d0f8ad11893",
              "file": "sales_billing.spec.js",
              "line": 524,
              "column": 3
            },
            {
              "title": "Offers screen shows draft + sent + accepted chips",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 154,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30123,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 16,
                            "line": 542
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-offers')\u001b[22m\n\n\n  540 |     await page.goto(BASE_URL);\n  541 |     await page.waitForTimeout(500);\n> 542 |     await page.click('#nav-offers');\n      |                ^\n  543 |     await page.waitForTimeout(700);\n  544 |     const statTags = await page.locator('#offers-list .tag').allTextContents();\n  545 |     const normalised = statTags.map(s => s.toLowerCase());\n    at /var/www/360lm/tests/sales_billing.spec.js:542:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:23:07.310Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-51d9f-s-draft-sent-accepted-chips-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-51d9f-s-draft-sent-accepted-chips-android-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 155,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30119,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 16,
                            "line": 542
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-offers')\u001b[22m\n\n\n  540 |     await page.goto(BASE_URL);\n  541 |     await page.waitForTimeout(500);\n> 542 |     await page.click('#nav-offers');\n      |                ^\n  543 |     await page.waitForTimeout(700);\n  544 |     const statTags = await page.locator('#offers-list .tag').allTextContents();\n  545 |     const normalised = statTags.map(s => s.toLowerCase());\n    at /var/www/360lm/tests/sales_billing.spec.js:542:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:23:38.458Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-51d9f-s-draft-sent-accepted-chips-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-51d9f-s-draft-sent-accepted-chips-android-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-2ae56656f1fade0978e5",
              "file": "sales_billing.spec.js",
              "line": 538,
              "column": 3
            },
            {
              "title": "Offer form has HSN/SAC input and SVC/MAT toggle",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 156,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30128,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 16,
                            "line": 553
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-offers')\u001b[22m\n\n\n  551 |     await page.goto(BASE_URL);\n  552 |     await page.waitForTimeout(400);\n> 553 |     await page.click('#nav-offers');\n      |                ^\n  554 |     await page.waitForTimeout(300);\n  555 |     await page.click('#btn-offers-new');\n  556 |     await page.waitForTimeout(400);\n    at /var/www/360lm/tests/sales_billing.spec.js:553:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:24:09.795Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-f54aa-AC-input-and-SVC-MAT-toggle-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-f54aa-AC-input-and-SVC-MAT-toggle-android-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 157,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30082,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 16,
                            "line": 553
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-offers')\u001b[22m\n\n\n  551 |     await page.goto(BASE_URL);\n  552 |     await page.waitForTimeout(400);\n> 553 |     await page.click('#nav-offers');\n      |                ^\n  554 |     await page.waitForTimeout(300);\n  555 |     await page.click('#btn-offers-new');\n  556 |     await page.waitForTimeout(400);\n    at /var/www/360lm/tests/sales_billing.spec.js:553:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:24:40.943Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-f54aa-AC-input-and-SVC-MAT-toggle-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-f54aa-AC-input-and-SVC-MAT-toggle-android-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-250f33ad88892b7ab34c",
              "file": "sales_billing.spec.js",
              "line": 549,
              "column": 3
            },
            {
              "title": "Invoice form has company select + GST settings",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 158,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 85,
                      "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\"id=\\\"inv-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"inv-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:574:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 574
                        },
                        "snippet": "  572 |     const html = await (await ctx.get(BASE_URL)).text();\n  573 |     await ctx.dispose();\n> 574 |     expect(html).toContain('id=\"inv-company-select\"');\n      |                  ^\n  575 |     expect(html).toContain('id=\"inv-gst-type\"');\n  576 |     expect(html).toContain('id=\"inv-po-no\"');\n  577 |     expect(html).toContain('id=\"inv-po-date\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 574
                          },
                          "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\"id=\\\"inv-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  572 |     const html = await (await ctx.get(BASE_URL)).text();\n  573 |     await ctx.dispose();\n> 574 |     expect(html).toContain('id=\"inv-company-select\"');\n      |                  ^\n  575 |     expect(html).toContain('id=\"inv-gst-type\"');\n  576 |     expect(html).toContain('id=\"inv-po-no\"');\n  577 |     expect(html).toContain('id=\"inv-po-date\"');\n    at /var/www/360lm/tests/sales_billing.spec.js:574:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:12.049Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-c35fd-company-select-GST-settings-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 574
                      }
                    },
                    {
                      "workerIndex": 159,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 64,
                      "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\"id=\\\"inv-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"inv-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:574:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 574
                        },
                        "snippet": "  572 |     const html = await (await ctx.get(BASE_URL)).text();\n  573 |     await ctx.dispose();\n> 574 |     expect(html).toContain('id=\"inv-company-select\"');\n      |                  ^\n  575 |     expect(html).toContain('id=\"inv-gst-type\"');\n  576 |     expect(html).toContain('id=\"inv-po-no\"');\n  577 |     expect(html).toContain('id=\"inv-po-date\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 574
                          },
                          "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\"id=\\\"inv-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  572 |     const html = await (await ctx.get(BASE_URL)).text();\n  573 |     await ctx.dispose();\n> 574 |     expect(html).toContain('id=\"inv-company-select\"');\n      |                  ^\n  575 |     expect(html).toContain('id=\"inv-gst-type\"');\n  576 |     expect(html).toContain('id=\"inv-po-no\"');\n  577 |     expect(html).toContain('id=\"inv-po-date\"');\n    at /var/www/360lm/tests/sales_billing.spec.js:574:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:25:12.961Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-c35fd-company-select-GST-settings-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 574
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-3da5cd8dda31387d03e6",
              "file": "sales_billing.spec.js",
              "line": 569,
              "column": 3
            },
            {
              "title": "Challans tab visible on Job Detail",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 160,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 1120,
                      "error": {
                        "message": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)",
                        "stack": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at /var/www/360lm/tests/sales_billing.spec.js:589:16",
                        "location": {
                          "file": "eval at evaluate (:302:30), <anonymous>",
                          "column": 7,
                          "line": 1
                        }
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "eval at evaluate (:302:30), <anonymous>",
                            "column": 7,
                            "line": 1
                          },
                          "message": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at /var/www/360lm/tests/sales_billing.spec.js:589:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:14.004Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-3a4f3-s-tab-visible-on-Job-Detail-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-3a4f3-s-tab-visible-on-Job-Detail-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "eval at evaluate (:302:30), <anonymous>",
                        "column": 7,
                        "line": 1
                      }
                    },
                    {
                      "workerIndex": 161,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 1111,
                      "error": {
                        "message": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)",
                        "stack": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at /var/www/360lm/tests/sales_billing.spec.js:589:16",
                        "location": {
                          "file": "eval at evaluate (:302:30), <anonymous>",
                          "column": 7,
                          "line": 1
                        }
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "eval at evaluate (:302:30), <anonymous>",
                            "column": 7,
                            "line": 1
                          },
                          "message": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at /var/www/360lm/tests/sales_billing.spec.js:589:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:25:16.100Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-3a4f3-s-tab-visible-on-Job-Detail-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-3a4f3-s-tab-visible-on-Job-Detail-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "eval at evaluate (:302:30), <anonymous>",
                        "column": 7,
                        "line": 1
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-4ddbdbbe5e321f15cf29",
              "file": "sales_billing.spec.js",
              "line": 585,
              "column": 3
            },
            {
              "title": "Dashboard loads and shows Billed ₹ KPI",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 352,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 6054,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#kpi-billed')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#kpi-billed')\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#kpi-billed')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#kpi-billed')\u001b[22m\n\n    at /var/www/360lm/tests/sales_billing.spec.js:519:47",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 47,
                          "line": 519
                        },
                        "snippet": "  517 |     await page.goto(BASE_URL);\n  518 |     await page.waitForTimeout(800);\n> 519 |     await expect(page.locator('#kpi-billed')).toBeVisible();\n      |                                               ^\n  520 |     const billed = await page.locator('#kpi-billed').textContent();\n  521 |     expect(billed).not.toBe('—');\n  522 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 47,
                            "line": 519
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#kpi-billed')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#kpi-billed')\u001b[22m\n\n\n  517 |     await page.goto(BASE_URL);\n  518 |     await page.waitForTimeout(800);\n> 519 |     await expect(page.locator('#kpi-billed')).toBeVisible();\n      |                                               ^\n  520 |     const billed = await page.locator('#kpi-billed').textContent();\n  521 |     expect(billed).not.toBe('—');\n  522 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:519:47"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:31.255Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-e6e30-oads-and-shows-Billed-₹-KPI-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-e6e30-oads-and-shows-Billed-₹-KPI-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 47,
                        "line": 519
                      }
                    },
                    {
                      "workerIndex": 353,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 6119,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#kpi-billed')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#kpi-billed')\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#kpi-billed')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#kpi-billed')\u001b[22m\n\n    at /var/www/360lm/tests/sales_billing.spec.js:519:47",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 47,
                          "line": 519
                        },
                        "snippet": "  517 |     await page.goto(BASE_URL);\n  518 |     await page.waitForTimeout(800);\n> 519 |     await expect(page.locator('#kpi-billed')).toBeVisible();\n      |                                               ^\n  520 |     const billed = await page.locator('#kpi-billed').textContent();\n  521 |     expect(billed).not.toBe('—');\n  522 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 47,
                            "line": 519
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#kpi-billed')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#kpi-billed')\u001b[22m\n\n\n  517 |     await page.goto(BASE_URL);\n  518 |     await page.waitForTimeout(800);\n> 519 |     await expect(page.locator('#kpi-billed')).toBeVisible();\n      |                                               ^\n  520 |     const billed = await page.locator('#kpi-billed').textContent();\n  521 |     expect(billed).not.toBe('—');\n  522 |   });\n    at /var/www/360lm/tests/sales_billing.spec.js:519:47"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:38:38.354Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-e6e30-oads-and-shows-Billed-₹-KPI-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-e6e30-oads-and-shows-Billed-₹-KPI-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 47,
                        "line": 519
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-6b259659b7a1b158b222",
              "file": "sales_billing.spec.js",
              "line": 515,
              "column": 3
            },
            {
              "title": "All Jobs screen shows bt-job-c with in_execution status",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 354,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30116,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 16,
                            "line": 528
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-jobs')\u001b[22m\n\n\n  526 |     await page.goto(BASE_URL);\n  527 |     await page.waitForTimeout(500);\n> 528 |     await page.click('#nav-jobs');\n      |                ^\n  529 |     await page.waitForTimeout(600);\n  530 |     const jobCards = page.locator('.job-card');\n  531 |     const count = await jobCards.count();\n    at /var/www/360lm/tests/sales_billing.spec.js:528:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:38:45.489Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-20f3e--c-with-in-execution-status-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-20f3e--c-with-in-execution-status-desktop-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 355,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30144,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 16,
                            "line": 528
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-jobs')\u001b[22m\n\n\n  526 |     await page.goto(BASE_URL);\n  527 |     await page.waitForTimeout(500);\n> 528 |     await page.click('#nav-jobs');\n      |                ^\n  529 |     await page.waitForTimeout(600);\n  530 |     const jobCards = page.locator('.job-card');\n  531 |     const count = await jobCards.count();\n    at /var/www/360lm/tests/sales_billing.spec.js:528:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:39:16.807Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-20f3e--c-with-in-execution-status-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-20f3e--c-with-in-execution-status-desktop-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-4adb5b2dea21dc309097",
              "file": "sales_billing.spec.js",
              "line": 524,
              "column": 3
            },
            {
              "title": "Offers screen shows draft + sent + accepted chips",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 356,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30084,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 16,
                            "line": 542
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-offers')\u001b[22m\n\n\n  540 |     await page.goto(BASE_URL);\n  541 |     await page.waitForTimeout(500);\n> 542 |     await page.click('#nav-offers');\n      |                ^\n  543 |     await page.waitForTimeout(700);\n  544 |     const statTags = await page.locator('#offers-list .tag').allTextContents();\n  545 |     const normalised = statTags.map(s => s.toLowerCase());\n    at /var/www/360lm/tests/sales_billing.spec.js:542:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:39:48.062Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-51d9f-s-draft-sent-accepted-chips-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-51d9f-s-draft-sent-accepted-chips-desktop-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 357,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30102,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 16,
                            "line": 542
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-offers')\u001b[22m\n\n\n  540 |     await page.goto(BASE_URL);\n  541 |     await page.waitForTimeout(500);\n> 542 |     await page.click('#nav-offers');\n      |                ^\n  543 |     await page.waitForTimeout(700);\n  544 |     const statTags = await page.locator('#offers-list .tag').allTextContents();\n  545 |     const normalised = statTags.map(s => s.toLowerCase());\n    at /var/www/360lm/tests/sales_billing.spec.js:542:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:40:19.143Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-51d9f-s-draft-sent-accepted-chips-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-51d9f-s-draft-sent-accepted-chips-desktop-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-c8dbadd929536123a601",
              "file": "sales_billing.spec.js",
              "line": 538,
              "column": 3
            },
            {
              "title": "Offer form has HSN/SAC input and SVC/MAT toggle",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 358,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30091,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 16,
                            "line": 553
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-offers')\u001b[22m\n\n\n  551 |     await page.goto(BASE_URL);\n  552 |     await page.waitForTimeout(400);\n> 553 |     await page.click('#nav-offers');\n      |                ^\n  554 |     await page.waitForTimeout(300);\n  555 |     await page.click('#btn-offers-new');\n  556 |     await page.waitForTimeout(400);\n    at /var/www/360lm/tests/sales_billing.spec.js:553:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:40:50.305Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-f54aa-AC-input-and-SVC-MAT-toggle-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-f54aa-AC-input-and-SVC-MAT-toggle-desktop-chrome/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 359,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30115,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 16,
                            "line": 553
                          },
                          "message": "Error: page.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#nav-offers')\u001b[22m\n\n\n  551 |     await page.goto(BASE_URL);\n  552 |     await page.waitForTimeout(400);\n> 553 |     await page.click('#nav-offers');\n      |                ^\n  554 |     await page.waitForTimeout(300);\n  555 |     await page.click('#btn-offers-new');\n  556 |     await page.waitForTimeout(400);\n    at /var/www/360lm/tests/sales_billing.spec.js:553:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:41:21.580Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-f54aa-AC-input-and-SVC-MAT-toggle-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-f54aa-AC-input-and-SVC-MAT-toggle-desktop-chrome-retry1/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-e65f52f4074bd6e7b217",
              "file": "sales_billing.spec.js",
              "line": 549,
              "column": 3
            },
            {
              "title": "Invoice form has company select + GST settings",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 360,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 67,
                      "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\"id=\\\"inv-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"inv-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:574:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 574
                        },
                        "snippet": "  572 |     const html = await (await ctx.get(BASE_URL)).text();\n  573 |     await ctx.dispose();\n> 574 |     expect(html).toContain('id=\"inv-company-select\"');\n      |                  ^\n  575 |     expect(html).toContain('id=\"inv-gst-type\"');\n  576 |     expect(html).toContain('id=\"inv-po-no\"');\n  577 |     expect(html).toContain('id=\"inv-po-date\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 574
                          },
                          "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\"id=\\\"inv-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  572 |     const html = await (await ctx.get(BASE_URL)).text();\n  573 |     await ctx.dispose();\n> 574 |     expect(html).toContain('id=\"inv-company-select\"');\n      |                  ^\n  575 |     expect(html).toContain('id=\"inv-gst-type\"');\n  576 |     expect(html).toContain('id=\"inv-po-no\"');\n  577 |     expect(html).toContain('id=\"inv-po-date\"');\n    at /var/www/360lm/tests/sales_billing.spec.js:574:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:41:52.914Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-c35fd-company-select-GST-settings-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 574
                      }
                    },
                    {
                      "workerIndex": 361,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 67,
                      "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\"id=\\\"inv-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"inv-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales_billing.spec.js:574:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales_billing.spec.js",
                          "column": 18,
                          "line": 574
                        },
                        "snippet": "  572 |     const html = await (await ctx.get(BASE_URL)).text();\n  573 |     await ctx.dispose();\n> 574 |     expect(html).toContain('id=\"inv-company-select\"');\n      |                  ^\n  575 |     expect(html).toContain('id=\"inv-gst-type\"');\n  576 |     expect(html).toContain('id=\"inv-po-no\"');\n  577 |     expect(html).toContain('id=\"inv-po-date\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales_billing.spec.js",
                            "column": 18,
                            "line": 574
                          },
                          "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\"id=\\\"inv-company-select\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  572 |     const html = await (await ctx.get(BASE_URL)).text();\n  573 |     await ctx.dispose();\n> 574 |     expect(html).toContain('id=\"inv-company-select\"');\n      |                  ^\n  575 |     expect(html).toContain('id=\"inv-gst-type\"');\n  576 |     expect(html).toContain('id=\"inv-po-no\"');\n  577 |     expect(html).toContain('id=\"inv-po-date\"');\n    at /var/www/360lm/tests/sales_billing.spec.js:574:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:41:53.905Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-c35fd-company-select-GST-settings-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales_billing.spec.js",
                        "column": 18,
                        "line": 574
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-dc3ad3e7c75f14490775",
              "file": "sales_billing.spec.js",
              "line": 569,
              "column": 3
            },
            {
              "title": "Challans tab visible on Job Detail",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 362,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 1102,
                      "error": {
                        "message": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)",
                        "stack": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at /var/www/360lm/tests/sales_billing.spec.js:589:16",
                        "location": {
                          "file": "eval at evaluate (:302:30), <anonymous>",
                          "column": 7,
                          "line": 1
                        }
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "eval at evaluate (:302:30), <anonymous>",
                            "column": 7,
                            "line": 1
                          },
                          "message": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at /var/www/360lm/tests/sales_billing.spec.js:589:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:41:54.904Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-3a4f3-s-tab-visible-on-Job-Detail-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-3a4f3-s-tab-visible-on-Job-Detail-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "eval at evaluate (:302:30), <anonymous>",
                        "column": 7,
                        "line": 1
                      }
                    },
                    {
                      "workerIndex": 363,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 1159,
                      "error": {
                        "message": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)",
                        "stack": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at /var/www/360lm/tests/sales_billing.spec.js:589:16",
                        "location": {
                          "file": "eval at evaluate (:302:30), <anonymous>",
                          "column": 7,
                          "line": 1
                        }
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "eval at evaluate (:302:30), <anonymous>",
                            "column": 7,
                            "line": 1
                          },
                          "message": "Error: page.evaluate: ReferenceError: openJob is not defined\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at eval (eval at evaluate (:302:30), <anonymous>:1:7)\n    at UtilityScript.evaluate (<anonymous>:304:16)\n    at UtilityScript.<anonymous> (<anonymous>:1:44)\n    at /var/www/360lm/tests/sales_billing.spec.js:589:16"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:41:57.178Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-3a4f3-s-tab-visible-on-Job-Detail-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales_billing-Sales-Billin-3a4f3-s-tab-visible-on-Job-Detail-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "eval at evaluate (:302:30), <anonymous>",
                        "column": 7,
                        "line": 1
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "e3b66ec69c8f5a0aee8e-0fc094731aafaa06f141",
              "file": "sales_billing.spec.js",
              "line": 585,
              "column": 3
            }
          ]
        }
      ]
    },
    {
      "title": "sales.spec.js",
      "file": "sales.spec.js",
      "column": 0,
      "line": 0,
      "specs": [],
      "suites": [
        {
          "title": "Sales — Smoke",
          "file": "sales.spec.js",
          "line": 10,
          "column": 6,
          "specs": [
            {
              "title": "page loads with login screen",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 162,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 286,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:18.216Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "569c8645201f3ed4d37d-fd930b1c8cc9b3b11669",
              "file": "sales.spec.js",
              "line": 11,
              "column": 3
            },
            {
              "title": "manifest.json returns 200",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 162,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 200,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:19:28",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 28,
                          "line": 19
                        },
                        "snippet": "  17 |   test('manifest.json returns 200', async ({ page }) => {\n  18 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 19 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  20 |   });\n  21 |\n  22 |   test('sw.js contains current version', async ({ page }) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 28,
                            "line": 19
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n  17 |   test('manifest.json returns 200', async ({ page }) => {\n  18 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 19 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  20 |   });\n  21 |\n  22 |   test('sw.js contains current version', async ({ page }) => {\n    at /var/www/360lm/tests/sales.spec.js:19:28"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:18.676Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Smoke-manifest-json-returns-200-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Smoke-manifest-json-returns-200-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 28,
                        "line": 19
                      }
                    },
                    {
                      "workerIndex": 163,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 346,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:19:28",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 28,
                          "line": 19
                        },
                        "snippet": "  17 |   test('manifest.json returns 200', async ({ page }) => {\n  18 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 19 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  20 |   });\n  21 |\n  22 |   test('sw.js contains current version', async ({ page }) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 28,
                            "line": 19
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n  17 |   test('manifest.json returns 200', async ({ page }) => {\n  18 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 19 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  20 |   });\n  21 |\n  22 |   test('sw.js contains current version', async ({ page }) => {\n    at /var/www/360lm/tests/sales.spec.js:19:28"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:25:19.748Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Smoke-manifest-json-returns-200-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Smoke-manifest-json-returns-200-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 28,
                        "line": 19
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-a00c16728b49d60f5736",
              "file": "sales.spec.js",
              "line": 17,
              "column": 3
            },
            {
              "title": "sw.js contains current version",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 164,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 320,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:25:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.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).toMatch(/360sales-v\\d+/);\n     |                  ^\n  26 |   });\n  27 | });\n  28 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 18,
                            "line": 25
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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).toMatch(/360sales-v\\d+/);\n     |                  ^\n  26 |   });\n  27 | });\n  28 |\n    at /var/www/360lm/tests/sales.spec.js:25:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:21.228Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Smoke-sw-js-contains-current-version-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Smoke-sw-js-contains-current-version-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 18,
                        "line": 25
                      }
                    },
                    {
                      "workerIndex": 165,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 284,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:25:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.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).toMatch(/360sales-v\\d+/);\n     |                  ^\n  26 |   });\n  27 | });\n  28 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 18,
                            "line": 25
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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).toMatch(/360sales-v\\d+/);\n     |                  ^\n  26 |   });\n  27 | });\n  28 |\n    at /var/www/360lm/tests/sales.spec.js:25:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:25:22.612Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Smoke-sw-js-contains-current-version-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Smoke-sw-js-contains-current-version-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 18,
                        "line": 25
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-e44bda16cf3af8c35e79",
              "file": "sales.spec.js",
              "line": 22,
              "column": 3
            },
            {
              "title": "page loads with login screen",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 364,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 302,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:41:59.454Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "569c8645201f3ed4d37d-d466939338448fd3ee1c",
              "file": "sales.spec.js",
              "line": 11,
              "column": 3
            },
            {
              "title": "manifest.json returns 200",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 364,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 279,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:19:28",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 28,
                          "line": 19
                        },
                        "snippet": "  17 |   test('manifest.json returns 200', async ({ page }) => {\n  18 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 19 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  20 |   });\n  21 |\n  22 |   test('sw.js contains current version', async ({ page }) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 28,
                            "line": 19
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n  17 |   test('manifest.json returns 200', async ({ page }) => {\n  18 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 19 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  20 |   });\n  21 |\n  22 |   test('sw.js contains current version', async ({ page }) => {\n    at /var/www/360lm/tests/sales.spec.js:19:28"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:41:59.932Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Smoke-manifest-json-returns-200-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Smoke-manifest-json-returns-200-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 28,
                        "line": 19
                      }
                    },
                    {
                      "workerIndex": 365,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 988,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:19:28",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 28,
                          "line": 19
                        },
                        "snippet": "  17 |   test('manifest.json returns 200', async ({ page }) => {\n  18 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 19 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  20 |   });\n  21 |\n  22 |   test('sw.js contains current version', async ({ page }) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 28,
                            "line": 19
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n  17 |   test('manifest.json returns 200', async ({ page }) => {\n  18 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 19 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  20 |   });\n  21 |\n  22 |   test('sw.js contains current version', async ({ page }) => {\n    at /var/www/360lm/tests/sales.spec.js:19:28"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:42:01.872Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Smoke-manifest-json-returns-200-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Smoke-manifest-json-returns-200-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 28,
                        "line": 19
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-41e38a2ec94697eaa763",
              "file": "sales.spec.js",
              "line": 17,
              "column": 3
            },
            {
              "title": "sw.js contains current version",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 366,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 388,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:25:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.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).toMatch(/360sales-v\\d+/);\n     |                  ^\n  26 |   });\n  27 | });\n  28 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 18,
                            "line": 25
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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).toMatch(/360sales-v\\d+/);\n     |                  ^\n  26 |   });\n  27 | });\n  28 |\n    at /var/www/360lm/tests/sales.spec.js:25:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:04.920Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Smoke-sw-js-contains-current-version-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Smoke-sw-js-contains-current-version-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 18,
                        "line": 25
                      }
                    },
                    {
                      "workerIndex": 367,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 314,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:25:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.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).toMatch(/360sales-v\\d+/);\n     |                  ^\n  26 |   });\n  27 | });\n  28 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 18,
                            "line": 25
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoMatch\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected pattern: \u001b[32m/360sales-v\\d+/\u001b[39m\nReceived string:  \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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).toMatch(/360sales-v\\d+/);\n     |                  ^\n  26 |   });\n  27 | });\n  28 |\n    at /var/www/360lm/tests/sales.spec.js:25:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:42:06.502Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Smoke-sw-js-contains-current-version-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Smoke-sw-js-contains-current-version-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 18,
                        "line": 25
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-df3cec116b91aaacea7b",
              "file": "sales.spec.js",
              "line": 22,
              "column": 3
            }
          ]
        },
        {
          "title": "Sales — Canonical Job Form",
          "file": "sales.spec.js",
          "line": 30,
          "column": 6,
          "specs": [
            {
              "title": "Phase field exists in job form",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 166,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 54,
                      "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\"id=\\\"f-phase\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"f-phase\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:35:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 18,
                          "line": 35
                        },
                        "snippet": "  33 |     const resp = await ctx.get(BASE_URL);\n  34 |     const html = await resp.text();\n> 35 |     expect(html).toContain('id=\"f-phase\"');\n     |                  ^\n  36 |     expect(html).toContain('Phase');\n  37 |   });\n  38 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 18,
                            "line": 35
                          },
                          "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\"id=\\\"f-phase\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  33 |     const resp = await ctx.get(BASE_URL);\n  34 |     const html = await resp.text();\n> 35 |     expect(html).toContain('id=\"f-phase\"');\n     |                  ^\n  36 |     expect(html).toContain('Phase');\n  37 |   });\n  38 |\n    at /var/www/360lm/tests/sales.spec.js:35:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:23.860Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Canonical-Jo-cb94a-se-field-exists-in-job-form-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 18,
                        "line": 35
                      }
                    },
                    {
                      "workerIndex": 167,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 56,
                      "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\"id=\\\"f-phase\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"f-phase\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:35:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 18,
                          "line": 35
                        },
                        "snippet": "  33 |     const resp = await ctx.get(BASE_URL);\n  34 |     const html = await resp.text();\n> 35 |     expect(html).toContain('id=\"f-phase\"');\n     |                  ^\n  36 |     expect(html).toContain('Phase');\n  37 |   });\n  38 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 18,
                            "line": 35
                          },
                          "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\"id=\\\"f-phase\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  33 |     const resp = await ctx.get(BASE_URL);\n  34 |     const html = await resp.text();\n> 35 |     expect(html).toContain('id=\"f-phase\"');\n     |                  ^\n  36 |     expect(html).toContain('Phase');\n  37 |   });\n  38 |\n    at /var/www/360lm/tests/sales.spec.js:35:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:25:24.714Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Canonical-Jo-cb94a-se-field-exists-in-job-form-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 18,
                        "line": 35
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-ac0f27baa41e2aa80458",
              "file": "sales.spec.js",
              "line": 31,
              "column": 3
            },
            {
              "title": "Zone chips group exists in job form",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 168,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 66,
                      "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\"id=\\\"f-zones-group\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"f-zones-group\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:43:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 18,
                          "line": 43
                        },
                        "snippet": "  41 |     const resp = await ctx.get(BASE_URL);\n  42 |     const html = await resp.text();\n> 43 |     expect(html).toContain('id=\"f-zones-group\"');\n     |                  ^\n  44 |     expect(html).toContain('id=\"f-zones-chips\"');\n  45 |     expect(html).toContain('id=\"f-zones-hint\"');\n  46 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 18,
                            "line": 43
                          },
                          "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\"id=\\\"f-zones-group\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  41 |     const resp = await ctx.get(BASE_URL);\n  42 |     const html = await resp.text();\n> 43 |     expect(html).toContain('id=\"f-zones-group\"');\n     |                  ^\n  44 |     expect(html).toContain('id=\"f-zones-chips\"');\n  45 |     expect(html).toContain('id=\"f-zones-hint\"');\n  46 |   });\n    at /var/www/360lm/tests/sales.spec.js:43:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:25.618Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Canonical-Jo-b0034-ps-group-exists-in-job-form-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 18,
                        "line": 43
                      }
                    },
                    {
                      "workerIndex": 169,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 69,
                      "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\"id=\\\"f-zones-group\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"f-zones-group\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:43:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 18,
                          "line": 43
                        },
                        "snippet": "  41 |     const resp = await ctx.get(BASE_URL);\n  42 |     const html = await resp.text();\n> 43 |     expect(html).toContain('id=\"f-zones-group\"');\n     |                  ^\n  44 |     expect(html).toContain('id=\"f-zones-chips\"');\n  45 |     expect(html).toContain('id=\"f-zones-hint\"');\n  46 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 18,
                            "line": 43
                          },
                          "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\"id=\\\"f-zones-group\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  41 |     const resp = await ctx.get(BASE_URL);\n  42 |     const html = await resp.text();\n> 43 |     expect(html).toContain('id=\"f-zones-group\"');\n     |                  ^\n  44 |     expect(html).toContain('id=\"f-zones-chips\"');\n  45 |     expect(html).toContain('id=\"f-zones-hint\"');\n  46 |   });\n    at /var/www/360lm/tests/sales.spec.js:43:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:25:26.513Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Canonical-Jo-b0034-ps-group-exists-in-job-form-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 18,
                        "line": 43
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-2fb50a80064903095acd",
              "file": "sales.spec.js",
              "line": 39,
              "column": 3
            },
            {
              "title": "label says Generated Campaign ID not Job Name",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 170,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 58,
                      "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\"Generated Campaign ID\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"Generated Campaign ID\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:52:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 18,
                          "line": 52
                        },
                        "snippet": "  50 |     const resp = await ctx.get(BASE_URL);\n  51 |     const html = await resp.text();\n> 52 |     expect(html).toContain('Generated Campaign ID');\n     |                  ^\n  53 |     expect(html).toContain('Campaign Identity');\n  54 |   });\n  55 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 18,
                            "line": 52
                          },
                          "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\"Generated Campaign ID\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  50 |     const resp = await ctx.get(BASE_URL);\n  51 |     const html = await resp.text();\n> 52 |     expect(html).toContain('Generated Campaign ID');\n     |                  ^\n  53 |     expect(html).toContain('Campaign Identity');\n  54 |   });\n  55 |\n    at /var/www/360lm/tests/sales.spec.js:52:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:27.375Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Canonical-Jo-25491-ed-Campaign-ID-not-Job-Name-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 18,
                        "line": 52
                      }
                    },
                    {
                      "workerIndex": 171,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 72,
                      "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\"Generated Campaign ID\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"Generated Campaign ID\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:52:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 18,
                          "line": 52
                        },
                        "snippet": "  50 |     const resp = await ctx.get(BASE_URL);\n  51 |     const html = await resp.text();\n> 52 |     expect(html).toContain('Generated Campaign ID');\n     |                  ^\n  53 |     expect(html).toContain('Campaign Identity');\n  54 |   });\n  55 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 18,
                            "line": 52
                          },
                          "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\"Generated Campaign ID\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  50 |     const resp = await ctx.get(BASE_URL);\n  51 |     const html = await resp.text();\n> 52 |     expect(html).toContain('Generated Campaign ID');\n     |                  ^\n  53 |     expect(html).toContain('Campaign Identity');\n  54 |   });\n  55 |\n    at /var/www/360lm/tests/sales.spec.js:52:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:25:28.263Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Canonical-Jo-25491-ed-Campaign-ID-not-Job-Name-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 18,
                        "line": 52
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-81024dc1d70ba049f887",
              "file": "sales.spec.js",
              "line": 48,
              "column": 3
            },
            {
              "title": "year placeholder is 2025 (4-digit)",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 172,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 56,
                      "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\"placeholder=\\\"2025\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"placeholder=\\\"2025\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:60:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 18,
                          "line": 60
                        },
                        "snippet": "  58 |     const resp = await ctx.get(BASE_URL);\n  59 |     const html = await resp.text();\n> 60 |     expect(html).toContain('placeholder=\"2025\"');\n     |                  ^\n  61 |   });\n  62 | });\n  63 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 18,
                            "line": 60
                          },
                          "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\"placeholder=\\\"2025\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  58 |     const resp = await ctx.get(BASE_URL);\n  59 |     const html = await resp.text();\n> 60 |     expect(html).toContain('placeholder=\"2025\"');\n     |                  ^\n  61 |   });\n  62 | });\n  63 |\n    at /var/www/360lm/tests/sales.spec.js:60:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:29.190Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Canonical-Jo-a6974-laceholder-is-2025-4-digit--android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 18,
                        "line": 60
                      }
                    },
                    {
                      "workerIndex": 173,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 62,
                      "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\"placeholder=\\\"2025\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"placeholder=\\\"2025\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:60:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 18,
                          "line": 60
                        },
                        "snippet": "  58 |     const resp = await ctx.get(BASE_URL);\n  59 |     const html = await resp.text();\n> 60 |     expect(html).toContain('placeholder=\"2025\"');\n     |                  ^\n  61 |   });\n  62 | });\n  63 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 18,
                            "line": 60
                          },
                          "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\"placeholder=\\\"2025\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  58 |     const resp = await ctx.get(BASE_URL);\n  59 |     const html = await resp.text();\n> 60 |     expect(html).toContain('placeholder=\"2025\"');\n     |                  ^\n  61 |   });\n  62 | });\n  63 |\n    at /var/www/360lm/tests/sales.spec.js:60:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:25:30.173Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Canonical-Jo-a6974-laceholder-is-2025-4-digit--android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 18,
                        "line": 60
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-f12480b5354768d073e0",
              "file": "sales.spec.js",
              "line": 56,
              "column": 3
            },
            {
              "title": "Phase field exists in job form",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 368,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 90,
                      "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\"id=\\\"f-phase\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"f-phase\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:35:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 18,
                          "line": 35
                        },
                        "snippet": "  33 |     const resp = await ctx.get(BASE_URL);\n  34 |     const html = await resp.text();\n> 35 |     expect(html).toContain('id=\"f-phase\"');\n     |                  ^\n  36 |     expect(html).toContain('Phase');\n  37 |   });\n  38 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 18,
                            "line": 35
                          },
                          "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\"id=\\\"f-phase\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  33 |     const resp = await ctx.get(BASE_URL);\n  34 |     const html = await resp.text();\n> 35 |     expect(html).toContain('id=\"f-phase\"');\n     |                  ^\n  36 |     expect(html).toContain('Phase');\n  37 |   });\n  38 |\n    at /var/www/360lm/tests/sales.spec.js:35:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:07.949Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Canonical-Jo-cb94a-se-field-exists-in-job-form-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 18,
                        "line": 35
                      }
                    },
                    {
                      "workerIndex": 369,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 63,
                      "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\"id=\\\"f-phase\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"f-phase\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:35:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 18,
                          "line": 35
                        },
                        "snippet": "  33 |     const resp = await ctx.get(BASE_URL);\n  34 |     const html = await resp.text();\n> 35 |     expect(html).toContain('id=\"f-phase\"');\n     |                  ^\n  36 |     expect(html).toContain('Phase');\n  37 |   });\n  38 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 18,
                            "line": 35
                          },
                          "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\"id=\\\"f-phase\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  33 |     const resp = await ctx.get(BASE_URL);\n  34 |     const html = await resp.text();\n> 35 |     expect(html).toContain('id=\"f-phase\"');\n     |                  ^\n  36 |     expect(html).toContain('Phase');\n  37 |   });\n  38 |\n    at /var/www/360lm/tests/sales.spec.js:35:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:42:09.073Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Canonical-Jo-cb94a-se-field-exists-in-job-form-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 18,
                        "line": 35
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-b3aff5e89bc9d04fb6c9",
              "file": "sales.spec.js",
              "line": 31,
              "column": 3
            },
            {
              "title": "Zone chips group exists in job form",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 370,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 60,
                      "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\"id=\\\"f-zones-group\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"f-zones-group\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:43:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 18,
                          "line": 43
                        },
                        "snippet": "  41 |     const resp = await ctx.get(BASE_URL);\n  42 |     const html = await resp.text();\n> 43 |     expect(html).toContain('id=\"f-zones-group\"');\n     |                  ^\n  44 |     expect(html).toContain('id=\"f-zones-chips\"');\n  45 |     expect(html).toContain('id=\"f-zones-hint\"');\n  46 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 18,
                            "line": 43
                          },
                          "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\"id=\\\"f-zones-group\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  41 |     const resp = await ctx.get(BASE_URL);\n  42 |     const html = await resp.text();\n> 43 |     expect(html).toContain('id=\"f-zones-group\"');\n     |                  ^\n  44 |     expect(html).toContain('id=\"f-zones-chips\"');\n  45 |     expect(html).toContain('id=\"f-zones-hint\"');\n  46 |   });\n    at /var/www/360lm/tests/sales.spec.js:43:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:10.064Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Canonical-Jo-b0034-ps-group-exists-in-job-form-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 18,
                        "line": 43
                      }
                    },
                    {
                      "workerIndex": 371,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 67,
                      "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\"id=\\\"f-zones-group\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"f-zones-group\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:43:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 18,
                          "line": 43
                        },
                        "snippet": "  41 |     const resp = await ctx.get(BASE_URL);\n  42 |     const html = await resp.text();\n> 43 |     expect(html).toContain('id=\"f-zones-group\"');\n     |                  ^\n  44 |     expect(html).toContain('id=\"f-zones-chips\"');\n  45 |     expect(html).toContain('id=\"f-zones-hint\"');\n  46 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 18,
                            "line": 43
                          },
                          "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\"id=\\\"f-zones-group\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  41 |     const resp = await ctx.get(BASE_URL);\n  42 |     const html = await resp.text();\n> 43 |     expect(html).toContain('id=\"f-zones-group\"');\n     |                  ^\n  44 |     expect(html).toContain('id=\"f-zones-chips\"');\n  45 |     expect(html).toContain('id=\"f-zones-hint\"');\n  46 |   });\n    at /var/www/360lm/tests/sales.spec.js:43:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:42:10.964Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Canonical-Jo-b0034-ps-group-exists-in-job-form-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 18,
                        "line": 43
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-f00070a72d28734088d3",
              "file": "sales.spec.js",
              "line": 39,
              "column": 3
            },
            {
              "title": "label says Generated Campaign ID not Job Name",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 372,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 73,
                      "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\"Generated Campaign ID\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"Generated Campaign ID\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:52:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 18,
                          "line": 52
                        },
                        "snippet": "  50 |     const resp = await ctx.get(BASE_URL);\n  51 |     const html = await resp.text();\n> 52 |     expect(html).toContain('Generated Campaign ID');\n     |                  ^\n  53 |     expect(html).toContain('Campaign Identity');\n  54 |   });\n  55 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 18,
                            "line": 52
                          },
                          "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\"Generated Campaign ID\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  50 |     const resp = await ctx.get(BASE_URL);\n  51 |     const html = await resp.text();\n> 52 |     expect(html).toContain('Generated Campaign ID');\n     |                  ^\n  53 |     expect(html).toContain('Campaign Identity');\n  54 |   });\n  55 |\n    at /var/www/360lm/tests/sales.spec.js:52:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:11.954Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Canonical-Jo-25491-ed-Campaign-ID-not-Job-Name-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 18,
                        "line": 52
                      }
                    },
                    {
                      "workerIndex": 373,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 81,
                      "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\"Generated Campaign ID\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"Generated Campaign ID\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:52:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 18,
                          "line": 52
                        },
                        "snippet": "  50 |     const resp = await ctx.get(BASE_URL);\n  51 |     const html = await resp.text();\n> 52 |     expect(html).toContain('Generated Campaign ID');\n     |                  ^\n  53 |     expect(html).toContain('Campaign Identity');\n  54 |   });\n  55 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 18,
                            "line": 52
                          },
                          "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\"Generated Campaign ID\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  50 |     const resp = await ctx.get(BASE_URL);\n  51 |     const html = await resp.text();\n> 52 |     expect(html).toContain('Generated Campaign ID');\n     |                  ^\n  53 |     expect(html).toContain('Campaign Identity');\n  54 |   });\n  55 |\n    at /var/www/360lm/tests/sales.spec.js:52:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:42:13.024Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Canonical-Jo-25491-ed-Campaign-ID-not-Job-Name-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 18,
                        "line": 52
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-1e569f4c57cf21d8d1ed",
              "file": "sales.spec.js",
              "line": 48,
              "column": 3
            },
            {
              "title": "year placeholder is 2025 (4-digit)",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 374,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 62,
                      "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\"placeholder=\\\"2025\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"placeholder=\\\"2025\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:60:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 18,
                          "line": 60
                        },
                        "snippet": "  58 |     const resp = await ctx.get(BASE_URL);\n  59 |     const html = await resp.text();\n> 60 |     expect(html).toContain('placeholder=\"2025\"');\n     |                  ^\n  61 |   });\n  62 | });\n  63 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 18,
                            "line": 60
                          },
                          "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\"placeholder=\\\"2025\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  58 |     const resp = await ctx.get(BASE_URL);\n  59 |     const html = await resp.text();\n> 60 |     expect(html).toContain('placeholder=\"2025\"');\n     |                  ^\n  61 |   });\n  62 | });\n  63 |\n    at /var/www/360lm/tests/sales.spec.js:60:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:14.164Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Canonical-Jo-a6974-laceholder-is-2025-4-digit--desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 18,
                        "line": 60
                      }
                    },
                    {
                      "workerIndex": 375,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 57,
                      "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\"placeholder=\\\"2025\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"placeholder=\\\"2025\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:60:18",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 18,
                          "line": 60
                        },
                        "snippet": "  58 |     const resp = await ctx.get(BASE_URL);\n  59 |     const html = await resp.text();\n> 60 |     expect(html).toContain('placeholder=\"2025\"');\n     |                  ^\n  61 |   });\n  62 | });\n  63 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 18,
                            "line": 60
                          },
                          "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\"placeholder=\\\"2025\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  58 |     const resp = await ctx.get(BASE_URL);\n  59 |     const html = await resp.text();\n> 60 |     expect(html).toContain('placeholder=\"2025\"');\n     |                  ^\n  61 |   });\n  62 | });\n  63 |\n    at /var/www/360lm/tests/sales.spec.js:60:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:42:15.096Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Canonical-Jo-a6974-laceholder-is-2025-4-digit--desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 18,
                        "line": 60
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-3525d1db881808a9c5d9",
              "file": "sales.spec.js",
              "line": 56,
              "column": 3
            }
          ]
        },
        {
          "title": "Sales — Single-Step Job Creation",
          "file": "sales.spec.js",
          "line": 65,
          "column": 6,
          "specs": [
            {
              "title": "source no longer references installHdr/installation profile (ADR-111)",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 174,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 73,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:31.154Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "569c8645201f3ed4d37d-5ad8cf624b5f4d5404df",
              "file": "sales.spec.js",
              "line": 66,
              "column": 3
            },
            {
              "title": "source contains campaignSlug and buildCampaignIdStr helpers",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 174,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 15,
                      "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\"campaignSlug\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"campaignSlug\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:77:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 77
                        },
                        "snippet": "  75 |     const resp = await ctx.get(BASE_URL);\n  76 |     const src = await resp.text();\n> 77 |     expect(src).toContain('campaignSlug');\n     |                 ^\n  78 |     expect(src).toContain('buildCampaignIdStr');\n  79 |   });\n  80 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 77
                          },
                          "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\"campaignSlug\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  75 |     const resp = await ctx.get(BASE_URL);\n  76 |     const src = await resp.text();\n> 77 |     expect(src).toContain('campaignSlug');\n     |                 ^\n  78 |     expect(src).toContain('buildCampaignIdStr');\n  79 |   });\n  80 |\n    at /var/www/360lm/tests/sales.spec.js:77:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:31.287Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--9f68f--buildCampaignIdStr-helpers-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 77
                      }
                    },
                    {
                      "workerIndex": 175,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 68,
                      "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\"campaignSlug\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"campaignSlug\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:77:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 77
                        },
                        "snippet": "  75 |     const resp = await ctx.get(BASE_URL);\n  76 |     const src = await resp.text();\n> 77 |     expect(src).toContain('campaignSlug');\n     |                 ^\n  78 |     expect(src).toContain('buildCampaignIdStr');\n  79 |   });\n  80 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 77
                          },
                          "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\"campaignSlug\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  75 |     const resp = await ctx.get(BASE_URL);\n  76 |     const src = await resp.text();\n> 77 |     expect(src).toContain('campaignSlug');\n     |                 ^\n  78 |     expect(src).toContain('buildCampaignIdStr');\n  79 |   });\n  80 |\n    at /var/www/360lm/tests/sales.spec.js:77:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:25:32.267Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--9f68f--buildCampaignIdStr-helpers-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 77
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-da54a25dfc32f65a85c8",
              "file": "sales.spec.js",
              "line": 73,
              "column": 3
            },
            {
              "title": "source writes new jobs directly to /db/jobs with operational_draft status",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 176,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 80,
                      "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\"fetch(`${CFG.api}/jobs`\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"fetch(`${CFG.api}/jobs`\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:85:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 85
                        },
                        "snippet": "  83 |     const resp = await ctx.get(BASE_URL);\n  84 |     const src = await resp.text();\n> 85 |     expect(src).toContain(\"fetch(`${CFG.api}/jobs`\");\n     |                 ^\n  86 |     expect(src).toContain(\"'operational_draft'\");\n  87 |   });\n  88 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 85
                          },
                          "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\"fetch(`${CFG.api}/jobs`\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  83 |     const resp = await ctx.get(BASE_URL);\n  84 |     const src = await resp.text();\n> 85 |     expect(src).toContain(\"fetch(`${CFG.api}/jobs`\");\n     |                 ^\n  86 |     expect(src).toContain(\"'operational_draft'\");\n  87 |   });\n  88 |\n    at /var/www/360lm/tests/sales.spec.js:85:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:33.188Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--4e858-th-operational-draft-status-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 85
                      }
                    },
                    {
                      "workerIndex": 177,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 73,
                      "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\"fetch(`${CFG.api}/jobs`\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"fetch(`${CFG.api}/jobs`\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:85:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 85
                        },
                        "snippet": "  83 |     const resp = await ctx.get(BASE_URL);\n  84 |     const src = await resp.text();\n> 85 |     expect(src).toContain(\"fetch(`${CFG.api}/jobs`\");\n     |                 ^\n  86 |     expect(src).toContain(\"'operational_draft'\");\n  87 |   });\n  88 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 85
                          },
                          "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\"fetch(`${CFG.api}/jobs`\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  83 |     const resp = await ctx.get(BASE_URL);\n  84 |     const src = await resp.text();\n> 85 |     expect(src).toContain(\"fetch(`${CFG.api}/jobs`\");\n     |                 ^\n  86 |     expect(src).toContain(\"'operational_draft'\");\n  87 |   });\n  88 |\n    at /var/www/360lm/tests/sales.spec.js:85:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:25:34.206Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--4e858-th-operational-draft-status-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 85
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-d89a8a0db4ae3605e5bc",
              "file": "sales.spec.js",
              "line": 81,
              "column": 3
            },
            {
              "title": "source writes campaign_id to sales.jobs",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 178,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 60,
                      "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\"campaign_id:   campaignId\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"campaign_id:   campaignId\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:93:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 93
                        },
                        "snippet": "  91 |     const resp = await ctx.get(BASE_URL);\n  92 |     const src = await resp.text();\n> 93 |     expect(src).toContain('campaign_id:   campaignId');\n     |                 ^\n  94 |     expect(src).toContain('job_name:      campaignId');\n  95 |   });\n  96 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 93
                          },
                          "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\"campaign_id:   campaignId\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  91 |     const resp = await ctx.get(BASE_URL);\n  92 |     const src = await resp.text();\n> 93 |     expect(src).toContain('campaign_id:   campaignId');\n     |                 ^\n  94 |     expect(src).toContain('job_name:      campaignId');\n  95 |   });\n  96 |\n    at /var/www/360lm/tests/sales.spec.js:93:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:35.134Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--e21ad-s-campaign-id-to-sales-jobs-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 93
                      }
                    },
                    {
                      "workerIndex": 179,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 61,
                      "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\"campaign_id:   campaignId\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"campaign_id:   campaignId\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:93:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 93
                        },
                        "snippet": "  91 |     const resp = await ctx.get(BASE_URL);\n  92 |     const src = await resp.text();\n> 93 |     expect(src).toContain('campaign_id:   campaignId');\n     |                 ^\n  94 |     expect(src).toContain('job_name:      campaignId');\n  95 |   });\n  96 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 93
                          },
                          "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\"campaign_id:   campaignId\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  91 |     const resp = await ctx.get(BASE_URL);\n  92 |     const src = await resp.text();\n> 93 |     expect(src).toContain('campaign_id:   campaignId');\n     |                 ^\n  94 |     expect(src).toContain('job_name:      campaignId');\n  95 |   });\n  96 |\n    at /var/www/360lm/tests/sales.spec.js:93:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:25:36.050Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--e21ad-s-campaign-id-to-sales-jobs-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 93
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-d93331224d0314824ff4",
              "file": "sales.spec.js",
              "line": 89,
              "column": 3
            },
            {
              "title": "source has app-layer rollback on Step 2 fail",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 180,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 82,
                      "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\"App-layer rollback\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"App-layer rollback\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:101:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 101
                        },
                        "snippet": "   99 |     const resp = await ctx.get(BASE_URL);\n  100 |     const src = await resp.text();\n> 101 |     expect(src).toContain('App-layer rollback');\n      |                 ^\n  102 |     expect(src).toContain(\"method:'DELETE'\");\n  103 |     // Duplicate campaign_id gives clear error message\n  104 |     expect(src).toContain('23505');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 101
                          },
                          "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\"App-layer rollback\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n   99 |     const resp = await ctx.get(BASE_URL);\n  100 |     const src = await resp.text();\n> 101 |     expect(src).toContain('App-layer rollback');\n      |                 ^\n  102 |     expect(src).toContain(\"method:'DELETE'\");\n  103 |     // Duplicate campaign_id gives clear error message\n  104 |     expect(src).toContain('23505');\n    at /var/www/360lm/tests/sales.spec.js:101:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:37.221Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--a9676-yer-rollback-on-Step-2-fail-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 101
                      }
                    },
                    {
                      "workerIndex": 181,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 55,
                      "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\"App-layer rollback\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"App-layer rollback\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:101:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 101
                        },
                        "snippet": "   99 |     const resp = await ctx.get(BASE_URL);\n  100 |     const src = await resp.text();\n> 101 |     expect(src).toContain('App-layer rollback');\n      |                 ^\n  102 |     expect(src).toContain(\"method:'DELETE'\");\n  103 |     // Duplicate campaign_id gives clear error message\n  104 |     expect(src).toContain('23505');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 101
                          },
                          "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\"App-layer rollback\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n   99 |     const resp = await ctx.get(BASE_URL);\n  100 |     const src = await resp.text();\n> 101 |     expect(src).toContain('App-layer rollback');\n      |                 ^\n  102 |     expect(src).toContain(\"method:'DELETE'\");\n  103 |     // Duplicate campaign_id gives clear error message\n  104 |     expect(src).toContain('23505');\n    at /var/www/360lm/tests/sales.spec.js:101:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:25:38.317Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--a9676-yer-rollback-on-Step-2-fail-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 101
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-889265931b58343bfcb9",
              "file": "sales.spec.js",
              "line": 97,
              "column": 3
            },
            {
              "title": "source contains zone state and loadZoneChips",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 182,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 72,
                      "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\"_selectedZones\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"_selectedZones\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:112:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 112
                        },
                        "snippet": "  110 |     const resp = await ctx.get(BASE_URL);\n  111 |     const src = await resp.text();\n> 112 |     expect(src).toContain('_selectedZones');\n      |                 ^\n  113 |     expect(src).toContain('loadZoneChips');\n  114 |     expect(src).toContain('toggleZone');\n  115 |     expect(src).toContain('renderZoneChips');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 112
                          },
                          "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\"_selectedZones\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  110 |     const resp = await ctx.get(BASE_URL);\n  111 |     const src = await resp.text();\n> 112 |     expect(src).toContain('_selectedZones');\n      |                 ^\n  113 |     expect(src).toContain('loadZoneChips');\n  114 |     expect(src).toContain('toggleZone');\n  115 |     expect(src).toContain('renderZoneChips');\n    at /var/www/360lm/tests/sales.spec.js:112:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:39.358Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--6bcf1-one-state-and-loadZoneChips-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 112
                      }
                    },
                    {
                      "workerIndex": 183,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 69,
                      "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\"_selectedZones\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"_selectedZones\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:112:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 112
                        },
                        "snippet": "  110 |     const resp = await ctx.get(BASE_URL);\n  111 |     const src = await resp.text();\n> 112 |     expect(src).toContain('_selectedZones');\n      |                 ^\n  113 |     expect(src).toContain('loadZoneChips');\n  114 |     expect(src).toContain('toggleZone');\n  115 |     expect(src).toContain('renderZoneChips');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 112
                          },
                          "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\"_selectedZones\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  110 |     const resp = await ctx.get(BASE_URL);\n  111 |     const src = await resp.text();\n> 112 |     expect(src).toContain('_selectedZones');\n      |                 ^\n  113 |     expect(src).toContain('loadZoneChips');\n  114 |     expect(src).toContain('toggleZone');\n  115 |     expect(src).toContain('renderZoneChips');\n    at /var/www/360lm/tests/sales.spec.js:112:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:25:40.299Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--6bcf1-one-state-and-loadZoneChips-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 112
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-42b356a4eb8c1825fb4a",
              "file": "sales.spec.js",
              "line": 108,
              "column": 3
            },
            {
              "title": "zone selection is required (validation in saveJob)",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 184,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 68,
                      "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\"Select at least one zone\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"Select at least one zone\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:122:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 122
                        },
                        "snippet": "  120 |     const resp = await ctx.get(BASE_URL);\n  121 |     const src = await resp.text();\n> 122 |     expect(src).toContain('Select at least one zone');\n      |                 ^\n  123 |   });\n  124 |\n  125 |   test('edit mode locks campaign identity fields', async ({}) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 122
                          },
                          "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\"Select at least one zone\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  120 |     const resp = await ctx.get(BASE_URL);\n  121 |     const src = await resp.text();\n> 122 |     expect(src).toContain('Select at least one zone');\n      |                 ^\n  123 |   });\n  124 |\n  125 |   test('edit mode locks campaign identity fields', async ({}) => {\n    at /var/www/360lm/tests/sales.spec.js:122:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:41.296Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--39f33-ired-validation-in-saveJob--android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 122
                      }
                    },
                    {
                      "workerIndex": 185,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 71,
                      "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\"Select at least one zone\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"Select at least one zone\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:122:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 122
                        },
                        "snippet": "  120 |     const resp = await ctx.get(BASE_URL);\n  121 |     const src = await resp.text();\n> 122 |     expect(src).toContain('Select at least one zone');\n      |                 ^\n  123 |   });\n  124 |\n  125 |   test('edit mode locks campaign identity fields', async ({}) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 122
                          },
                          "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\"Select at least one zone\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  120 |     const resp = await ctx.get(BASE_URL);\n  121 |     const src = await resp.text();\n> 122 |     expect(src).toContain('Select at least one zone');\n      |                 ^\n  123 |   });\n  124 |\n  125 |   test('edit mode locks campaign identity fields', async ({}) => {\n    at /var/www/360lm/tests/sales.spec.js:122:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:25:42.270Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--39f33-ired-validation-in-saveJob--android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 122
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-1d3f21c76456457a441f",
              "file": "sales.spec.js",
              "line": 118,
              "column": 3
            },
            {
              "title": "edit mode locks campaign identity fields",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 186,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 55,
                      "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\"'f-year','f-phase','f-brand','f-client','f-campaign'\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"'f-year','f-phase','f-brand','f-client','f-campaign'\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:129:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 129
                        },
                        "snippet": "  127 |     const resp = await ctx.get(BASE_URL);\n  128 |     const src = await resp.text();\n> 129 |     expect(src).toContain(\"'f-year','f-phase','f-brand','f-client','f-campaign'\");\n      |                 ^\n  130 |     expect(src).toContain('el.disabled = locked');\n  131 |     expect(src).toContain('zonesGroup.style.display = \\'none\\'');\n  132 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 129
                          },
                          "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\"'f-year','f-phase','f-brand','f-client','f-campaign'\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  127 |     const resp = await ctx.get(BASE_URL);\n  128 |     const src = await resp.text();\n> 129 |     expect(src).toContain(\"'f-year','f-phase','f-brand','f-client','f-campaign'\");\n      |                 ^\n  130 |     expect(src).toContain('el.disabled = locked');\n  131 |     expect(src).toContain('zonesGroup.style.display = \\'none\\'');\n  132 |   });\n    at /var/www/360lm/tests/sales.spec.js:129:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:43.172Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--c4a60-ks-campaign-identity-fields-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 129
                      }
                    },
                    {
                      "workerIndex": 187,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 73,
                      "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\"'f-year','f-phase','f-brand','f-client','f-campaign'\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"'f-year','f-phase','f-brand','f-client','f-campaign'\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:129:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 129
                        },
                        "snippet": "  127 |     const resp = await ctx.get(BASE_URL);\n  128 |     const src = await resp.text();\n> 129 |     expect(src).toContain(\"'f-year','f-phase','f-brand','f-client','f-campaign'\");\n      |                 ^\n  130 |     expect(src).toContain('el.disabled = locked');\n  131 |     expect(src).toContain('zonesGroup.style.display = \\'none\\'');\n  132 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 129
                          },
                          "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\"'f-year','f-phase','f-brand','f-client','f-campaign'\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  127 |     const resp = await ctx.get(BASE_URL);\n  128 |     const src = await resp.text();\n> 129 |     expect(src).toContain(\"'f-year','f-phase','f-brand','f-client','f-campaign'\");\n      |                 ^\n  130 |     expect(src).toContain('el.disabled = locked');\n  131 |     expect(src).toContain('zonesGroup.style.display = \\'none\\'');\n  132 |   });\n    at /var/www/360lm/tests/sales.spec.js:129:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:25:44.160Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--c4a60-ks-campaign-identity-fields-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 129
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-949542a1c101aaf434cb",
              "file": "sales.spec.js",
              "line": 125,
              "column": 3
            },
            {
              "title": "source no longer references installHdr/installation profile (ADR-111)",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 376,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 51,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:15.954Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "569c8645201f3ed4d37d-39b93cd4c6387331fbef",
              "file": "sales.spec.js",
              "line": 66,
              "column": 3
            },
            {
              "title": "source contains campaignSlug and buildCampaignIdStr helpers",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 376,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 26,
                      "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\"campaignSlug\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"campaignSlug\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:77:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 77
                        },
                        "snippet": "  75 |     const resp = await ctx.get(BASE_URL);\n  76 |     const src = await resp.text();\n> 77 |     expect(src).toContain('campaignSlug');\n     |                 ^\n  78 |     expect(src).toContain('buildCampaignIdStr');\n  79 |   });\n  80 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 77
                          },
                          "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\"campaignSlug\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  75 |     const resp = await ctx.get(BASE_URL);\n  76 |     const src = await resp.text();\n> 77 |     expect(src).toContain('campaignSlug');\n     |                 ^\n  78 |     expect(src).toContain('buildCampaignIdStr');\n  79 |   });\n  80 |\n    at /var/www/360lm/tests/sales.spec.js:77:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:16.047Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--9f68f--buildCampaignIdStr-helpers-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 77
                      }
                    },
                    {
                      "workerIndex": 377,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 65,
                      "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\"campaignSlug\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"campaignSlug\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:77:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 77
                        },
                        "snippet": "  75 |     const resp = await ctx.get(BASE_URL);\n  76 |     const src = await resp.text();\n> 77 |     expect(src).toContain('campaignSlug');\n     |                 ^\n  78 |     expect(src).toContain('buildCampaignIdStr');\n  79 |   });\n  80 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 77
                          },
                          "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\"campaignSlug\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  75 |     const resp = await ctx.get(BASE_URL);\n  76 |     const src = await resp.text();\n> 77 |     expect(src).toContain('campaignSlug');\n     |                 ^\n  78 |     expect(src).toContain('buildCampaignIdStr');\n  79 |   });\n  80 |\n    at /var/www/360lm/tests/sales.spec.js:77:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:42:16.984Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--9f68f--buildCampaignIdStr-helpers-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 77
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-3bfbdb2dec9ef189ce02",
              "file": "sales.spec.js",
              "line": 73,
              "column": 3
            },
            {
              "title": "source writes new jobs directly to /db/jobs with operational_draft status",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 378,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 82,
                      "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\"fetch(`${CFG.api}/jobs`\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"fetch(`${CFG.api}/jobs`\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:85:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 85
                        },
                        "snippet": "  83 |     const resp = await ctx.get(BASE_URL);\n  84 |     const src = await resp.text();\n> 85 |     expect(src).toContain(\"fetch(`${CFG.api}/jobs`\");\n     |                 ^\n  86 |     expect(src).toContain(\"'operational_draft'\");\n  87 |   });\n  88 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 85
                          },
                          "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\"fetch(`${CFG.api}/jobs`\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  83 |     const resp = await ctx.get(BASE_URL);\n  84 |     const src = await resp.text();\n> 85 |     expect(src).toContain(\"fetch(`${CFG.api}/jobs`\");\n     |                 ^\n  86 |     expect(src).toContain(\"'operational_draft'\");\n  87 |   });\n  88 |\n    at /var/www/360lm/tests/sales.spec.js:85:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:18.031Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--4e858-th-operational-draft-status-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 85
                      }
                    },
                    {
                      "workerIndex": 379,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 97,
                      "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\"fetch(`${CFG.api}/jobs`\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"fetch(`${CFG.api}/jobs`\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:85:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 85
                        },
                        "snippet": "  83 |     const resp = await ctx.get(BASE_URL);\n  84 |     const src = await resp.text();\n> 85 |     expect(src).toContain(\"fetch(`${CFG.api}/jobs`\");\n     |                 ^\n  86 |     expect(src).toContain(\"'operational_draft'\");\n  87 |   });\n  88 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 85
                          },
                          "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\"fetch(`${CFG.api}/jobs`\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  83 |     const resp = await ctx.get(BASE_URL);\n  84 |     const src = await resp.text();\n> 85 |     expect(src).toContain(\"fetch(`${CFG.api}/jobs`\");\n     |                 ^\n  86 |     expect(src).toContain(\"'operational_draft'\");\n  87 |   });\n  88 |\n    at /var/www/360lm/tests/sales.spec.js:85:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:42:19.294Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--4e858-th-operational-draft-status-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 85
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-6a99224cf0b3485ce212",
              "file": "sales.spec.js",
              "line": 81,
              "column": 3
            },
            {
              "title": "source writes campaign_id to sales.jobs",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 380,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 63,
                      "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\"campaign_id:   campaignId\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"campaign_id:   campaignId\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:93:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 93
                        },
                        "snippet": "  91 |     const resp = await ctx.get(BASE_URL);\n  92 |     const src = await resp.text();\n> 93 |     expect(src).toContain('campaign_id:   campaignId');\n     |                 ^\n  94 |     expect(src).toContain('job_name:      campaignId');\n  95 |   });\n  96 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 93
                          },
                          "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\"campaign_id:   campaignId\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  91 |     const resp = await ctx.get(BASE_URL);\n  92 |     const src = await resp.text();\n> 93 |     expect(src).toContain('campaign_id:   campaignId');\n     |                 ^\n  94 |     expect(src).toContain('job_name:      campaignId');\n  95 |   });\n  96 |\n    at /var/www/360lm/tests/sales.spec.js:93:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:20.468Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--e21ad-s-campaign-id-to-sales-jobs-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 93
                      }
                    },
                    {
                      "workerIndex": 381,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 51,
                      "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\"campaign_id:   campaignId\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"campaign_id:   campaignId\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:93:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 93
                        },
                        "snippet": "  91 |     const resp = await ctx.get(BASE_URL);\n  92 |     const src = await resp.text();\n> 93 |     expect(src).toContain('campaign_id:   campaignId');\n     |                 ^\n  94 |     expect(src).toContain('job_name:      campaignId');\n  95 |   });\n  96 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 93
                          },
                          "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\"campaign_id:   campaignId\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  91 |     const resp = await ctx.get(BASE_URL);\n  92 |     const src = await resp.text();\n> 93 |     expect(src).toContain('campaign_id:   campaignId');\n     |                 ^\n  94 |     expect(src).toContain('job_name:      campaignId');\n  95 |   });\n  96 |\n    at /var/www/360lm/tests/sales.spec.js:93:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:42:21.359Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--e21ad-s-campaign-id-to-sales-jobs-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 93
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-cd2f1d12bc4731dda73a",
              "file": "sales.spec.js",
              "line": 89,
              "column": 3
            },
            {
              "title": "source has app-layer rollback on Step 2 fail",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 382,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 80,
                      "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\"App-layer rollback\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"App-layer rollback\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:101:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 101
                        },
                        "snippet": "   99 |     const resp = await ctx.get(BASE_URL);\n  100 |     const src = await resp.text();\n> 101 |     expect(src).toContain('App-layer rollback');\n      |                 ^\n  102 |     expect(src).toContain(\"method:'DELETE'\");\n  103 |     // Duplicate campaign_id gives clear error message\n  104 |     expect(src).toContain('23505');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 101
                          },
                          "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\"App-layer rollback\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n   99 |     const resp = await ctx.get(BASE_URL);\n  100 |     const src = await resp.text();\n> 101 |     expect(src).toContain('App-layer rollback');\n      |                 ^\n  102 |     expect(src).toContain(\"method:'DELETE'\");\n  103 |     // Duplicate campaign_id gives clear error message\n  104 |     expect(src).toContain('23505');\n    at /var/www/360lm/tests/sales.spec.js:101:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:22.240Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--a9676-yer-rollback-on-Step-2-fail-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 101
                      }
                    },
                    {
                      "workerIndex": 383,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 73,
                      "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\"App-layer rollback\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"App-layer rollback\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:101:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 101
                        },
                        "snippet": "   99 |     const resp = await ctx.get(BASE_URL);\n  100 |     const src = await resp.text();\n> 101 |     expect(src).toContain('App-layer rollback');\n      |                 ^\n  102 |     expect(src).toContain(\"method:'DELETE'\");\n  103 |     // Duplicate campaign_id gives clear error message\n  104 |     expect(src).toContain('23505');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 101
                          },
                          "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\"App-layer rollback\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n   99 |     const resp = await ctx.get(BASE_URL);\n  100 |     const src = await resp.text();\n> 101 |     expect(src).toContain('App-layer rollback');\n      |                 ^\n  102 |     expect(src).toContain(\"method:'DELETE'\");\n  103 |     // Duplicate campaign_id gives clear error message\n  104 |     expect(src).toContain('23505');\n    at /var/www/360lm/tests/sales.spec.js:101:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:42:23.210Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--a9676-yer-rollback-on-Step-2-fail-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 101
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-d88ae2e537546803314d",
              "file": "sales.spec.js",
              "line": 97,
              "column": 3
            },
            {
              "title": "source contains zone state and loadZoneChips",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 384,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 64,
                      "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\"_selectedZones\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"_selectedZones\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:112:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 112
                        },
                        "snippet": "  110 |     const resp = await ctx.get(BASE_URL);\n  111 |     const src = await resp.text();\n> 112 |     expect(src).toContain('_selectedZones');\n      |                 ^\n  113 |     expect(src).toContain('loadZoneChips');\n  114 |     expect(src).toContain('toggleZone');\n  115 |     expect(src).toContain('renderZoneChips');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 112
                          },
                          "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\"_selectedZones\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  110 |     const resp = await ctx.get(BASE_URL);\n  111 |     const src = await resp.text();\n> 112 |     expect(src).toContain('_selectedZones');\n      |                 ^\n  113 |     expect(src).toContain('loadZoneChips');\n  114 |     expect(src).toContain('toggleZone');\n  115 |     expect(src).toContain('renderZoneChips');\n    at /var/www/360lm/tests/sales.spec.js:112:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:24.147Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--6bcf1-one-state-and-loadZoneChips-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 112
                      }
                    },
                    {
                      "workerIndex": 385,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 59,
                      "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\"_selectedZones\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"_selectedZones\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:112:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 112
                        },
                        "snippet": "  110 |     const resp = await ctx.get(BASE_URL);\n  111 |     const src = await resp.text();\n> 112 |     expect(src).toContain('_selectedZones');\n      |                 ^\n  113 |     expect(src).toContain('loadZoneChips');\n  114 |     expect(src).toContain('toggleZone');\n  115 |     expect(src).toContain('renderZoneChips');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 112
                          },
                          "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\"_selectedZones\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  110 |     const resp = await ctx.get(BASE_URL);\n  111 |     const src = await resp.text();\n> 112 |     expect(src).toContain('_selectedZones');\n      |                 ^\n  113 |     expect(src).toContain('loadZoneChips');\n  114 |     expect(src).toContain('toggleZone');\n  115 |     expect(src).toContain('renderZoneChips');\n    at /var/www/360lm/tests/sales.spec.js:112:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:42:25.051Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--6bcf1-one-state-and-loadZoneChips-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 112
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-1464811f6c969c7f4a82",
              "file": "sales.spec.js",
              "line": 108,
              "column": 3
            },
            {
              "title": "zone selection is required (validation in saveJob)",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 386,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 76,
                      "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\"Select at least one zone\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"Select at least one zone\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:122:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 122
                        },
                        "snippet": "  120 |     const resp = await ctx.get(BASE_URL);\n  121 |     const src = await resp.text();\n> 122 |     expect(src).toContain('Select at least one zone');\n      |                 ^\n  123 |   });\n  124 |\n  125 |   test('edit mode locks campaign identity fields', async ({}) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 122
                          },
                          "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\"Select at least one zone\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  120 |     const resp = await ctx.get(BASE_URL);\n  121 |     const src = await resp.text();\n> 122 |     expect(src).toContain('Select at least one zone');\n      |                 ^\n  123 |   });\n  124 |\n  125 |   test('edit mode locks campaign identity fields', async ({}) => {\n    at /var/www/360lm/tests/sales.spec.js:122:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:25.995Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--39f33-ired-validation-in-saveJob--desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 122
                      }
                    },
                    {
                      "workerIndex": 387,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 67,
                      "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\"Select at least one zone\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"Select at least one zone\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:122:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 122
                        },
                        "snippet": "  120 |     const resp = await ctx.get(BASE_URL);\n  121 |     const src = await resp.text();\n> 122 |     expect(src).toContain('Select at least one zone');\n      |                 ^\n  123 |   });\n  124 |\n  125 |   test('edit mode locks campaign identity fields', async ({}) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 122
                          },
                          "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\"Select at least one zone\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  120 |     const resp = await ctx.get(BASE_URL);\n  121 |     const src = await resp.text();\n> 122 |     expect(src).toContain('Select at least one zone');\n      |                 ^\n  123 |   });\n  124 |\n  125 |   test('edit mode locks campaign identity fields', async ({}) => {\n    at /var/www/360lm/tests/sales.spec.js:122:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:42:27.158Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--39f33-ired-validation-in-saveJob--desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 122
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-f1992f662fc4b77e691c",
              "file": "sales.spec.js",
              "line": 118,
              "column": 3
            },
            {
              "title": "edit mode locks campaign identity fields",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 388,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 59,
                      "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\"'f-year','f-phase','f-brand','f-client','f-campaign'\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"'f-year','f-phase','f-brand','f-client','f-campaign'\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:129:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 129
                        },
                        "snippet": "  127 |     const resp = await ctx.get(BASE_URL);\n  128 |     const src = await resp.text();\n> 129 |     expect(src).toContain(\"'f-year','f-phase','f-brand','f-client','f-campaign'\");\n      |                 ^\n  130 |     expect(src).toContain('el.disabled = locked');\n  131 |     expect(src).toContain('zonesGroup.style.display = \\'none\\'');\n  132 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 129
                          },
                          "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\"'f-year','f-phase','f-brand','f-client','f-campaign'\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  127 |     const resp = await ctx.get(BASE_URL);\n  128 |     const src = await resp.text();\n> 129 |     expect(src).toContain(\"'f-year','f-phase','f-brand','f-client','f-campaign'\");\n      |                 ^\n  130 |     expect(src).toContain('el.disabled = locked');\n  131 |     expect(src).toContain('zonesGroup.style.display = \\'none\\'');\n  132 |   });\n    at /var/www/360lm/tests/sales.spec.js:129:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:28.057Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--c4a60-ks-campaign-identity-fields-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 129
                      }
                    },
                    {
                      "workerIndex": 389,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 94,
                      "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\"'f-year','f-phase','f-brand','f-client','f-campaign'\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"'f-year','f-phase','f-brand','f-client','f-campaign'\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:129:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 129
                        },
                        "snippet": "  127 |     const resp = await ctx.get(BASE_URL);\n  128 |     const src = await resp.text();\n> 129 |     expect(src).toContain(\"'f-year','f-phase','f-brand','f-client','f-campaign'\");\n      |                 ^\n  130 |     expect(src).toContain('el.disabled = locked');\n  131 |     expect(src).toContain('zonesGroup.style.display = \\'none\\'');\n  132 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 129
                          },
                          "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\"'f-year','f-phase','f-brand','f-client','f-campaign'\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  127 |     const resp = await ctx.get(BASE_URL);\n  128 |     const src = await resp.text();\n> 129 |     expect(src).toContain(\"'f-year','f-phase','f-brand','f-client','f-campaign'\");\n      |                 ^\n  130 |     expect(src).toContain('el.disabled = locked');\n  131 |     expect(src).toContain('zonesGroup.style.display = \\'none\\'');\n  132 |   });\n    at /var/www/360lm/tests/sales.spec.js:129:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:42:29.006Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Single-Step--c4a60-ks-campaign-identity-fields-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 129
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-ee4b0e2bbd37f16ead0d",
              "file": "sales.spec.js",
              "line": 125,
              "column": 3
            }
          ]
        },
        {
          "title": "Hub PWA — Campaign Creation Removed (Step 4b)",
          "file": "sales.spec.js",
          "line": 136,
          "column": 6,
          "specs": [
            {
              "title": "hub sw.js contains a current version",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 188,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 339,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:45.101Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "569c8645201f3ed4d37d-1c6a2e6300199365143f",
              "file": "sales.spec.js",
              "line": 139,
              "column": 3
            },
            {
              "title": "hub source no longer contains modal-new-campaign form fields",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 188,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 64,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:45.603Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "569c8645201f3ed4d37d-3f8919964aeb839afad2",
              "file": "sales.spec.js",
              "line": 145,
              "column": 3
            },
            {
              "title": "hub source has stub openNewCampaign redirecting to /sales/",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 188,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 22,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:45.685Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "569c8645201f3ed4d37d-60b336a2df5e13cdfe78",
              "file": "sales.spec.js",
              "line": 157,
              "column": 3
            },
            {
              "title": "hub sw.js contains a current version",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 390,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 296,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:30.048Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "569c8645201f3ed4d37d-f5cbcb93cda3b3be3faa",
              "file": "sales.spec.js",
              "line": 139,
              "column": 3
            },
            {
              "title": "hub source no longer contains modal-new-campaign form fields",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 390,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 67,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:30.536Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "569c8645201f3ed4d37d-fb80ba38634819e79910",
              "file": "sales.spec.js",
              "line": 145,
              "column": 3
            },
            {
              "title": "hub source has stub openNewCampaign redirecting to /sales/",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 390,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 15,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:30.619Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "569c8645201f3ed4d37d-fc1538922916d8d0528e",
              "file": "sales.spec.js",
              "line": 157,
              "column": 3
            }
          ]
        },
        {
          "title": "Sales — Proforma Invoice",
          "file": "sales.spec.js",
          "line": 167,
          "column": 6,
          "specs": [
            {
              "title": "source contains openProformaOptions function",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 188,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 15,
                      "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\"function openProformaOptions(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"function openProformaOptions(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:172:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 172
                        },
                        "snippet": "  170 |     const src = await (await ctx.get(BASE_URL)).text();\n  171 |     await ctx.dispose();\n> 172 |     expect(src).toContain('function openProformaOptions(');\n      |                 ^\n  173 |     expect(src).toContain('function generateProforma(');\n  174 |     expect(src).toContain('function buildProformaHtml(');\n  175 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 172
                          },
                          "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\"function openProformaOptions(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  170 |     const src = await (await ctx.get(BASE_URL)).text();\n  171 |     await ctx.dispose();\n> 172 |     expect(src).toContain('function openProformaOptions(');\n      |                 ^\n  173 |     expect(src).toContain('function generateProforma(');\n  174 |     expect(src).toContain('function buildProformaHtml(');\n  175 |   });\n    at /var/www/360lm/tests/sales.spec.js:172:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:45.723Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Proforma-Inv-9a7d3-penProformaOptions-function-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 172
                      }
                    },
                    {
                      "workerIndex": 189,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 61,
                      "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\"function openProformaOptions(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"function openProformaOptions(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:172:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 172
                        },
                        "snippet": "  170 |     const src = await (await ctx.get(BASE_URL)).text();\n  171 |     await ctx.dispose();\n> 172 |     expect(src).toContain('function openProformaOptions(');\n      |                 ^\n  173 |     expect(src).toContain('function generateProforma(');\n  174 |     expect(src).toContain('function buildProformaHtml(');\n  175 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 172
                          },
                          "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\"function openProformaOptions(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  170 |     const src = await (await ctx.get(BASE_URL)).text();\n  171 |     await ctx.dispose();\n> 172 |     expect(src).toContain('function openProformaOptions(');\n      |                 ^\n  173 |     expect(src).toContain('function generateProforma(');\n  174 |     expect(src).toContain('function buildProformaHtml(');\n  175 |   });\n    at /var/www/360lm/tests/sales.spec.js:172:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:25:46.698Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Proforma-Inv-9a7d3-penProformaOptions-function-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 172
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-ecb97df1ac13ab9ebc6b",
              "file": "sales.spec.js",
              "line": 168,
              "column": 3
            },
            {
              "title": "source does not contain \"coming soon\" placeholder for Proforma",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 190,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 64,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:47.578Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "569c8645201f3ed4d37d-4c13109a138168f53a75",
              "file": "sales.spec.js",
              "line": 177,
              "column": 3
            },
            {
              "title": "modal-proforma-opts exists in DOM",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 190,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 28,
                      "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\"id=\\\"modal-proforma-opts\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"modal-proforma-opts\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:188:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 188
                        },
                        "snippet": "  186 |     const src = await (await ctx.get(BASE_URL)).text();\n  187 |     await ctx.dispose();\n> 188 |     expect(src).toContain('id=\"modal-proforma-opts\"');\n      |                 ^\n  189 |     expect(src).toContain('id=\"proforma-advance-pct\"');\n  190 |   });\n  191 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 188
                          },
                          "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\"id=\\\"modal-proforma-opts\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  186 |     const src = await (await ctx.get(BASE_URL)).text();\n  187 |     await ctx.dispose();\n> 188 |     expect(src).toContain('id=\"modal-proforma-opts\"');\n      |                 ^\n  189 |     expect(src).toContain('id=\"proforma-advance-pct\"');\n  190 |   });\n  191 |\n    at /var/www/360lm/tests/sales.spec.js:188:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:47.702Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Proforma-Inv-0c974-proforma-opts-exists-in-DOM-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 188
                      }
                    },
                    {
                      "workerIndex": 191,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 69,
                      "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\"id=\\\"modal-proforma-opts\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"modal-proforma-opts\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:188:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 188
                        },
                        "snippet": "  186 |     const src = await (await ctx.get(BASE_URL)).text();\n  187 |     await ctx.dispose();\n> 188 |     expect(src).toContain('id=\"modal-proforma-opts\"');\n      |                 ^\n  189 |     expect(src).toContain('id=\"proforma-advance-pct\"');\n  190 |   });\n  191 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 188
                          },
                          "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\"id=\\\"modal-proforma-opts\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  186 |     const src = await (await ctx.get(BASE_URL)).text();\n  187 |     await ctx.dispose();\n> 188 |     expect(src).toContain('id=\"modal-proforma-opts\"');\n      |                 ^\n  189 |     expect(src).toContain('id=\"proforma-advance-pct\"');\n  190 |   });\n  191 |\n    at /var/www/360lm/tests/sales.spec.js:188:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:25:48.553Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Proforma-Inv-0c974-proforma-opts-exists-in-DOM-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 188
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-60cb3e7f499e63ef4680",
              "file": "sales.spec.js",
              "line": 184,
              "column": 3
            },
            {
              "title": "clients list renders Proforma Invoice button",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 192,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 63,
                      "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\"openProformaOptions('${o.offer_id}')\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"openProformaOptions('${o.offer_id}')\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:196:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 196
                        },
                        "snippet": "  194 |     const src = await (await ctx.get(BASE_URL)).text();\n  195 |     await ctx.dispose();\n> 196 |     expect(src).toContain(\"openProformaOptions('${o.offer_id}')\");\n      |                 ^\n  197 |     expect(src).toContain('Proforma Invoice');\n  198 |   });\n  199 | });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 196
                          },
                          "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\"openProformaOptions('${o.offer_id}')\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  194 |     const src = await (await ctx.get(BASE_URL)).text();\n  195 |     await ctx.dispose();\n> 196 |     expect(src).toContain(\"openProformaOptions('${o.offer_id}')\");\n      |                 ^\n  197 |     expect(src).toContain('Proforma Invoice');\n  198 |   });\n  199 | });\n    at /var/www/360lm/tests/sales.spec.js:196:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:49.438Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Proforma-Inv-a7d72-ers-Proforma-Invoice-button-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 196
                      }
                    },
                    {
                      "workerIndex": 193,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 70,
                      "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\"openProformaOptions('${o.offer_id}')\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"openProformaOptions('${o.offer_id}')\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:196:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 196
                        },
                        "snippet": "  194 |     const src = await (await ctx.get(BASE_URL)).text();\n  195 |     await ctx.dispose();\n> 196 |     expect(src).toContain(\"openProformaOptions('${o.offer_id}')\");\n      |                 ^\n  197 |     expect(src).toContain('Proforma Invoice');\n  198 |   });\n  199 | });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 196
                          },
                          "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\"openProformaOptions('${o.offer_id}')\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  194 |     const src = await (await ctx.get(BASE_URL)).text();\n  195 |     await ctx.dispose();\n> 196 |     expect(src).toContain(\"openProformaOptions('${o.offer_id}')\");\n      |                 ^\n  197 |     expect(src).toContain('Proforma Invoice');\n  198 |   });\n  199 | });\n    at /var/www/360lm/tests/sales.spec.js:196:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:25:50.426Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Proforma-Inv-a7d72-ers-Proforma-Invoice-button-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 196
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-4b89543f74b82801eb06",
              "file": "sales.spec.js",
              "line": 192,
              "column": 3
            },
            {
              "title": "source contains openProformaOptions function",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 390,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 12,
                      "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\"function openProformaOptions(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"function openProformaOptions(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:172:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 172
                        },
                        "snippet": "  170 |     const src = await (await ctx.get(BASE_URL)).text();\n  171 |     await ctx.dispose();\n> 172 |     expect(src).toContain('function openProformaOptions(');\n      |                 ^\n  173 |     expect(src).toContain('function generateProforma(');\n  174 |     expect(src).toContain('function buildProformaHtml(');\n  175 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 172
                          },
                          "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\"function openProformaOptions(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  170 |     const src = await (await ctx.get(BASE_URL)).text();\n  171 |     await ctx.dispose();\n> 172 |     expect(src).toContain('function openProformaOptions(');\n      |                 ^\n  173 |     expect(src).toContain('function generateProforma(');\n  174 |     expect(src).toContain('function buildProformaHtml(');\n  175 |   });\n    at /var/www/360lm/tests/sales.spec.js:172:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:30.664Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Proforma-Inv-9a7d3-penProformaOptions-function-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 172
                      }
                    },
                    {
                      "workerIndex": 391,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 62,
                      "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\"function openProformaOptions(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"function openProformaOptions(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:172:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 172
                        },
                        "snippet": "  170 |     const src = await (await ctx.get(BASE_URL)).text();\n  171 |     await ctx.dispose();\n> 172 |     expect(src).toContain('function openProformaOptions(');\n      |                 ^\n  173 |     expect(src).toContain('function generateProforma(');\n  174 |     expect(src).toContain('function buildProformaHtml(');\n  175 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 172
                          },
                          "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\"function openProformaOptions(\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  170 |     const src = await (await ctx.get(BASE_URL)).text();\n  171 |     await ctx.dispose();\n> 172 |     expect(src).toContain('function openProformaOptions(');\n      |                 ^\n  173 |     expect(src).toContain('function generateProforma(');\n  174 |     expect(src).toContain('function buildProformaHtml(');\n  175 |   });\n    at /var/www/360lm/tests/sales.spec.js:172:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:42:31.568Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Proforma-Inv-9a7d3-penProformaOptions-function-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 172
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-75365e3b544e65a1e839",
              "file": "sales.spec.js",
              "line": 168,
              "column": 3
            },
            {
              "title": "source does not contain \"coming soon\" placeholder for Proforma",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 392,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 60,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:32.647Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "569c8645201f3ed4d37d-15acc4abb7bcafc83055",
              "file": "sales.spec.js",
              "line": 177,
              "column": 3
            },
            {
              "title": "modal-proforma-opts exists in DOM",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 392,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 21,
                      "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\"id=\\\"modal-proforma-opts\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"modal-proforma-opts\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:188:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 188
                        },
                        "snippet": "  186 |     const src = await (await ctx.get(BASE_URL)).text();\n  187 |     await ctx.dispose();\n> 188 |     expect(src).toContain('id=\"modal-proforma-opts\"');\n      |                 ^\n  189 |     expect(src).toContain('id=\"proforma-advance-pct\"');\n  190 |   });\n  191 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 188
                          },
                          "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\"id=\\\"modal-proforma-opts\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  186 |     const src = await (await ctx.get(BASE_URL)).text();\n  187 |     await ctx.dispose();\n> 188 |     expect(src).toContain('id=\"modal-proforma-opts\"');\n      |                 ^\n  189 |     expect(src).toContain('id=\"proforma-advance-pct\"');\n  190 |   });\n  191 |\n    at /var/www/360lm/tests/sales.spec.js:188:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:32.758Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Proforma-Inv-0c974-proforma-opts-exists-in-DOM-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 188
                      }
                    },
                    {
                      "workerIndex": 393,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 66,
                      "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\"id=\\\"modal-proforma-opts\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"modal-proforma-opts\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:188:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 188
                        },
                        "snippet": "  186 |     const src = await (await ctx.get(BASE_URL)).text();\n  187 |     await ctx.dispose();\n> 188 |     expect(src).toContain('id=\"modal-proforma-opts\"');\n      |                 ^\n  189 |     expect(src).toContain('id=\"proforma-advance-pct\"');\n  190 |   });\n  191 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 188
                          },
                          "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\"id=\\\"modal-proforma-opts\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  186 |     const src = await (await ctx.get(BASE_URL)).text();\n  187 |     await ctx.dispose();\n> 188 |     expect(src).toContain('id=\"modal-proforma-opts\"');\n      |                 ^\n  189 |     expect(src).toContain('id=\"proforma-advance-pct\"');\n  190 |   });\n  191 |\n    at /var/www/360lm/tests/sales.spec.js:188:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:42:33.608Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Proforma-Inv-0c974-proforma-opts-exists-in-DOM-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 188
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-d15cc02e92001363cdf5",
              "file": "sales.spec.js",
              "line": 184,
              "column": 3
            },
            {
              "title": "clients list renders Proforma Invoice button",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 394,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 61,
                      "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\"openProformaOptions('${o.offer_id}')\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"openProformaOptions('${o.offer_id}')\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:196:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 196
                        },
                        "snippet": "  194 |     const src = await (await ctx.get(BASE_URL)).text();\n  195 |     await ctx.dispose();\n> 196 |     expect(src).toContain(\"openProformaOptions('${o.offer_id}')\");\n      |                 ^\n  197 |     expect(src).toContain('Proforma Invoice');\n  198 |   });\n  199 | });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 196
                          },
                          "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\"openProformaOptions('${o.offer_id}')\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  194 |     const src = await (await ctx.get(BASE_URL)).text();\n  195 |     await ctx.dispose();\n> 196 |     expect(src).toContain(\"openProformaOptions('${o.offer_id}')\");\n      |                 ^\n  197 |     expect(src).toContain('Proforma Invoice');\n  198 |   });\n  199 | });\n    at /var/www/360lm/tests/sales.spec.js:196:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:34.573Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Proforma-Inv-a7d72-ers-Proforma-Invoice-button-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 196
                      }
                    },
                    {
                      "workerIndex": 395,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 67,
                      "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\"openProformaOptions('${o.offer_id}')\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"openProformaOptions('${o.offer_id}')\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/sales.spec.js:196:17",
                        "location": {
                          "file": "/var/www/360lm/tests/sales.spec.js",
                          "column": 17,
                          "line": 196
                        },
                        "snippet": "  194 |     const src = await (await ctx.get(BASE_URL)).text();\n  195 |     await ctx.dispose();\n> 196 |     expect(src).toContain(\"openProformaOptions('${o.offer_id}')\");\n      |                 ^\n  197 |     expect(src).toContain('Proforma Invoice');\n  198 |   });\n  199 | });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/sales.spec.js",
                            "column": 17,
                            "line": 196
                          },
                          "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\"openProformaOptions('${o.offer_id}')\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  194 |     const src = await (await ctx.get(BASE_URL)).text();\n  195 |     await ctx.dispose();\n> 196 |     expect(src).toContain(\"openProformaOptions('${o.offer_id}')\");\n      |                 ^\n  197 |     expect(src).toContain('Proforma Invoice');\n  198 |   });\n  199 | });\n    at /var/www/360lm/tests/sales.spec.js:196:17"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:42:35.593Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/sales-Sales-—-Proforma-Inv-a7d72-ers-Proforma-Invoice-button-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/sales.spec.js",
                        "column": 17,
                        "line": 196
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "569c8645201f3ed4d37d-5024f67aa77ec722d8b7",
              "file": "sales.spec.js",
              "line": 192,
              "column": 3
            }
          ]
        }
      ]
    },
    {
      "title": "vrs.spec.js",
      "file": "vrs.spec.js",
      "column": 0,
      "line": 0,
      "specs": [],
      "suites": [
        {
          "title": "Vehicle Requisition — Smoke",
          "file": "vrs.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": 194,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1059,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:51.388Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "0c785c59ff61d83b7a53-3cf3313cb0c13bd5a656",
              "file": "vrs.spec.js",
              "line": 10,
              "column": 3
            },
            {
              "title": "manifest.json returns 200",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 194,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 261,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n    at /var/www/360lm/tests/vrs.spec.js:19:28",
                        "location": {
                          "file": "/var/www/360lm/tests/vrs.spec.js",
                          "column": 28,
                          "line": 19
                        },
                        "snippet": "  17 |   test('manifest.json returns 200', async ({ page }) => {\n  18 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 19 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  20 |   });\n  21 |\n  22 |   test('sw.js is present', async ({ page }) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/vrs.spec.js",
                            "column": 28,
                            "line": 19
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n  17 |   test('manifest.json returns 200', async ({ page }) => {\n  18 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 19 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  20 |   });\n  21 |\n  22 |   test('sw.js is present', async ({ page }) => {\n    at /var/www/360lm/tests/vrs.spec.js:19:28"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:52.617Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—-Smoke-manifest-json-returns-200-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—-Smoke-manifest-json-returns-200-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/vrs.spec.js",
                        "column": 28,
                        "line": 19
                      }
                    },
                    {
                      "workerIndex": 195,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 330,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n    at /var/www/360lm/tests/vrs.spec.js:19:28",
                        "location": {
                          "file": "/var/www/360lm/tests/vrs.spec.js",
                          "column": 28,
                          "line": 19
                        },
                        "snippet": "  17 |   test('manifest.json returns 200', async ({ page }) => {\n  18 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 19 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  20 |   });\n  21 |\n  22 |   test('sw.js is present', async ({ page }) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/vrs.spec.js",
                            "column": 28,
                            "line": 19
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n  17 |   test('manifest.json returns 200', async ({ page }) => {\n  18 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 19 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  20 |   });\n  21 |\n  22 |   test('sw.js is present', async ({ page }) => {\n    at /var/www/360lm/tests/vrs.spec.js:19:28"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:25:53.906Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—-Smoke-manifest-json-returns-200-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—-Smoke-manifest-json-returns-200-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/vrs.spec.js",
                        "column": 28,
                        "line": 19
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "0c785c59ff61d83b7a53-664923050b990ea9e9fd",
              "file": "vrs.spec.js",
              "line": 17,
              "column": 3
            },
            {
              "title": "sw.js is present",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 196,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 318,
                      "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\"vrs-v\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"vrs-v\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/vrs.spec.js:25:18",
                        "location": {
                          "file": "/var/www/360lm/tests/vrs.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('vrs-v');\n     |                  ^\n  26 |   });\n  27 | });\n  28 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/vrs.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\"vrs-v\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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('vrs-v');\n     |                  ^\n  26 |   });\n  27 | });\n  28 |\n    at /var/www/360lm/tests/vrs.spec.js:25:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:55.244Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—-Smoke-sw-js-is-present-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—-Smoke-sw-js-is-present-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/vrs.spec.js",
                        "column": 18,
                        "line": 25
                      }
                    },
                    {
                      "workerIndex": 197,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 313,
                      "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\"vrs-v\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"vrs-v\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/vrs.spec.js:25:18",
                        "location": {
                          "file": "/var/www/360lm/tests/vrs.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('vrs-v');\n     |                  ^\n  26 |   });\n  27 | });\n  28 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/vrs.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\"vrs-v\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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('vrs-v');\n     |                  ^\n  26 |   });\n  27 | });\n  28 |\n    at /var/www/360lm/tests/vrs.spec.js:25:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:25:56.615Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—-Smoke-sw-js-is-present-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—-Smoke-sw-js-is-present-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/vrs.spec.js",
                        "column": 18,
                        "line": 25
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "0c785c59ff61d83b7a53-d975811ad8c3bff860a1",
              "file": "vrs.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": 396,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1102,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:36.639Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "0c785c59ff61d83b7a53-2d79338ffc1ea8f2d5d9",
              "file": "vrs.spec.js",
              "line": 10,
              "column": 3
            },
            {
              "title": "manifest.json returns 200",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 396,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 224,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n    at /var/www/360lm/tests/vrs.spec.js:19:28",
                        "location": {
                          "file": "/var/www/360lm/tests/vrs.spec.js",
                          "column": 28,
                          "line": 19
                        },
                        "snippet": "  17 |   test('manifest.json returns 200', async ({ page }) => {\n  18 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 19 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  20 |   });\n  21 |\n  22 |   test('sw.js is present', async ({ page }) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/vrs.spec.js",
                            "column": 28,
                            "line": 19
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n  17 |   test('manifest.json returns 200', async ({ page }) => {\n  18 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 19 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  20 |   });\n  21 |\n  22 |   test('sw.js is present', async ({ page }) => {\n    at /var/www/360lm/tests/vrs.spec.js:19:28"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:37.932Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—-Smoke-manifest-json-returns-200-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—-Smoke-manifest-json-returns-200-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/vrs.spec.js",
                        "column": 28,
                        "line": 19
                      }
                    },
                    {
                      "workerIndex": 397,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 286,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n    at /var/www/360lm/tests/vrs.spec.js:19:28",
                        "location": {
                          "file": "/var/www/360lm/tests/vrs.spec.js",
                          "column": 28,
                          "line": 19
                        },
                        "snippet": "  17 |   test('manifest.json returns 200', async ({ page }) => {\n  18 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 19 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  20 |   });\n  21 |\n  22 |   test('sw.js is present', async ({ page }) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/vrs.spec.js",
                            "column": 28,
                            "line": 19
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m200\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n  17 |   test('manifest.json returns 200', async ({ page }) => {\n  18 |     const resp = await page.goto(BASE_URL + 'manifest.json');\n> 19 |     expect(resp?.status()).toBe(200);\n     |                            ^\n  20 |   });\n  21 |\n  22 |   test('sw.js is present', async ({ page }) => {\n    at /var/www/360lm/tests/vrs.spec.js:19:28"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:42:39.037Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—-Smoke-manifest-json-returns-200-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—-Smoke-manifest-json-returns-200-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/vrs.spec.js",
                        "column": 28,
                        "line": 19
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "0c785c59ff61d83b7a53-66bdc5e0b6679d1bed6a",
              "file": "vrs.spec.js",
              "line": 17,
              "column": 3
            },
            {
              "title": "sw.js is present",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 398,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 398,
                      "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\"vrs-v\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"vrs-v\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/vrs.spec.js:25:18",
                        "location": {
                          "file": "/var/www/360lm/tests/vrs.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('vrs-v');\n     |                  ^\n  26 |   });\n  27 | });\n  28 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/vrs.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\"vrs-v\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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('vrs-v');\n     |                  ^\n  26 |   });\n  27 | });\n  28 |\n    at /var/www/360lm/tests/vrs.spec.js:25:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:40.400Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—-Smoke-sw-js-is-present-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—-Smoke-sw-js-is-present-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/vrs.spec.js",
                        "column": 18,
                        "line": 25
                      }
                    },
                    {
                      "workerIndex": 399,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 355,
                      "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\"vrs-v\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"vrs-v\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/vrs.spec.js:25:18",
                        "location": {
                          "file": "/var/www/360lm/tests/vrs.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('vrs-v');\n     |                  ^\n  26 |   });\n  27 | });\n  28 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/vrs.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\"vrs-v\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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('vrs-v');\n     |                  ^\n  26 |   });\n  27 | });\n  28 |\n    at /var/www/360lm/tests/vrs.spec.js:25:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:42:42.096Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—-Smoke-sw-js-is-present-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—-Smoke-sw-js-is-present-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/vrs.spec.js",
                        "column": 18,
                        "line": 25
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "0c785c59ff61d83b7a53-9b892b68a623b5386abd",
              "file": "vrs.spec.js",
              "line": 22,
              "column": 3
            }
          ]
        },
        {
          "title": "Vehicle Requisition — HTML Structure",
          "file": "vrs.spec.js",
          "line": 29,
          "column": 6,
          "specs": [
            {
              "title": "all screens present",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 198,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 16,
                      "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\"id=\\\"screen-splash\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"screen-splash\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/vrs.spec.js:40:18",
                        "location": {
                          "file": "/var/www/360lm/tests/vrs.spec.js",
                          "column": 18,
                          "line": 40
                        },
                        "snippet": "  38 |\n  39 |   test('all screens present', () => {\n> 40 |     expect(html).toContain('id=\"screen-splash\"');\n     |                  ^\n  41 |     expect(html).toContain('id=\"screen-login\"');\n  42 |     expect(html).toContain('id=\"screen-mine\"');\n  43 |     expect(html).toContain('id=\"screen-approvals\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/vrs.spec.js",
                            "column": 18,
                            "line": 40
                          },
                          "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\"id=\\\"screen-splash\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  38 |\n  39 |   test('all screens present', () => {\n> 40 |     expect(html).toContain('id=\"screen-splash\"');\n     |                  ^\n  41 |     expect(html).toContain('id=\"screen-login\"');\n  42 |     expect(html).toContain('id=\"screen-mine\"');\n  43 |     expect(html).toContain('id=\"screen-approvals\"');\n    at /var/www/360lm/tests/vrs.spec.js:40:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:57.933Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—-HTML-Structure-all-screens-present-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/vrs.spec.js",
                        "column": 18,
                        "line": 40
                      }
                    },
                    {
                      "workerIndex": 199,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 15,
                      "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\"id=\\\"screen-splash\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"screen-splash\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/vrs.spec.js:40:18",
                        "location": {
                          "file": "/var/www/360lm/tests/vrs.spec.js",
                          "column": 18,
                          "line": 40
                        },
                        "snippet": "  38 |\n  39 |   test('all screens present', () => {\n> 40 |     expect(html).toContain('id=\"screen-splash\"');\n     |                  ^\n  41 |     expect(html).toContain('id=\"screen-login\"');\n  42 |     expect(html).toContain('id=\"screen-mine\"');\n  43 |     expect(html).toContain('id=\"screen-approvals\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/vrs.spec.js",
                            "column": 18,
                            "line": 40
                          },
                          "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\"id=\\\"screen-splash\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  38 |\n  39 |   test('all screens present', () => {\n> 40 |     expect(html).toContain('id=\"screen-splash\"');\n     |                  ^\n  41 |     expect(html).toContain('id=\"screen-login\"');\n  42 |     expect(html).toContain('id=\"screen-mine\"');\n  43 |     expect(html).toContain('id=\"screen-approvals\"');\n    at /var/www/360lm/tests/vrs.spec.js:40:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:25:58.930Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—-HTML-Structure-all-screens-present-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/vrs.spec.js",
                        "column": 18,
                        "line": 40
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "0c785c59ff61d83b7a53-29a2d7ef0d6a4cf6c5eb",
              "file": "vrs.spec.js",
              "line": 39,
              "column": 3
            },
            {
              "title": "hub navigation present on all screens",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 200,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 13,
                      "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\"href=\\\"/hub/\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"href=\\\"/hub/\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/vrs.spec.js:48:18",
                        "location": {
                          "file": "/var/www/360lm/tests/vrs.spec.js",
                          "column": 18,
                          "line": 48
                        },
                        "snippet": "  46 |\n  47 |   test('hub navigation present on all screens', () => {\n> 48 |     expect(html).toContain('href=\"/hub/\"');\n     |                  ^\n  49 |     expect(html).toContain('🏠');\n  50 |   });\n  51 | });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/vrs.spec.js",
                            "column": 18,
                            "line": 48
                          },
                          "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\"href=\\\"/hub/\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  46 |\n  47 |   test('hub navigation present on all screens', () => {\n> 48 |     expect(html).toContain('href=\"/hub/\"');\n     |                  ^\n  49 |     expect(html).toContain('🏠');\n  50 |   });\n  51 | });\n    at /var/www/360lm/tests/vrs.spec.js:48:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:25:59.939Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—--bd047-tion-present-on-all-screens-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/vrs.spec.js",
                        "column": 18,
                        "line": 48
                      }
                    },
                    {
                      "workerIndex": 201,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 40,
                      "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\"href=\\\"/hub/\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"href=\\\"/hub/\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/vrs.spec.js:48:18",
                        "location": {
                          "file": "/var/www/360lm/tests/vrs.spec.js",
                          "column": 18,
                          "line": 48
                        },
                        "snippet": "  46 |\n  47 |   test('hub navigation present on all screens', () => {\n> 48 |     expect(html).toContain('href=\"/hub/\"');\n     |                  ^\n  49 |     expect(html).toContain('🏠');\n  50 |   });\n  51 | });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/vrs.spec.js",
                            "column": 18,
                            "line": 48
                          },
                          "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\"href=\\\"/hub/\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  46 |\n  47 |   test('hub navigation present on all screens', () => {\n> 48 |     expect(html).toContain('href=\"/hub/\"');\n     |                  ^\n  49 |     expect(html).toContain('🏠');\n  50 |   });\n  51 | });\n    at /var/www/360lm/tests/vrs.spec.js:48:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:26:01.302Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—--bd047-tion-present-on-all-screens-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/vrs.spec.js",
                        "column": 18,
                        "line": 48
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "0c785c59ff61d83b7a53-90d3fbe99d93242a07fb",
              "file": "vrs.spec.js",
              "line": 47,
              "column": 3
            },
            {
              "title": "all screens present",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 400,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 9,
                      "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\"id=\\\"screen-splash\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"screen-splash\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/vrs.spec.js:40:18",
                        "location": {
                          "file": "/var/www/360lm/tests/vrs.spec.js",
                          "column": 18,
                          "line": 40
                        },
                        "snippet": "  38 |\n  39 |   test('all screens present', () => {\n> 40 |     expect(html).toContain('id=\"screen-splash\"');\n     |                  ^\n  41 |     expect(html).toContain('id=\"screen-login\"');\n  42 |     expect(html).toContain('id=\"screen-mine\"');\n  43 |     expect(html).toContain('id=\"screen-approvals\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/vrs.spec.js",
                            "column": 18,
                            "line": 40
                          },
                          "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\"id=\\\"screen-splash\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  38 |\n  39 |   test('all screens present', () => {\n> 40 |     expect(html).toContain('id=\"screen-splash\"');\n     |                  ^\n  41 |     expect(html).toContain('id=\"screen-login\"');\n  42 |     expect(html).toContain('id=\"screen-mine\"');\n  43 |     expect(html).toContain('id=\"screen-approvals\"');\n    at /var/www/360lm/tests/vrs.spec.js:40:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:43.581Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—-HTML-Structure-all-screens-present-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/vrs.spec.js",
                        "column": 18,
                        "line": 40
                      }
                    },
                    {
                      "workerIndex": 401,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 16,
                      "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\"id=\\\"screen-splash\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"id=\\\"screen-splash\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/vrs.spec.js:40:18",
                        "location": {
                          "file": "/var/www/360lm/tests/vrs.spec.js",
                          "column": 18,
                          "line": 40
                        },
                        "snippet": "  38 |\n  39 |   test('all screens present', () => {\n> 40 |     expect(html).toContain('id=\"screen-splash\"');\n     |                  ^\n  41 |     expect(html).toContain('id=\"screen-login\"');\n  42 |     expect(html).toContain('id=\"screen-mine\"');\n  43 |     expect(html).toContain('id=\"screen-approvals\"');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/vrs.spec.js",
                            "column": 18,
                            "line": 40
                          },
                          "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\"id=\\\"screen-splash\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  38 |\n  39 |   test('all screens present', () => {\n> 40 |     expect(html).toContain('id=\"screen-splash\"');\n     |                  ^\n  41 |     expect(html).toContain('id=\"screen-login\"');\n  42 |     expect(html).toContain('id=\"screen-mine\"');\n  43 |     expect(html).toContain('id=\"screen-approvals\"');\n    at /var/www/360lm/tests/vrs.spec.js:40:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:42:44.592Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—-HTML-Structure-all-screens-present-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/vrs.spec.js",
                        "column": 18,
                        "line": 40
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "0c785c59ff61d83b7a53-b9e52074f451c0212a8f",
              "file": "vrs.spec.js",
              "line": 39,
              "column": 3
            },
            {
              "title": "hub navigation present on all screens",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 402,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 11,
                      "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\"href=\\\"/hub/\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"href=\\\"/hub/\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/vrs.spec.js:48:18",
                        "location": {
                          "file": "/var/www/360lm/tests/vrs.spec.js",
                          "column": 18,
                          "line": 48
                        },
                        "snippet": "  46 |\n  47 |   test('hub navigation present on all screens', () => {\n> 48 |     expect(html).toContain('href=\"/hub/\"');\n     |                  ^\n  49 |     expect(html).toContain('🏠');\n  50 |   });\n  51 | });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/vrs.spec.js",
                            "column": 18,
                            "line": 48
                          },
                          "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\"href=\\\"/hub/\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  46 |\n  47 |   test('hub navigation present on all screens', () => {\n> 48 |     expect(html).toContain('href=\"/hub/\"');\n     |                  ^\n  49 |     expect(html).toContain('🏠');\n  50 |   });\n  51 | });\n    at /var/www/360lm/tests/vrs.spec.js:48:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-07-12T19:42:45.756Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—--bd047-tion-present-on-all-screens-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/vrs.spec.js",
                        "column": 18,
                        "line": 48
                      }
                    },
                    {
                      "workerIndex": 403,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 13,
                      "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\"href=\\\"/hub/\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\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\"href=\\\"/hub/\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/vrs.spec.js:48:18",
                        "location": {
                          "file": "/var/www/360lm/tests/vrs.spec.js",
                          "column": 18,
                          "line": 48
                        },
                        "snippet": "  46 |\n  47 |   test('hub navigation present on all screens', () => {\n> 48 |     expect(html).toContain('href=\"/hub/\"');\n     |                  ^\n  49 |     expect(html).toContain('🏠');\n  50 |   });\n  51 | });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/vrs.spec.js",
                            "column": 18,
                            "line": 48
                          },
                          "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\"href=\\\"/hub/\\\"\"\u001b[39m\nReceived string:    \u001b[31m\"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\" \\\"http://www.w3.org/TR/html4/strict.dtd\\\">\u001b[39m\n\u001b[31m<html><head>\u001b[39m\n\u001b[31m<title>404 Not Found</title>\u001b[39m\n\u001b[31m</head><body>\u001b[39m\n\u001b[31m<h1>Not Found</h1>\u001b[39m\n\u001b[31m<p>The requested URL was not found on this server.</p>\u001b[39m\n\u001b[31m</body></html>\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  46 |\n  47 |   test('hub navigation present on all screens', () => {\n> 48 |     expect(html).toContain('href=\"/hub/\"');\n     |                  ^\n  49 |     expect(html).toContain('🏠');\n  50 |   });\n  51 | });\n    at /var/www/360lm/tests/vrs.spec.js:48:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-07-12T19:42:46.764Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/vrs-Vehicle-Requisition-—--bd047-tion-present-on-all-screens-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/vrs.spec.js",
                        "column": 18,
                        "line": 48
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "0c785c59ff61d83b7a53-1217a4d7774fe005d8e6",
              "file": "vrs.spec.js",
              "line": 47,
              "column": 3
            }
          ]
        }
      ]
    }
  ],
  "errors": [],
  "stats": {
    "startTime": "2026-07-12T19:09:13.458Z",
    "duration": 2013505.3839999998,
    "expected": 76,
    "skipped": 0,
    "unexpected": 202,
    "flaky": 0
  }
}
