{
  "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": "activity.spec.js",
      "file": "activity.spec.js",
      "column": 0,
      "line": 0,
      "specs": [],
      "suites": [
        {
          "title": "Activity — Smoke",
          "file": "activity.spec.js",
          "line": 10,
          "column": 6,
          "specs": [
            {
              "title": "page or hub loads",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1780,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:24.609Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-45bb9da2781273921e33",
              "file": "activity.spec.js",
              "line": 11,
              "column": 3
            },
            {
              "title": "manifest.json returns 200",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 221,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:27.060Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-d6284674306e1787a594",
              "file": "activity.spec.js",
              "line": 18,
              "column": 3
            },
            {
              "title": "sw.js contains 360act-v22",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 368,
                      "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\"360act-v22\"\u001b[39m\nReceived string:    \u001b[31m\"'use strict';\u001b[39m\n\u001b[31mconst CACHE = '360act-v23';\u001b[39m\n\u001b[31mconst SHELL = ['/activity/', '/activity/index.html', '/activity/manifest.json', '/activity/icons/icon-192.png'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(SHELL)));\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(\u001b[39m\n\u001b[31m    caches.keys()\u001b[39m\n\u001b[31m      .then(keys => Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k))))\u001b[39m\n\u001b[31m      .then(() => self.clients.claim())\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('message', event => {\u001b[39m\n\u001b[31m  if (event.data?.type === 'SKIP_WAITING') self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  if (e.request.url.includes('/db/') || e.request.url.includes('/sales-proxy/') || e.request.url.includes('/uploads/')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m      if (resp.ok && e.request.method === 'GET') {\u001b[39m\n\u001b[31m        caches.open(CACHE).then(c => c.put(e.request, resp.clone()));\u001b[39m\n\u001b[31m      }\u001b[39m\n\u001b[31m      return resp;\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\"360act-v22\"\u001b[39m\nReceived string:    \u001b[31m\"'use strict';\u001b[39m\n\u001b[31mconst CACHE = '360act-v23';\u001b[39m\n\u001b[31mconst SHELL = ['/activity/', '/activity/index.html', '/activity/manifest.json', '/activity/icons/icon-192.png'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(SHELL)));\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(\u001b[39m\n\u001b[31m    caches.keys()\u001b[39m\n\u001b[31m      .then(keys => Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k))))\u001b[39m\n\u001b[31m      .then(() => self.clients.claim())\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('message', event => {\u001b[39m\n\u001b[31m  if (event.data?.type === 'SKIP_WAITING') self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  if (e.request.url.includes('/db/') || e.request.url.includes('/sales-proxy/') || e.request.url.includes('/uploads/')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m      if (resp.ok && e.request.method === 'GET') {\u001b[39m\n\u001b[31m        caches.open(CACHE).then(c => c.put(e.request, resp.clone()));\u001b[39m\n\u001b[31m      }\u001b[39m\n\u001b[31m      return resp;\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/activity.spec.js:26:18",
                        "location": {
                          "file": "/var/www/360lm/tests/activity.spec.js",
                          "column": 18,
                          "line": 26
                        },
                        "snippet": "  24 |     const resp = await page.goto(BASE_URL + 'sw.js');\n  25 |     const text = await resp?.text() || '';\n> 26 |     expect(text).toContain('360act-v22');\n     |                  ^\n  27 |   });\n  28 | });\n  29 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/activity.spec.js",
                            "column": 18,
                            "line": 26
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: \u001b[32m\"360act-v22\"\u001b[39m\nReceived string:    \u001b[31m\"'use strict';\u001b[39m\n\u001b[31mconst CACHE = '360act-v23';\u001b[39m\n\u001b[31mconst SHELL = ['/activity/', '/activity/index.html', '/activity/manifest.json', '/activity/icons/icon-192.png'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(SHELL)));\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(\u001b[39m\n\u001b[31m    caches.keys()\u001b[39m\n\u001b[31m      .then(keys => Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k))))\u001b[39m\n\u001b[31m      .then(() => self.clients.claim())\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('message', event => {\u001b[39m\n\u001b[31m  if (event.data?.type === 'SKIP_WAITING') self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  if (e.request.url.includes('/db/') || e.request.url.includes('/sales-proxy/') || e.request.url.includes('/uploads/')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m      if (resp.ok && e.request.method === 'GET') {\u001b[39m\n\u001b[31m        caches.open(CACHE).then(c => c.put(e.request, resp.clone()));\u001b[39m\n\u001b[31m      }\u001b[39m\n\u001b[31m      return resp;\u001b[39m\n\u001b[31m    }))\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  24 |     const resp = await page.goto(BASE_URL + 'sw.js');\n  25 |     const text = await resp?.text() || '';\n> 26 |     expect(text).toContain('360act-v22');\n     |                  ^\n  27 |   });\n  28 | });\n  29 |\n    at /var/www/360lm/tests/activity.spec.js:26:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:27.317Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/activity-Activity-—-Smoke-sw-js-contains-360act-v22-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/activity-Activity-—-Smoke-sw-js-contains-360act-v22-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/activity.spec.js",
                        "column": 18,
                        "line": 26
                      }
                    },
                    {
                      "workerIndex": 1,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 314,
                      "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\"360act-v22\"\u001b[39m\nReceived string:    \u001b[31m\"'use strict';\u001b[39m\n\u001b[31mconst CACHE = '360act-v23';\u001b[39m\n\u001b[31mconst SHELL = ['/activity/', '/activity/index.html', '/activity/manifest.json', '/activity/icons/icon-192.png'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(SHELL)));\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(\u001b[39m\n\u001b[31m    caches.keys()\u001b[39m\n\u001b[31m      .then(keys => Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k))))\u001b[39m\n\u001b[31m      .then(() => self.clients.claim())\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('message', event => {\u001b[39m\n\u001b[31m  if (event.data?.type === 'SKIP_WAITING') self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  if (e.request.url.includes('/db/') || e.request.url.includes('/sales-proxy/') || e.request.url.includes('/uploads/')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m      if (resp.ok && e.request.method === 'GET') {\u001b[39m\n\u001b[31m        caches.open(CACHE).then(c => c.put(e.request, resp.clone()));\u001b[39m\n\u001b[31m      }\u001b[39m\n\u001b[31m      return resp;\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\"360act-v22\"\u001b[39m\nReceived string:    \u001b[31m\"'use strict';\u001b[39m\n\u001b[31mconst CACHE = '360act-v23';\u001b[39m\n\u001b[31mconst SHELL = ['/activity/', '/activity/index.html', '/activity/manifest.json', '/activity/icons/icon-192.png'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(SHELL)));\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(\u001b[39m\n\u001b[31m    caches.keys()\u001b[39m\n\u001b[31m      .then(keys => Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k))))\u001b[39m\n\u001b[31m      .then(() => self.clients.claim())\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('message', event => {\u001b[39m\n\u001b[31m  if (event.data?.type === 'SKIP_WAITING') self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  if (e.request.url.includes('/db/') || e.request.url.includes('/sales-proxy/') || e.request.url.includes('/uploads/')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m      if (resp.ok && e.request.method === 'GET') {\u001b[39m\n\u001b[31m        caches.open(CACHE).then(c => c.put(e.request, resp.clone()));\u001b[39m\n\u001b[31m      }\u001b[39m\n\u001b[31m      return resp;\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/activity.spec.js:26:18",
                        "location": {
                          "file": "/var/www/360lm/tests/activity.spec.js",
                          "column": 18,
                          "line": 26
                        },
                        "snippet": "  24 |     const resp = await page.goto(BASE_URL + 'sw.js');\n  25 |     const text = await resp?.text() || '';\n> 26 |     expect(text).toContain('360act-v22');\n     |                  ^\n  27 |   });\n  28 | });\n  29 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/activity.spec.js",
                            "column": 18,
                            "line": 26
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: \u001b[32m\"360act-v22\"\u001b[39m\nReceived string:    \u001b[31m\"'use strict';\u001b[39m\n\u001b[31mconst CACHE = '360act-v23';\u001b[39m\n\u001b[31mconst SHELL = ['/activity/', '/activity/index.html', '/activity/manifest.json', '/activity/icons/icon-192.png'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(SHELL)));\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(\u001b[39m\n\u001b[31m    caches.keys()\u001b[39m\n\u001b[31m      .then(keys => Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k))))\u001b[39m\n\u001b[31m      .then(() => self.clients.claim())\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('message', event => {\u001b[39m\n\u001b[31m  if (event.data?.type === 'SKIP_WAITING') self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  if (e.request.url.includes('/db/') || e.request.url.includes('/sales-proxy/') || e.request.url.includes('/uploads/')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m      if (resp.ok && e.request.method === 'GET') {\u001b[39m\n\u001b[31m        caches.open(CACHE).then(c => c.put(e.request, resp.clone()));\u001b[39m\n\u001b[31m      }\u001b[39m\n\u001b[31m      return resp;\u001b[39m\n\u001b[31m    }))\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  24 |     const resp = await page.goto(BASE_URL + 'sw.js');\n  25 |     const text = await resp?.text() || '';\n> 26 |     expect(text).toContain('360act-v22');\n     |                  ^\n  27 |   });\n  28 | });\n  29 |\n    at /var/www/360lm/tests/activity.spec.js:26:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-06-02T13:01:28.588Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/activity-Activity-—-Smoke-sw-js-contains-360act-v22-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/activity-Activity-—-Smoke-sw-js-contains-360act-v22-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/activity.spec.js",
                        "column": 18,
                        "line": 26
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "df521ef6570605d13829-68db7a7b741d73e387d9",
              "file": "activity.spec.js",
              "line": 23,
              "column": 3
            },
            {
              "title": "page or hub loads",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 3,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1189,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:31.201Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-0f05c1db7f936b1770cf",
              "file": "activity.spec.js",
              "line": 11,
              "column": 3
            },
            {
              "title": "manifest.json returns 200",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 3,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 190,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:32.564Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-2112e78eca790609920b",
              "file": "activity.spec.js",
              "line": 18,
              "column": 3
            },
            {
              "title": "sw.js contains 360act-v22",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 3,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 236,
                      "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\"360act-v22\"\u001b[39m\nReceived string:    \u001b[31m\"'use strict';\u001b[39m\n\u001b[31mconst CACHE = '360act-v23';\u001b[39m\n\u001b[31mconst SHELL = ['/activity/', '/activity/index.html', '/activity/manifest.json', '/activity/icons/icon-192.png'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(SHELL)));\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(\u001b[39m\n\u001b[31m    caches.keys()\u001b[39m\n\u001b[31m      .then(keys => Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k))))\u001b[39m\n\u001b[31m      .then(() => self.clients.claim())\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('message', event => {\u001b[39m\n\u001b[31m  if (event.data?.type === 'SKIP_WAITING') self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  if (e.request.url.includes('/db/') || e.request.url.includes('/sales-proxy/') || e.request.url.includes('/uploads/')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m      if (resp.ok && e.request.method === 'GET') {\u001b[39m\n\u001b[31m        caches.open(CACHE).then(c => c.put(e.request, resp.clone()));\u001b[39m\n\u001b[31m      }\u001b[39m\n\u001b[31m      return resp;\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\"360act-v22\"\u001b[39m\nReceived string:    \u001b[31m\"'use strict';\u001b[39m\n\u001b[31mconst CACHE = '360act-v23';\u001b[39m\n\u001b[31mconst SHELL = ['/activity/', '/activity/index.html', '/activity/manifest.json', '/activity/icons/icon-192.png'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(SHELL)));\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(\u001b[39m\n\u001b[31m    caches.keys()\u001b[39m\n\u001b[31m      .then(keys => Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k))))\u001b[39m\n\u001b[31m      .then(() => self.clients.claim())\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('message', event => {\u001b[39m\n\u001b[31m  if (event.data?.type === 'SKIP_WAITING') self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  if (e.request.url.includes('/db/') || e.request.url.includes('/sales-proxy/') || e.request.url.includes('/uploads/')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m      if (resp.ok && e.request.method === 'GET') {\u001b[39m\n\u001b[31m        caches.open(CACHE).then(c => c.put(e.request, resp.clone()));\u001b[39m\n\u001b[31m      }\u001b[39m\n\u001b[31m      return resp;\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/activity.spec.js:26:18",
                        "location": {
                          "file": "/var/www/360lm/tests/activity.spec.js",
                          "column": 18,
                          "line": 26
                        },
                        "snippet": "  24 |     const resp = await page.goto(BASE_URL + 'sw.js');\n  25 |     const text = await resp?.text() || '';\n> 26 |     expect(text).toContain('360act-v22');\n     |                  ^\n  27 |   });\n  28 | });\n  29 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/activity.spec.js",
                            "column": 18,
                            "line": 26
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: \u001b[32m\"360act-v22\"\u001b[39m\nReceived string:    \u001b[31m\"'use strict';\u001b[39m\n\u001b[31mconst CACHE = '360act-v23';\u001b[39m\n\u001b[31mconst SHELL = ['/activity/', '/activity/index.html', '/activity/manifest.json', '/activity/icons/icon-192.png'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(SHELL)));\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(\u001b[39m\n\u001b[31m    caches.keys()\u001b[39m\n\u001b[31m      .then(keys => Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k))))\u001b[39m\n\u001b[31m      .then(() => self.clients.claim())\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('message', event => {\u001b[39m\n\u001b[31m  if (event.data?.type === 'SKIP_WAITING') self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  if (e.request.url.includes('/db/') || e.request.url.includes('/sales-proxy/') || e.request.url.includes('/uploads/')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m      if (resp.ok && e.request.method === 'GET') {\u001b[39m\n\u001b[31m        caches.open(CACHE).then(c => c.put(e.request, resp.clone()));\u001b[39m\n\u001b[31m      }\u001b[39m\n\u001b[31m      return resp;\u001b[39m\n\u001b[31m    }))\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  24 |     const resp = await page.goto(BASE_URL + 'sw.js');\n  25 |     const text = await resp?.text() || '';\n> 26 |     expect(text).toContain('360act-v22');\n     |                  ^\n  27 |   });\n  28 | });\n  29 |\n    at /var/www/360lm/tests/activity.spec.js:26:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:32.780Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/activity-Activity-—-Smoke-sw-js-contains-360act-v22-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/activity-Activity-—-Smoke-sw-js-contains-360act-v22-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/activity.spec.js",
                        "column": 18,
                        "line": 26
                      }
                    },
                    {
                      "workerIndex": 4,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 312,
                      "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\"360act-v22\"\u001b[39m\nReceived string:    \u001b[31m\"'use strict';\u001b[39m\n\u001b[31mconst CACHE = '360act-v23';\u001b[39m\n\u001b[31mconst SHELL = ['/activity/', '/activity/index.html', '/activity/manifest.json', '/activity/icons/icon-192.png'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(SHELL)));\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(\u001b[39m\n\u001b[31m    caches.keys()\u001b[39m\n\u001b[31m      .then(keys => Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k))))\u001b[39m\n\u001b[31m      .then(() => self.clients.claim())\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('message', event => {\u001b[39m\n\u001b[31m  if (event.data?.type === 'SKIP_WAITING') self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  if (e.request.url.includes('/db/') || e.request.url.includes('/sales-proxy/') || e.request.url.includes('/uploads/')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m      if (resp.ok && e.request.method === 'GET') {\u001b[39m\n\u001b[31m        caches.open(CACHE).then(c => c.put(e.request, resp.clone()));\u001b[39m\n\u001b[31m      }\u001b[39m\n\u001b[31m      return resp;\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\"360act-v22\"\u001b[39m\nReceived string:    \u001b[31m\"'use strict';\u001b[39m\n\u001b[31mconst CACHE = '360act-v23';\u001b[39m\n\u001b[31mconst SHELL = ['/activity/', '/activity/index.html', '/activity/manifest.json', '/activity/icons/icon-192.png'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(SHELL)));\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(\u001b[39m\n\u001b[31m    caches.keys()\u001b[39m\n\u001b[31m      .then(keys => Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k))))\u001b[39m\n\u001b[31m      .then(() => self.clients.claim())\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('message', event => {\u001b[39m\n\u001b[31m  if (event.data?.type === 'SKIP_WAITING') self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  if (e.request.url.includes('/db/') || e.request.url.includes('/sales-proxy/') || e.request.url.includes('/uploads/')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m      if (resp.ok && e.request.method === 'GET') {\u001b[39m\n\u001b[31m        caches.open(CACHE).then(c => c.put(e.request, resp.clone()));\u001b[39m\n\u001b[31m      }\u001b[39m\n\u001b[31m      return resp;\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/activity.spec.js:26:18",
                        "location": {
                          "file": "/var/www/360lm/tests/activity.spec.js",
                          "column": 18,
                          "line": 26
                        },
                        "snippet": "  24 |     const resp = await page.goto(BASE_URL + 'sw.js');\n  25 |     const text = await resp?.text() || '';\n> 26 |     expect(text).toContain('360act-v22');\n     |                  ^\n  27 |   });\n  28 | });\n  29 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/activity.spec.js",
                            "column": 18,
                            "line": 26
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: \u001b[32m\"360act-v22\"\u001b[39m\nReceived string:    \u001b[31m\"'use strict';\u001b[39m\n\u001b[31mconst CACHE = '360act-v23';\u001b[39m\n\u001b[31mconst SHELL = ['/activity/', '/activity/index.html', '/activity/manifest.json', '/activity/icons/icon-192.png'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(SHELL)));\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(\u001b[39m\n\u001b[31m    caches.keys()\u001b[39m\n\u001b[31m      .then(keys => Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k))))\u001b[39m\n\u001b[31m      .then(() => self.clients.claim())\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('message', event => {\u001b[39m\n\u001b[31m  if (event.data?.type === 'SKIP_WAITING') self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  if (e.request.url.includes('/db/') || e.request.url.includes('/sales-proxy/') || e.request.url.includes('/uploads/')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request).then(resp => {\u001b[39m\n\u001b[31m      if (resp.ok && e.request.method === 'GET') {\u001b[39m\n\u001b[31m        caches.open(CACHE).then(c => c.put(e.request, resp.clone()));\u001b[39m\n\u001b[31m      }\u001b[39m\n\u001b[31m      return resp;\u001b[39m\n\u001b[31m    }))\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  24 |     const resp = await page.goto(BASE_URL + 'sw.js');\n  25 |     const text = await resp?.text() || '';\n> 26 |     expect(text).toContain('360act-v22');\n     |                  ^\n  27 |   });\n  28 | });\n  29 |\n    at /var/www/360lm/tests/activity.spec.js:26:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-06-02T13:01:33.870Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/activity-Activity-—-Smoke-sw-js-contains-360act-v22-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/activity-Activity-—-Smoke-sw-js-contains-360act-v22-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/activity.spec.js",
                        "column": 18,
                        "line": 26
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "df521ef6570605d13829-69107298b8f367c92dfb",
              "file": "activity.spec.js",
              "line": 23,
              "column": 3
            }
          ]
        },
        {
          "title": "Activity — HTML Structure (core)",
          "file": "activity.spec.js",
          "line": 31,
          "column": 6,
          "specs": [
            {
              "title": "capture screen and submit/draft buttons present",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 75,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:29.974Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-77f84d04d074f2d70a94",
              "file": "activity.spec.js",
              "line": 32,
              "column": 3
            },
            {
              "title": "response list and presentation screens present",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 24,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:30.101Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-3c3440e71d456b4fbe8a",
              "file": "activity.spec.js",
              "line": 47,
              "column": 3
            },
            {
              "title": "capture screen and submit/draft buttons present",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 5,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 95,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:35.295Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-7610f56fa1f0287f3249",
              "file": "activity.spec.js",
              "line": 32,
              "column": 3
            },
            {
              "title": "response list and presentation screens present",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 5,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 24,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:35.448Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-a28fb01019a5d12e16a6",
              "file": "activity.spec.js",
              "line": 47,
              "column": 3
            }
          ]
        },
        {
          "title": "Activity — HTML Structure (v21 draft datetime)",
          "file": "activity.spec.js",
          "line": 62,
          "column": 6,
          "specs": [
            {
              "title": "submit-datetime modal elements present",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 20,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:30.158Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-16370f92dcc0d957eeb0",
              "file": "activity.spec.js",
              "line": 63,
              "column": 3
            },
            {
              "title": "IST datetime helper functions present",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 22,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:30.208Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-7fc08d7e1d426a968e27",
              "file": "activity.spec.js",
              "line": 78,
              "column": 3
            },
            {
              "title": "submission datetime picker flow functions present",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 15,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:30.257Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-ae0062346cb3397cc1f4",
              "file": "activity.spec.js",
              "line": 91,
              "column": 3
            },
            {
              "title": "audit trail CSS and audit panel in buildPresentation present",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 24,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:30.299Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-c3260fe8ff436c5cd715",
              "file": "activity.spec.js",
              "line": 105,
              "column": 3
            },
            {
              "title": "draft PATCH includes submitted_at and error guard",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 12,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:30.334Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-c63db10b1de7f63715bf",
              "file": "activity.spec.js",
              "line": 121,
              "column": 3
            },
            {
              "title": "submit-datetime modal elements present",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 5,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 23,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:35.502Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-3204473521eed1129c8c",
              "file": "activity.spec.js",
              "line": 63,
              "column": 3
            },
            {
              "title": "IST datetime helper functions present",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 5,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 27,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:35.559Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-a7c7cb170591b9ae6d16",
              "file": "activity.spec.js",
              "line": 78,
              "column": 3
            },
            {
              "title": "submission datetime picker flow functions present",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 5,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 26,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:35.598Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-124f71d700a952519bbd",
              "file": "activity.spec.js",
              "line": 91,
              "column": 3
            },
            {
              "title": "audit trail CSS and audit panel in buildPresentation present",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 5,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 20,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:35.639Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-aadb3c0f20eca04815f5",
              "file": "activity.spec.js",
              "line": 105,
              "column": 3
            },
            {
              "title": "draft PATCH includes submitted_at and error guard",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 5,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 16,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:35.668Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-7c8b03df43309d0e3ef7",
              "file": "activity.spec.js",
              "line": 121,
              "column": 3
            }
          ]
        },
        {
          "title": "Activity — HTML Structure (v22 bug fixes)",
          "file": "activity.spec.js",
          "line": 134,
          "column": 6,
          "specs": [
            {
              "title": "audit trail check uses ADMIN_IDS not isAdmin",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 9,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:30.356Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-2a32fd9e5206fc25f390",
              "file": "activity.spec.js",
              "line": 135,
              "column": 3
            },
            {
              "title": "draft-btn text reset in buildCaptureForm",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 13,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:30.378Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-0755d639d36a77e9a41a",
              "file": "activity.spec.js",
              "line": 146,
              "column": 3
            },
            {
              "title": "client-side min-date validation in confirmSubmitDatetime",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 13,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:30.401Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-e4300b781c8a96dc9b49",
              "file": "activity.spec.js",
              "line": 156,
              "column": 3
            },
            {
              "title": "server error message extracted from PostgREST JSON",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 10,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:30.426Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-1d9d7e30fffdc69fbe34",
              "file": "activity.spec.js",
              "line": 167,
              "column": 3
            },
            {
              "title": "hint text uses human-readable format",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 10,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:30.445Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-cd2f6cccfdb2be0a4124",
              "file": "activity.spec.js",
              "line": 177,
              "column": 3
            },
            {
              "title": "audit trail check uses ADMIN_IDS not isAdmin",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 5,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 10,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:35.698Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-38f45e6afd6ba56da18c",
              "file": "activity.spec.js",
              "line": 135,
              "column": 3
            },
            {
              "title": "draft-btn text reset in buildCaptureForm",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 5,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 14,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:35.721Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-2578e1faf518a84f3de3",
              "file": "activity.spec.js",
              "line": 146,
              "column": 3
            },
            {
              "title": "client-side min-date validation in confirmSubmitDatetime",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 5,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 13,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:35.746Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-93af7714f942f6e85d8c",
              "file": "activity.spec.js",
              "line": 156,
              "column": 3
            },
            {
              "title": "server error message extracted from PostgREST JSON",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 5,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 10,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:35.770Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-f9af2e8f791ce785dc3b",
              "file": "activity.spec.js",
              "line": 167,
              "column": 3
            },
            {
              "title": "hint text uses human-readable format",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 5,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 10,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-02T13:01:35.794Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "df521ef6570605d13829-95a7155a6ea666940b70",
              "file": "activity.spec.js",
              "line": 177,
              "column": 3
            }
          ]
        }
      ]
    }
  ],
  "errors": [],
  "stats": {
    "startTime": "2026-06-02T13:01:23.454Z",
    "duration": 12391.275000000001,
    "expected": 28,
    "skipped": 0,
    "unexpected": 2,
    "flaky": 0
  }
}
