{
  "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": "custodian.spec.js",
      "file": "custodian.spec.js",
      "column": 0,
      "line": 0,
      "specs": [],
      "suites": [
        {
          "title": "Fund Custodian — Access Control",
          "file": "custodian.spec.js",
          "line": 18,
          "column": 6,
          "specs": [
            {
              "title": "no session → redirects to /hub/",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 695,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:08.808Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-7c3909eeb38a71365cfc",
              "file": "custodian.spec.js",
              "line": 19,
              "column": 3
            },
            {
              "title": "non-custodian user → access restricted screen",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 430,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:09.731Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-7426706cb01e64c56b21",
              "file": "custodian.spec.js",
              "line": 24,
              "column": 3
            },
            {
              "title": "no session → redirects to /hub/",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1516,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:50:39.132Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-c6f22316cb8cac2d41a0",
              "file": "custodian.spec.js",
              "line": 19,
              "column": 3
            },
            {
              "title": "non-custodian user → access restricted screen",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 955,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:50:41.246Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-7a73166b5f4494b673b3",
              "file": "custodian.spec.js",
              "line": 24,
              "column": 3
            }
          ]
        },
        {
          "title": "Fund Custodian — Dashboard (Shambhu)",
          "file": "custodian.spec.js",
          "line": 31,
          "column": 6,
          "specs": [
            {
              "title": "dashboard loads with balance display",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 535,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:10.193Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-fd3e3ceb54b6585a881b",
              "file": "custodian.spec.js",
              "line": 36,
              "column": 3
            },
            {
              "title": "bottom nav shows 4 tabs",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 492,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:10.782Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-6170fcc2eaf6184094f8",
              "file": "custodian.spec.js",
              "line": 42,
              "column": 3
            },
            {
              "title": "manage button hidden for non-admin",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 404,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:11.297Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-32179834a5e81e3bd924",
              "file": "custodian.spec.js",
              "line": 47,
              "column": 3
            },
            {
              "title": "dashboard loads with balance display",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1458,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:50:42.320Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-52c08784c877939e3495",
              "file": "custodian.spec.js",
              "line": 36,
              "column": 3
            },
            {
              "title": "bottom nav shows 4 tabs",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1476,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:50:43.939Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-ae1481c65003325af846",
              "file": "custodian.spec.js",
              "line": 42,
              "column": 3
            },
            {
              "title": "manage button hidden for non-admin",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1708,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:50:45.542Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-e4db157dbd78db522898",
              "file": "custodian.spec.js",
              "line": 47,
              "column": 3
            }
          ]
        },
        {
          "title": "Fund Custodian — Dashboard (Harish / Admin)",
          "file": "custodian.spec.js",
          "line": 53,
          "column": 6,
          "specs": [
            {
              "title": "manage button visible for admin",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 472,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:11.733Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-c6ff855bf2f776bcb155",
              "file": "custodian.spec.js",
              "line": 58,
              "column": 3
            },
            {
              "title": "all custodian balances section loads for admin",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 569,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:12.230Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-a79af13e080624b59a23",
              "file": "custodian.spec.js",
              "line": 63,
              "column": 3
            },
            {
              "title": "manage button visible for admin",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1147,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:50:47.348Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-5aa0a1294f0f5eb5c743",
              "file": "custodian.spec.js",
              "line": 58,
              "column": 3
            },
            {
              "title": "all custodian balances section loads for admin",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1081,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:50:48.634Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-7e4f36ee87063c290b9a",
              "file": "custodian.spec.js",
              "line": 63,
              "column": 3
            }
          ]
        },
        {
          "title": "Fund Custodian — Transfer Form",
          "file": "custodian.spec.js",
          "line": 69,
          "column": 6,
          "specs": [
            {
              "title": "transfer screen shows role picker and form",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 520,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:12.833Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-b9262bb9db98f1b8aba7",
              "file": "custodian.spec.js",
              "line": 74,
              "column": 3
            },
            {
              "title": "role-giver selected by default",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 581,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:13.392Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-0d65a29db5dc8c28d5f4",
              "file": "custodian.spec.js",
              "line": 82,
              "column": 3
            },
            {
              "title": "clicking role-receiver switches selection",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 495,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:13.992Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-06537cacc285d5fac8ac",
              "file": "custodian.spec.js",
              "line": 88,
              "column": 3
            },
            {
              "title": "submit with no amount shows validation toast",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 590,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:14.510Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-2f9fd31ee3571aecaf51",
              "file": "custodian.spec.js",
              "line": 96,
              "column": 3
            },
            {
              "title": "cash + giving shows pending warning on screen open",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 478,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:15.128Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-1fff4b23b460be04a123",
              "file": "custodian.spec.js",
              "line": 103,
              "column": 3
            },
            {
              "title": "switching to receiver hides pending warning",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 546,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:15.629Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-3eb568aa5b5bf5ab757a",
              "file": "custodian.spec.js",
              "line": 109,
              "column": 3
            },
            {
              "title": "transfer screen shows role picker and form",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1169,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:50:49.857Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-ca479c441790f36ac552",
              "file": "custodian.spec.js",
              "line": 74,
              "column": 3
            },
            {
              "title": "role-giver selected by default",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2059,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:50:51.152Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-56b37f401306d839492e",
              "file": "custodian.spec.js",
              "line": 82,
              "column": 3
            },
            {
              "title": "clicking role-receiver switches selection",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2084,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:50:53.473Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-fce0ec81d7beb36c754c",
              "file": "custodian.spec.js",
              "line": 88,
              "column": 3
            },
            {
              "title": "submit with no amount shows validation toast",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1442,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:50:55.675Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-98b55bfb9c324d07d12b",
              "file": "custodian.spec.js",
              "line": 96,
              "column": 3
            },
            {
              "title": "cash + giving shows pending warning on screen open",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1108,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:50:57.225Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-0ba3cd976d05cb73cf9c",
              "file": "custodian.spec.js",
              "line": 103,
              "column": 3
            },
            {
              "title": "switching to receiver hides pending warning",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1161,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:50:58.413Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-3f260cae332e61042918",
              "file": "custodian.spec.js",
              "line": 109,
              "column": 3
            }
          ]
        },
        {
          "title": "Fund Custodian — Advance Form",
          "file": "custodian.spec.js",
          "line": 117,
          "column": 6,
          "specs": [
            {
              "title": "advance screen loads with employee select",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 492,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:16.214Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-921c38d890d77717fdfc",
              "file": "custodian.spec.js",
              "line": 122,
              "column": 3
            },
            {
              "title": "submit with no amount shows validation toast",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 534,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:16.744Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-21dc616118293495b03a",
              "file": "custodian.spec.js",
              "line": 128,
              "column": 3
            },
            {
              "title": "advance screen loads with employee select",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1089,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:50:59.645Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-735896c5e3bf6ca30d4f",
              "file": "custodian.spec.js",
              "line": 122,
              "column": 3
            },
            {
              "title": "submit with no amount shows validation toast",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1923,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:51:00.783Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-8a5d939693ba49560634",
              "file": "custodian.spec.js",
              "line": 128,
              "column": 3
            }
          ]
        },
        {
          "title": "Fund Custodian — Offline",
          "file": "custodian.spec.js",
          "line": 137,
          "column": 6,
          "specs": [
            {
              "title": "UI remains functional when network drops mid-session",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 489,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:17.303Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-d3341a8c5b518c72ac5b",
              "file": "custodian.spec.js",
              "line": 138,
              "column": 3
            },
            {
              "title": "UI remains functional when network drops mid-session",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2118,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:51:02.790Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "e1e49def2648bf8aa609-f27288a8c4de1f261fad",
              "file": "custodian.spec.js",
              "line": 138,
              "column": 3
            }
          ]
        }
      ]
    },
    {
      "title": "fundcustodian.spec.js",
      "file": "fundcustodian.spec.js",
      "column": 0,
      "line": 0,
      "specs": [],
      "suites": [
        {
          "title": "Auth Gate",
          "file": "fundcustodian.spec.js",
          "line": 35,
          "column": 6,
          "specs": [
            {
              "title": "no session → redirects to /hub/",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 413,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:17.845Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-3f3531e5c6f0a7eb185d",
              "file": "fundcustodian.spec.js",
              "line": 36,
              "column": 3
            },
            {
              "title": "expired session (>12h) → redirects to /hub/",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 430,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:18.276Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-86b36f68a8f23d935137",
              "file": "fundcustodian.spec.js",
              "line": 42,
              "column": 3
            },
            {
              "title": "non-custodian employee → Access Restricted screen",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 390,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:18.727Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-d777dbfe693f198391f4",
              "file": "fundcustodian.spec.js",
              "line": 50,
              "column": 3
            },
            {
              "title": "no session → redirects to /hub/",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1383,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:51:05.148Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-4941793c034feaa4c8d4",
              "file": "fundcustodian.spec.js",
              "line": 36,
              "column": 3
            },
            {
              "title": "expired session (>12h) → redirects to /hub/",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 961,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:51:06.583Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-be7df170420993cdf364",
              "file": "fundcustodian.spec.js",
              "line": 42,
              "column": 3
            },
            {
              "title": "non-custodian employee → Access Restricted screen",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1062,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:51:07.605Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-f857b668291e7e17d3b0",
              "file": "fundcustodian.spec.js",
              "line": 50,
              "column": 3
            }
          ]
        },
        {
          "title": "Dashboard — shambhu (non-admin)",
          "file": "fundcustodian.spec.js",
          "line": 62,
          "column": 6,
          "specs": [
            {
              "title": "balance card renders and shows shambhu name",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 422,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:19.151Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-21a11ed89b787d18d3dc",
              "file": "fundcustodian.spec.js",
              "line": 69,
              "column": 3
            },
            {
              "title": "no pending transfers banner shown for shambhu",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 437,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:19.597Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-f9f72838429f556e8a62",
              "file": "fundcustodian.spec.js",
              "line": 75,
              "column": 3
            },
            {
              "title": "outstanding advances section is visible",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 5408,
                      "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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:82:76",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 76,
                          "line": 82
                        },
                        "snippet": "  80 |     await expect(page.locator('.sec-label', { hasText: 'Outstanding Advances' })).toBeVisible();\n  81 |     // shambhu has A1 (Mukesh 5000) and A2 (Sachin, partially settled)\n> 82 |     await expect(page.locator('.adv-name', { hasText: 'Mukesh' }).first()).toBeVisible();\n     |                                                                            ^\n  83 |     await expect(page.locator('.adv-name', { hasText: 'Sachin' }).first()).toBeVisible();\n  84 |   });\n  85 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 76,
                            "line": 82
                          },
                          "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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\u001b[22m\n\n\n  80 |     await expect(page.locator('.sec-label', { hasText: 'Outstanding Advances' })).toBeVisible();\n  81 |     // shambhu has A1 (Mukesh 5000) and A2 (Sachin, partially settled)\n> 82 |     await expect(page.locator('.adv-name', { hasText: 'Mukesh' }).first()).toBeVisible();\n     |                                                                            ^\n  83 |     await expect(page.locator('.adv-name', { hasText: 'Sachin' }).first()).toBeVisible();\n  84 |   });\n  85 |\n    at /var/www/360lm/tests/fundcustodian.spec.js:82:76"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:20.063Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--d41af-advances-section-is-visible-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--d41af-advances-section-is-visible-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 76,
                        "line": 82
                      }
                    },
                    {
                      "workerIndex": 1,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 5640,
                      "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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:82:76",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 76,
                          "line": 82
                        },
                        "snippet": "  80 |     await expect(page.locator('.sec-label', { hasText: 'Outstanding Advances' })).toBeVisible();\n  81 |     // shambhu has A1 (Mukesh 5000) and A2 (Sachin, partially settled)\n> 82 |     await expect(page.locator('.adv-name', { hasText: 'Mukesh' }).first()).toBeVisible();\n     |                                                                            ^\n  83 |     await expect(page.locator('.adv-name', { hasText: 'Sachin' }).first()).toBeVisible();\n  84 |   });\n  85 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 76,
                            "line": 82
                          },
                          "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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\u001b[22m\n\n\n  80 |     await expect(page.locator('.sec-label', { hasText: 'Outstanding Advances' })).toBeVisible();\n  81 |     // shambhu has A1 (Mukesh 5000) and A2 (Sachin, partially settled)\n> 82 |     await expect(page.locator('.adv-name', { hasText: 'Mukesh' }).first()).toBeVisible();\n     |                                                                            ^\n  83 |     await expect(page.locator('.adv-name', { hasText: 'Sachin' }).first()).toBeVisible();\n  84 |   });\n  85 |\n    at /var/www/360lm/tests/fundcustodian.spec.js:82:76"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:45:26.390Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--d41af-advances-section-is-visible-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--d41af-advances-section-is-visible-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 76,
                        "line": 82
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-3c2e52fa6ce9b7aae36f",
              "file": "fundcustodian.spec.js",
              "line": 79,
              "column": 3
            },
            {
              "title": "admin balance grid is NOT shown for non-admin",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 578,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:33.289Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-b40003816c0568de9e44",
              "file": "fundcustodian.spec.js",
              "line": 86,
              "column": 3
            },
            {
              "title": "manage custodian button hidden for non-admin",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 419,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:34.074Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-29b36b85b84120645af2",
              "file": "fundcustodian.spec.js",
              "line": 91,
              "column": 3
            },
            {
              "title": "bottom nav has 4 tabs",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 468,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:34.518Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-5213ee15713230aced18",
              "file": "fundcustodian.spec.js",
              "line": 95,
              "column": 3
            },
            {
              "title": "recent transfers card loads",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 8425,
                      "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('#recent-transfers-card .ledger-row').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#recent-transfers-card .ledger-row').first()\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('#recent-transfers-card .ledger-row').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#recent-transfers-card .ledger-row').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:102:78",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 78,
                          "line": 102
                        },
                        "snippet": "  100 |   test('recent transfers card loads', async ({ page }) => {\n  101 |     // Should show at least one transfer row (shambhu has multiple)\n> 102 |     await expect(page.locator('#recent-transfers-card .ledger-row').first()).toBeVisible({ timeout: 8000 });\n      |                                                                              ^\n  103 |   });\n  104 | });\n  105 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 78,
                            "line": 102
                          },
                          "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('#recent-transfers-card .ledger-row').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#recent-transfers-card .ledger-row').first()\u001b[22m\n\n\n  100 |   test('recent transfers card loads', async ({ page }) => {\n  101 |     // Should show at least one transfer row (shambhu has multiple)\n> 102 |     await expect(page.locator('#recent-transfers-card .ledger-row').first()).toBeVisible({ timeout: 8000 });\n      |                                                                              ^\n  103 |   });\n  104 | });\n  105 |\n    at /var/www/360lm/tests/fundcustodian.spec.js:102:78"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:35.034Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--ea58b-recent-transfers-card-loads-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--ea58b-recent-transfers-card-loads-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 78,
                        "line": 102
                      }
                    },
                    {
                      "workerIndex": 3,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 8575,
                      "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('#recent-transfers-card .ledger-row').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#recent-transfers-card .ledger-row').first()\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('#recent-transfers-card .ledger-row').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#recent-transfers-card .ledger-row').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:102:78",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 78,
                          "line": 102
                        },
                        "snippet": "  100 |   test('recent transfers card loads', async ({ page }) => {\n  101 |     // Should show at least one transfer row (shambhu has multiple)\n> 102 |     await expect(page.locator('#recent-transfers-card .ledger-row').first()).toBeVisible({ timeout: 8000 });\n      |                                                                              ^\n  103 |   });\n  104 | });\n  105 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 78,
                            "line": 102
                          },
                          "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('#recent-transfers-card .ledger-row').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#recent-transfers-card .ledger-row').first()\u001b[22m\n\n\n  100 |   test('recent transfers card loads', async ({ page }) => {\n  101 |     // Should show at least one transfer row (shambhu has multiple)\n> 102 |     await expect(page.locator('#recent-transfers-card .ledger-row').first()).toBeVisible({ timeout: 8000 });\n      |                                                                              ^\n  103 |   });\n  104 | });\n  105 |\n    at /var/www/360lm/tests/fundcustodian.spec.js:102:78"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:45:44.568Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--ea58b-recent-transfers-card-loads-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--ea58b-recent-transfers-card-loads-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 78,
                        "line": 102
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-8b27d6cd9dc8e53fea06",
              "file": "fundcustodian.spec.js",
              "line": 100,
              "column": 3
            },
            {
              "title": "balance card renders and shows shambhu name",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1132,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:51:08.768Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-312b40c465c7720f813d",
              "file": "fundcustodian.spec.js",
              "line": 69,
              "column": 3
            },
            {
              "title": "no pending transfers banner shown for shambhu",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1695,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:51:09.974Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-6e731fbc13a8774e3e98",
              "file": "fundcustodian.spec.js",
              "line": 75,
              "column": 3
            },
            {
              "title": "outstanding advances section is visible",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 30,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 6610,
                      "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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:82:76",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 76,
                          "line": 82
                        },
                        "snippet": "  80 |     await expect(page.locator('.sec-label', { hasText: 'Outstanding Advances' })).toBeVisible();\n  81 |     // shambhu has A1 (Mukesh 5000) and A2 (Sachin, partially settled)\n> 82 |     await expect(page.locator('.adv-name', { hasText: 'Mukesh' }).first()).toBeVisible();\n     |                                                                            ^\n  83 |     await expect(page.locator('.adv-name', { hasText: 'Sachin' }).first()).toBeVisible();\n  84 |   });\n  85 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 76,
                            "line": 82
                          },
                          "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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\u001b[22m\n\n\n  80 |     await expect(page.locator('.sec-label', { hasText: 'Outstanding Advances' })).toBeVisible();\n  81 |     // shambhu has A1 (Mukesh 5000) and A2 (Sachin, partially settled)\n> 82 |     await expect(page.locator('.adv-name', { hasText: 'Mukesh' }).first()).toBeVisible();\n     |                                                                            ^\n  83 |     await expect(page.locator('.adv-name', { hasText: 'Sachin' }).first()).toBeVisible();\n  84 |   });\n  85 |\n    at /var/www/360lm/tests/fundcustodian.spec.js:82:76"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:51:11.794Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--d41af-advances-section-is-visible-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--d41af-advances-section-is-visible-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 76,
                        "line": 82
                      }
                    },
                    {
                      "workerIndex": 31,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 6589,
                      "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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:82:76",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 76,
                          "line": 82
                        },
                        "snippet": "  80 |     await expect(page.locator('.sec-label', { hasText: 'Outstanding Advances' })).toBeVisible();\n  81 |     // shambhu has A1 (Mukesh 5000) and A2 (Sachin, partially settled)\n> 82 |     await expect(page.locator('.adv-name', { hasText: 'Mukesh' }).first()).toBeVisible();\n     |                                                                            ^\n  83 |     await expect(page.locator('.adv-name', { hasText: 'Sachin' }).first()).toBeVisible();\n  84 |   });\n  85 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 76,
                            "line": 82
                          },
                          "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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\u001b[22m\n\n\n  80 |     await expect(page.locator('.sec-label', { hasText: 'Outstanding Advances' })).toBeVisible();\n  81 |     // shambhu has A1 (Mukesh 5000) and A2 (Sachin, partially settled)\n> 82 |     await expect(page.locator('.adv-name', { hasText: 'Mukesh' }).first()).toBeVisible();\n     |                                                                            ^\n  83 |     await expect(page.locator('.adv-name', { hasText: 'Sachin' }).first()).toBeVisible();\n  84 |   });\n  85 |\n    at /var/www/360lm/tests/fundcustodian.spec.js:82:76"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:51:20.569Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--d41af-advances-section-is-visible-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--d41af-advances-section-is-visible-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 76,
                        "line": 82
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-b638704a578a8caf5b7b",
              "file": "fundcustodian.spec.js",
              "line": 79,
              "column": 3
            },
            {
              "title": "admin balance grid is NOT shown for non-admin",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 32,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 657,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:51:28.567Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-e973e4f214bc25080cda",
              "file": "fundcustodian.spec.js",
              "line": 86,
              "column": 3
            },
            {
              "title": "manage custodian button hidden for non-admin",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 32,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 617,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:51:29.475Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-5170797acb4aa05bf1b9",
              "file": "fundcustodian.spec.js",
              "line": 91,
              "column": 3
            },
            {
              "title": "bottom nav has 4 tabs",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 32,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1145,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:51:30.141Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-9f473f3447aa3673090b",
              "file": "fundcustodian.spec.js",
              "line": 95,
              "column": 3
            },
            {
              "title": "recent transfers card loads",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 32,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 9179,
                      "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('#recent-transfers-card .ledger-row').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#recent-transfers-card .ledger-row').first()\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('#recent-transfers-card .ledger-row').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#recent-transfers-card .ledger-row').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:102:78",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 78,
                          "line": 102
                        },
                        "snippet": "  100 |   test('recent transfers card loads', async ({ page }) => {\n  101 |     // Should show at least one transfer row (shambhu has multiple)\n> 102 |     await expect(page.locator('#recent-transfers-card .ledger-row').first()).toBeVisible({ timeout: 8000 });\n      |                                                                              ^\n  103 |   });\n  104 | });\n  105 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 78,
                            "line": 102
                          },
                          "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('#recent-transfers-card .ledger-row').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#recent-transfers-card .ledger-row').first()\u001b[22m\n\n\n  100 |   test('recent transfers card loads', async ({ page }) => {\n  101 |     // Should show at least one transfer row (shambhu has multiple)\n> 102 |     await expect(page.locator('#recent-transfers-card .ledger-row').first()).toBeVisible({ timeout: 8000 });\n      |                                                                              ^\n  103 |   });\n  104 | });\n  105 |\n    at /var/www/360lm/tests/fundcustodian.spec.js:102:78"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:51:31.395Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--ea58b-recent-transfers-card-loads-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--ea58b-recent-transfers-card-loads-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 78,
                        "line": 102
                      }
                    },
                    {
                      "workerIndex": 33,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 9115,
                      "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('#recent-transfers-card .ledger-row').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#recent-transfers-card .ledger-row').first()\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('#recent-transfers-card .ledger-row').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#recent-transfers-card .ledger-row').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:102:78",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 78,
                          "line": 102
                        },
                        "snippet": "  100 |   test('recent transfers card loads', async ({ page }) => {\n  101 |     // Should show at least one transfer row (shambhu has multiple)\n> 102 |     await expect(page.locator('#recent-transfers-card .ledger-row').first()).toBeVisible({ timeout: 8000 });\n      |                                                                              ^\n  103 |   });\n  104 | });\n  105 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 78,
                            "line": 102
                          },
                          "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('#recent-transfers-card .ledger-row').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#recent-transfers-card .ledger-row').first()\u001b[22m\n\n\n  100 |   test('recent transfers card loads', async ({ page }) => {\n  101 |     // Should show at least one transfer row (shambhu has multiple)\n> 102 |     await expect(page.locator('#recent-transfers-card .ledger-row').first()).toBeVisible({ timeout: 8000 });\n      |                                                                              ^\n  103 |   });\n  104 | });\n  105 |\n    at /var/www/360lm/tests/fundcustodian.spec.js:102:78"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:51:42.575Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--ea58b-recent-transfers-card-loads-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--ea58b-recent-transfers-card-loads-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 78,
                        "line": 102
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-0b597b9896607af0ed81",
              "file": "fundcustodian.spec.js",
              "line": 100,
              "column": 3
            }
          ]
        },
        {
          "title": "Dashboard — harish (admin, 2 pending)",
          "file": "fundcustodian.spec.js",
          "line": 109,
          "column": 6,
          "specs": [
            {
              "title": "pending banner appears with count 2",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 4,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 5592,
                      "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('.pend-banner')\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('.pend-banner')\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('.pend-banner')\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('.pend-banner')\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:118:26",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 26,
                          "line": 118
                        },
                        "snippet": "  116 |   test('pending banner appears with count 2', async ({ page }) => {\n  117 |     const banner = page.locator('.pend-banner');\n> 118 |     await expect(banner).toBeVisible();\n      |                          ^\n  119 |     await expect(banner).toContainText('2 pending transfers');\n  120 |   });\n  121 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 26,
                            "line": 118
                          },
                          "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('.pend-banner')\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('.pend-banner')\u001b[22m\n\n\n  116 |   test('pending banner appears with count 2', async ({ page }) => {\n  117 |     const banner = page.locator('.pend-banner');\n> 118 |     await expect(banner).toBeVisible();\n      |                          ^\n  119 |     await expect(banner).toContainText('2 pending transfers');\n  120 |   });\n  121 |\n    at /var/www/360lm/tests/fundcustodian.spec.js:118:26"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:45:54.439Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--c5dfb-banner-appears-with-count-2-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--c5dfb-banner-appears-with-count-2-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 26,
                        "line": 118
                      }
                    },
                    {
                      "workerIndex": 5,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 5982,
                      "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('.pend-banner')\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('.pend-banner')\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('.pend-banner')\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('.pend-banner')\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:118:26",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 26,
                          "line": 118
                        },
                        "snippet": "  116 |   test('pending banner appears with count 2', async ({ page }) => {\n  117 |     const banner = page.locator('.pend-banner');\n> 118 |     await expect(banner).toBeVisible();\n      |                          ^\n  119 |     await expect(banner).toContainText('2 pending transfers');\n  120 |   });\n  121 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 26,
                            "line": 118
                          },
                          "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('.pend-banner')\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('.pend-banner')\u001b[22m\n\n\n  116 |   test('pending banner appears with count 2', async ({ page }) => {\n  117 |     const banner = page.locator('.pend-banner');\n> 118 |     await expect(banner).toBeVisible();\n      |                          ^\n  119 |     await expect(banner).toContainText('2 pending transfers');\n  120 |   });\n  121 |\n    at /var/www/360lm/tests/fundcustodian.spec.js:118:26"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:46:01.668Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--c5dfb-banner-appears-with-count-2-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--c5dfb-banner-appears-with-count-2-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 26,
                        "line": 118
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-0cf52fe6a4355dfb045a",
              "file": "fundcustodian.spec.js",
              "line": 116,
              "column": 3
            },
            {
              "title": "pending banner shows from-name and amount for both",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 6,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 5680,
                      "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('.pend-item-who').filter({ hasText: 'Shambhu' })\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('.pend-item-who').filter({ hasText: 'Shambhu' })\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('.pend-item-who').filter({ hasText: 'Shambhu' })\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('.pend-item-who').filter({ hasText: 'Shambhu' })\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:123:74",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 74,
                          "line": 123
                        },
                        "snippet": "  121 |\n  122 |   test('pending banner shows from-name and amount for both', async ({ page }) => {\n> 123 |     await expect(page.locator('.pend-item-who', { hasText: 'Shambhu' })).toBeVisible();\n      |                                                                          ^\n  124 |     await expect(page.locator('.pend-item-who', { hasText: 'Gurpreet' })).toBeVisible();\n  125 |     const amts = page.locator('.pend-item-amt');\n  126 |     await expect(amts).toHaveCount(2);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 74,
                            "line": 123
                          },
                          "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('.pend-item-who').filter({ hasText: 'Shambhu' })\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('.pend-item-who').filter({ hasText: 'Shambhu' })\u001b[22m\n\n\n  121 |\n  122 |   test('pending banner shows from-name and amount for both', async ({ page }) => {\n> 123 |     await expect(page.locator('.pend-item-who', { hasText: 'Shambhu' })).toBeVisible();\n      |                                                                          ^\n  124 |     await expect(page.locator('.pend-item-who', { hasText: 'Gurpreet' })).toBeVisible();\n  125 |     const amts = page.locator('.pend-item-amt');\n  126 |     await expect(amts).toHaveCount(2);\n    at /var/www/360lm/tests/fundcustodian.spec.js:123:74"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:46:09.187Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--f5e84-om-name-and-amount-for-both-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--f5e84-om-name-and-amount-for-both-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 74,
                        "line": 123
                      }
                    },
                    {
                      "workerIndex": 7,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 5607,
                      "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('.pend-item-who').filter({ hasText: 'Shambhu' })\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('.pend-item-who').filter({ hasText: 'Shambhu' })\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('.pend-item-who').filter({ hasText: 'Shambhu' })\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('.pend-item-who').filter({ hasText: 'Shambhu' })\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:123:74",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 74,
                          "line": 123
                        },
                        "snippet": "  121 |\n  122 |   test('pending banner shows from-name and amount for both', async ({ page }) => {\n> 123 |     await expect(page.locator('.pend-item-who', { hasText: 'Shambhu' })).toBeVisible();\n      |                                                                          ^\n  124 |     await expect(page.locator('.pend-item-who', { hasText: 'Gurpreet' })).toBeVisible();\n  125 |     const amts = page.locator('.pend-item-amt');\n  126 |     await expect(amts).toHaveCount(2);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 74,
                            "line": 123
                          },
                          "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('.pend-item-who').filter({ hasText: 'Shambhu' })\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('.pend-item-who').filter({ hasText: 'Shambhu' })\u001b[22m\n\n\n  121 |\n  122 |   test('pending banner shows from-name and amount for both', async ({ page }) => {\n> 123 |     await expect(page.locator('.pend-item-who', { hasText: 'Shambhu' })).toBeVisible();\n      |                                                                          ^\n  124 |     await expect(page.locator('.pend-item-who', { hasText: 'Gurpreet' })).toBeVisible();\n  125 |     const amts = page.locator('.pend-item-amt');\n  126 |     await expect(amts).toHaveCount(2);\n    at /var/www/360lm/tests/fundcustodian.spec.js:123:74"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:46:16.167Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--f5e84-om-name-and-amount-for-both-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--f5e84-om-name-and-amount-for-both-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 74,
                        "line": 123
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-b04a183312ba73e5a11d",
              "file": "fundcustodian.spec.js",
              "line": 122,
              "column": 3
            },
            {
              "title": "pending item has Accept and Reject buttons",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 8,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 5561,
                      "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('.btn-accept').first()\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('.btn-accept').first()\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('.btn-accept').first()\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('.btn-accept').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:130:55",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 55,
                          "line": 130
                        },
                        "snippet": "  128 |\n  129 |   test('pending item has Accept and Reject buttons', async ({ page }) => {\n> 130 |     await expect(page.locator('.btn-accept').first()).toBeVisible();\n      |                                                       ^\n  131 |     await expect(page.locator('.btn-reject').first()).toBeVisible();\n  132 |   });\n  133 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 55,
                            "line": 130
                          },
                          "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('.btn-accept').first()\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('.btn-accept').first()\u001b[22m\n\n\n  128 |\n  129 |   test('pending item has Accept and Reject buttons', async ({ page }) => {\n> 130 |     await expect(page.locator('.btn-accept').first()).toBeVisible();\n      |                                                       ^\n  131 |     await expect(page.locator('.btn-reject').first()).toBeVisible();\n  132 |   });\n  133 |\n    at /var/www/360lm/tests/fundcustodian.spec.js:130:55"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:46:22.945Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--b088d-s-Accept-and-Reject-buttons-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--b088d-s-Accept-and-Reject-buttons-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 55,
                        "line": 130
                      }
                    },
                    {
                      "workerIndex": 9,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 5589,
                      "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('.btn-accept').first()\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('.btn-accept').first()\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('.btn-accept').first()\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('.btn-accept').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:130:55",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 55,
                          "line": 130
                        },
                        "snippet": "  128 |\n  129 |   test('pending item has Accept and Reject buttons', async ({ page }) => {\n> 130 |     await expect(page.locator('.btn-accept').first()).toBeVisible();\n      |                                                       ^\n  131 |     await expect(page.locator('.btn-reject').first()).toBeVisible();\n  132 |   });\n  133 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 55,
                            "line": 130
                          },
                          "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('.btn-accept').first()\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('.btn-accept').first()\u001b[22m\n\n\n  128 |\n  129 |   test('pending item has Accept and Reject buttons', async ({ page }) => {\n> 130 |     await expect(page.locator('.btn-accept').first()).toBeVisible();\n      |                                                       ^\n  131 |     await expect(page.locator('.btn-reject').first()).toBeVisible();\n  132 |   });\n  133 |\n    at /var/www/360lm/tests/fundcustodian.spec.js:130:55"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:46:29.645Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--b088d-s-Accept-and-Reject-buttons-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--b088d-s-Accept-and-Reject-buttons-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 55,
                        "line": 130
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-d5b20c5a038fdf23fa61",
              "file": "fundcustodian.spec.js",
              "line": 129,
              "column": 3
            },
            {
              "title": "admin balance grid shows all 4 custodians",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 10,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 865,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:46:36.567Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-574735f2d7aa737c4de4",
              "file": "fundcustodian.spec.js",
              "line": 134,
              "column": 3
            },
            {
              "title": "primary badge on Pramod tile",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 10,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 591,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:46:37.879Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-97cf0bf851e91b557836",
              "file": "fundcustodian.spec.js",
              "line": 144,
              "column": 3
            },
            {
              "title": "manage custodian button visible for admin",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 10,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 474,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:46:38.510Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-8b52981cd3eb5f5965b5",
              "file": "fundcustodian.spec.js",
              "line": 149,
              "column": 3
            },
            {
              "title": "admin sees all outstanding advances (not just own)",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 10,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 5480,
                      "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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:155:76",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 76,
                          "line": 155
                        },
                        "snippet": "  153 |   test('admin sees all outstanding advances (not just own)', async ({ page }) => {\n  154 |     // Mukesh appears twice (A1 from shambhu + A5 from harish) — admin sees all custodians' advances\n> 155 |     await expect(page.locator('.adv-name', { hasText: 'Mukesh' }).first()).toBeVisible();\n      |                                                                            ^\n  156 |     await expect(page.locator('.adv-name', { hasText: 'Umashankar' })).toBeVisible();\n  157 |     const mukeshCount = await page.locator('.adv-name', { hasText: 'Mukesh' }).count();\n  158 |     expect(mukeshCount).toBe(2);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 76,
                            "line": 155
                          },
                          "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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\u001b[22m\n\n\n  153 |   test('admin sees all outstanding advances (not just own)', async ({ page }) => {\n  154 |     // Mukesh appears twice (A1 from shambhu + A5 from harish) — admin sees all custodians' advances\n> 155 |     await expect(page.locator('.adv-name', { hasText: 'Mukesh' }).first()).toBeVisible();\n      |                                                                            ^\n  156 |     await expect(page.locator('.adv-name', { hasText: 'Umashankar' })).toBeVisible();\n  157 |     const mukeshCount = await page.locator('.adv-name', { hasText: 'Mukesh' }).count();\n  158 |     expect(mukeshCount).toBe(2);\n    at /var/www/360lm/tests/fundcustodian.spec.js:155:76"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:46:39.034Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--9791e-ding-advances-not-just-own--android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--9791e-ding-advances-not-just-own--android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 76,
                        "line": 155
                      }
                    },
                    {
                      "workerIndex": 11,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 5633,
                      "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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:155:76",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 76,
                          "line": 155
                        },
                        "snippet": "  153 |   test('admin sees all outstanding advances (not just own)', async ({ page }) => {\n  154 |     // Mukesh appears twice (A1 from shambhu + A5 from harish) — admin sees all custodians' advances\n> 155 |     await expect(page.locator('.adv-name', { hasText: 'Mukesh' }).first()).toBeVisible();\n      |                                                                            ^\n  156 |     await expect(page.locator('.adv-name', { hasText: 'Umashankar' })).toBeVisible();\n  157 |     const mukeshCount = await page.locator('.adv-name', { hasText: 'Mukesh' }).count();\n  158 |     expect(mukeshCount).toBe(2);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 76,
                            "line": 155
                          },
                          "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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\u001b[22m\n\n\n  153 |   test('admin sees all outstanding advances (not just own)', async ({ page }) => {\n  154 |     // Mukesh appears twice (A1 from shambhu + A5 from harish) — admin sees all custodians' advances\n> 155 |     await expect(page.locator('.adv-name', { hasText: 'Mukesh' }).first()).toBeVisible();\n      |                                                                            ^\n  156 |     await expect(page.locator('.adv-name', { hasText: 'Umashankar' })).toBeVisible();\n  157 |     const mukeshCount = await page.locator('.adv-name', { hasText: 'Mukesh' }).count();\n  158 |     expect(mukeshCount).toBe(2);\n    at /var/www/360lm/tests/fundcustodian.spec.js:155:76"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:46:45.516Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--9791e-ding-advances-not-just-own--android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--9791e-ding-advances-not-just-own--android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 76,
                        "line": 155
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-a4bb90f7b065c8a0e369",
              "file": "fundcustodian.spec.js",
              "line": 153,
              "column": 3
            },
            {
              "title": "pending banner appears with count 2",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 34,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 6554,
                      "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('.pend-banner')\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('.pend-banner')\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('.pend-banner')\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('.pend-banner')\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:118:26",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 26,
                          "line": 118
                        },
                        "snippet": "  116 |   test('pending banner appears with count 2', async ({ page }) => {\n  117 |     const banner = page.locator('.pend-banner');\n> 118 |     await expect(banner).toBeVisible();\n      |                          ^\n  119 |     await expect(banner).toContainText('2 pending transfers');\n  120 |   });\n  121 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 26,
                            "line": 118
                          },
                          "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('.pend-banner')\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('.pend-banner')\u001b[22m\n\n\n  116 |   test('pending banner appears with count 2', async ({ page }) => {\n  117 |     const banner = page.locator('.pend-banner');\n> 118 |     await expect(banner).toBeVisible();\n      |                          ^\n  119 |     await expect(banner).toContainText('2 pending transfers');\n  120 |   });\n  121 |\n    at /var/www/360lm/tests/fundcustodian.spec.js:118:26"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:51:54.330Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--c5dfb-banner-appears-with-count-2-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--c5dfb-banner-appears-with-count-2-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 26,
                        "line": 118
                      }
                    },
                    {
                      "workerIndex": 35,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 6561,
                      "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('.pend-banner')\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('.pend-banner')\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('.pend-banner')\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('.pend-banner')\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:118:26",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 26,
                          "line": 118
                        },
                        "snippet": "  116 |   test('pending banner appears with count 2', async ({ page }) => {\n  117 |     const banner = page.locator('.pend-banner');\n> 118 |     await expect(banner).toBeVisible();\n      |                          ^\n  119 |     await expect(banner).toContainText('2 pending transfers');\n  120 |   });\n  121 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 26,
                            "line": 118
                          },
                          "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('.pend-banner')\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('.pend-banner')\u001b[22m\n\n\n  116 |   test('pending banner appears with count 2', async ({ page }) => {\n  117 |     const banner = page.locator('.pend-banner');\n> 118 |     await expect(banner).toBeVisible();\n      |                          ^\n  119 |     await expect(banner).toContainText('2 pending transfers');\n  120 |   });\n  121 |\n    at /var/www/360lm/tests/fundcustodian.spec.js:118:26"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:52:07.678Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--c5dfb-banner-appears-with-count-2-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--c5dfb-banner-appears-with-count-2-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 26,
                        "line": 118
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-5721b8f6fb5dd9cea365",
              "file": "fundcustodian.spec.js",
              "line": 116,
              "column": 3
            },
            {
              "title": "pending banner shows from-name and amount for both",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 36,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 6118,
                      "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('.pend-item-who').filter({ hasText: 'Shambhu' })\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('.pend-item-who').filter({ hasText: 'Shambhu' })\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('.pend-item-who').filter({ hasText: 'Shambhu' })\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('.pend-item-who').filter({ hasText: 'Shambhu' })\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:123:74",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 74,
                          "line": 123
                        },
                        "snippet": "  121 |\n  122 |   test('pending banner shows from-name and amount for both', async ({ page }) => {\n> 123 |     await expect(page.locator('.pend-item-who', { hasText: 'Shambhu' })).toBeVisible();\n      |                                                                          ^\n  124 |     await expect(page.locator('.pend-item-who', { hasText: 'Gurpreet' })).toBeVisible();\n  125 |     const amts = page.locator('.pend-item-amt');\n  126 |     await expect(amts).toHaveCount(2);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 74,
                            "line": 123
                          },
                          "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('.pend-item-who').filter({ hasText: 'Shambhu' })\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('.pend-item-who').filter({ hasText: 'Shambhu' })\u001b[22m\n\n\n  121 |\n  122 |   test('pending banner shows from-name and amount for both', async ({ page }) => {\n> 123 |     await expect(page.locator('.pend-item-who', { hasText: 'Shambhu' })).toBeVisible();\n      |                                                                          ^\n  124 |     await expect(page.locator('.pend-item-who', { hasText: 'Gurpreet' })).toBeVisible();\n  125 |     const amts = page.locator('.pend-item-amt');\n  126 |     await expect(amts).toHaveCount(2);\n    at /var/www/360lm/tests/fundcustodian.spec.js:123:74"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:52:16.656Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--f5e84-om-name-and-amount-for-both-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--f5e84-om-name-and-amount-for-both-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 74,
                        "line": 123
                      }
                    },
                    {
                      "workerIndex": 37,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 5895,
                      "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('.pend-item-who').filter({ hasText: 'Shambhu' })\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('.pend-item-who').filter({ hasText: 'Shambhu' })\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('.pend-item-who').filter({ hasText: 'Shambhu' })\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('.pend-item-who').filter({ hasText: 'Shambhu' })\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:123:74",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 74,
                          "line": 123
                        },
                        "snippet": "  121 |\n  122 |   test('pending banner shows from-name and amount for both', async ({ page }) => {\n> 123 |     await expect(page.locator('.pend-item-who', { hasText: 'Shambhu' })).toBeVisible();\n      |                                                                          ^\n  124 |     await expect(page.locator('.pend-item-who', { hasText: 'Gurpreet' })).toBeVisible();\n  125 |     const amts = page.locator('.pend-item-amt');\n  126 |     await expect(amts).toHaveCount(2);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 74,
                            "line": 123
                          },
                          "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('.pend-item-who').filter({ hasText: 'Shambhu' })\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('.pend-item-who').filter({ hasText: 'Shambhu' })\u001b[22m\n\n\n  121 |\n  122 |   test('pending banner shows from-name and amount for both', async ({ page }) => {\n> 123 |     await expect(page.locator('.pend-item-who', { hasText: 'Shambhu' })).toBeVisible();\n      |                                                                          ^\n  124 |     await expect(page.locator('.pend-item-who', { hasText: 'Gurpreet' })).toBeVisible();\n  125 |     const amts = page.locator('.pend-item-amt');\n  126 |     await expect(amts).toHaveCount(2);\n    at /var/www/360lm/tests/fundcustodian.spec.js:123:74"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:52:24.677Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--f5e84-om-name-and-amount-for-both-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--f5e84-om-name-and-amount-for-both-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 74,
                        "line": 123
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-fe87a17783e6f6cbddeb",
              "file": "fundcustodian.spec.js",
              "line": 122,
              "column": 3
            },
            {
              "title": "pending item has Accept and Reject buttons",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 38,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 6085,
                      "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('.btn-accept').first()\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('.btn-accept').first()\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('.btn-accept').first()\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('.btn-accept').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:130:55",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 55,
                          "line": 130
                        },
                        "snippet": "  128 |\n  129 |   test('pending item has Accept and Reject buttons', async ({ page }) => {\n> 130 |     await expect(page.locator('.btn-accept').first()).toBeVisible();\n      |                                                       ^\n  131 |     await expect(page.locator('.btn-reject').first()).toBeVisible();\n  132 |   });\n  133 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 55,
                            "line": 130
                          },
                          "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('.btn-accept').first()\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('.btn-accept').first()\u001b[22m\n\n\n  128 |\n  129 |   test('pending item has Accept and Reject buttons', async ({ page }) => {\n> 130 |     await expect(page.locator('.btn-accept').first()).toBeVisible();\n      |                                                       ^\n  131 |     await expect(page.locator('.btn-reject').first()).toBeVisible();\n  132 |   });\n  133 |\n    at /var/www/360lm/tests/fundcustodian.spec.js:130:55"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:52:32.010Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--b088d-s-Accept-and-Reject-buttons-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--b088d-s-Accept-and-Reject-buttons-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 55,
                        "line": 130
                      }
                    },
                    {
                      "workerIndex": 39,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 6004,
                      "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('.btn-accept').first()\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('.btn-accept').first()\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('.btn-accept').first()\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('.btn-accept').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:130:55",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 55,
                          "line": 130
                        },
                        "snippet": "  128 |\n  129 |   test('pending item has Accept and Reject buttons', async ({ page }) => {\n> 130 |     await expect(page.locator('.btn-accept').first()).toBeVisible();\n      |                                                       ^\n  131 |     await expect(page.locator('.btn-reject').first()).toBeVisible();\n  132 |   });\n  133 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 55,
                            "line": 130
                          },
                          "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('.btn-accept').first()\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('.btn-accept').first()\u001b[22m\n\n\n  128 |\n  129 |   test('pending item has Accept and Reject buttons', async ({ page }) => {\n> 130 |     await expect(page.locator('.btn-accept').first()).toBeVisible();\n      |                                                       ^\n  131 |     await expect(page.locator('.btn-reject').first()).toBeVisible();\n  132 |   });\n  133 |\n    at /var/www/360lm/tests/fundcustodian.spec.js:130:55"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:52:39.514Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--b088d-s-Accept-and-Reject-buttons-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--b088d-s-Accept-and-Reject-buttons-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 55,
                        "line": 130
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-7b266c8c9bc51287a120",
              "file": "fundcustodian.spec.js",
              "line": 129,
              "column": 3
            },
            {
              "title": "admin balance grid shows all 4 custodians",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 40,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 949,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:52:49.519Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-1958f4c60f44583934fb",
              "file": "fundcustodian.spec.js",
              "line": 134,
              "column": 3
            },
            {
              "title": "primary badge on Pramod tile",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 40,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 943,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:52:50.725Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-6fdaef92560b85a800dc",
              "file": "fundcustodian.spec.js",
              "line": 144,
              "column": 3
            },
            {
              "title": "manage custodian button visible for admin",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 40,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 705,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:52:51.736Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-10340aa1573ae9c5ee45",
              "file": "fundcustodian.spec.js",
              "line": 149,
              "column": 3
            },
            {
              "title": "admin sees all outstanding advances (not just own)",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 40,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 5659,
                      "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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:155:76",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 76,
                          "line": 155
                        },
                        "snippet": "  153 |   test('admin sees all outstanding advances (not just own)', async ({ page }) => {\n  154 |     // Mukesh appears twice (A1 from shambhu + A5 from harish) — admin sees all custodians' advances\n> 155 |     await expect(page.locator('.adv-name', { hasText: 'Mukesh' }).first()).toBeVisible();\n      |                                                                            ^\n  156 |     await expect(page.locator('.adv-name', { hasText: 'Umashankar' })).toBeVisible();\n  157 |     const mukeshCount = await page.locator('.adv-name', { hasText: 'Mukesh' }).count();\n  158 |     expect(mukeshCount).toBe(2);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 76,
                            "line": 155
                          },
                          "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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\u001b[22m\n\n\n  153 |   test('admin sees all outstanding advances (not just own)', async ({ page }) => {\n  154 |     // Mukesh appears twice (A1 from shambhu + A5 from harish) — admin sees all custodians' advances\n> 155 |     await expect(page.locator('.adv-name', { hasText: 'Mukesh' }).first()).toBeVisible();\n      |                                                                            ^\n  156 |     await expect(page.locator('.adv-name', { hasText: 'Umashankar' })).toBeVisible();\n  157 |     const mukeshCount = await page.locator('.adv-name', { hasText: 'Mukesh' }).count();\n  158 |     expect(mukeshCount).toBe(2);\n    at /var/www/360lm/tests/fundcustodian.spec.js:155:76"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:52:52.489Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--9791e-ding-advances-not-just-own--desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--9791e-ding-advances-not-just-own--desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 76,
                        "line": 155
                      }
                    },
                    {
                      "workerIndex": 41,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 7183,
                      "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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:155:76",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 76,
                          "line": 155
                        },
                        "snippet": "  153 |   test('admin sees all outstanding advances (not just own)', async ({ page }) => {\n  154 |     // Mukesh appears twice (A1 from shambhu + A5 from harish) — admin sees all custodians' advances\n> 155 |     await expect(page.locator('.adv-name', { hasText: 'Mukesh' }).first()).toBeVisible();\n      |                                                                            ^\n  156 |     await expect(page.locator('.adv-name', { hasText: 'Umashankar' })).toBeVisible();\n  157 |     const mukeshCount = await page.locator('.adv-name', { hasText: 'Mukesh' }).count();\n  158 |     expect(mukeshCount).toBe(2);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 76,
                            "line": 155
                          },
                          "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('.adv-name').filter({ hasText: 'Mukesh' }).first()\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('.adv-name').filter({ hasText: 'Mukesh' }).first()\u001b[22m\n\n\n  153 |   test('admin sees all outstanding advances (not just own)', async ({ page }) => {\n  154 |     // Mukesh appears twice (A1 from shambhu + A5 from harish) — admin sees all custodians' advances\n> 155 |     await expect(page.locator('.adv-name', { hasText: 'Mukesh' }).first()).toBeVisible();\n      |                                                                            ^\n  156 |     await expect(page.locator('.adv-name', { hasText: 'Umashankar' })).toBeVisible();\n  157 |     const mukeshCount = await page.locator('.adv-name', { hasText: 'Mukesh' }).count();\n  158 |     expect(mukeshCount).toBe(2);\n    at /var/www/360lm/tests/fundcustodian.spec.js:155:76"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:53:01.823Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--9791e-ding-advances-not-just-own--desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--9791e-ding-advances-not-just-own--desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 76,
                        "line": 155
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-f7ddee31989f51c705ac",
              "file": "fundcustodian.spec.js",
              "line": 153,
              "column": 3
            }
          ]
        },
        {
          "title": "Dashboard — pramod (admin, primary custodian)",
          "file": "fundcustodian.spec.js",
          "line": 165,
          "column": 6,
          "specs": [
            {
              "title": "pramod balance card is negative and shows red text",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 12,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 5602,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/neg/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    14 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/neg/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    14 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:172:25",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 25,
                          "line": 172
                        },
                        "snippet": "  170 |     const balEl = page.locator('#my-balance');\n  171 |     // Negative balance → .neg class\n> 172 |     await expect(balEl).toHaveClass(/neg/);\n      |                         ^\n  173 |     const txt = await balEl.textContent();\n  174 |     expect(txt).toMatch(/₹/);\n  175 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 25,
                            "line": 172
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/neg/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    14 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n\n\n  170 |     const balEl = page.locator('#my-balance');\n  171 |     // Negative balance → .neg class\n> 172 |     await expect(balEl).toHaveClass(/neg/);\n      |                         ^\n  173 |     const txt = await balEl.textContent();\n  174 |     expect(txt).toMatch(/₹/);\n  175 |   });\n    at /var/www/360lm/tests/fundcustodian.spec.js:172:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:46:52.494Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--4488f-negative-and-shows-red-text-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--4488f-negative-and-shows-red-text-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 25,
                        "line": 172
                      }
                    },
                    {
                      "workerIndex": 13,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 5604,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/neg/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    14 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/neg/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    14 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:172:25",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 25,
                          "line": 172
                        },
                        "snippet": "  170 |     const balEl = page.locator('#my-balance');\n  171 |     // Negative balance → .neg class\n> 172 |     await expect(balEl).toHaveClass(/neg/);\n      |                         ^\n  173 |     const txt = await balEl.textContent();\n  174 |     expect(txt).toMatch(/₹/);\n  175 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 25,
                            "line": 172
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/neg/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    14 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n\n\n  170 |     const balEl = page.locator('#my-balance');\n  171 |     // Negative balance → .neg class\n> 172 |     await expect(balEl).toHaveClass(/neg/);\n      |                         ^\n  173 |     const txt = await balEl.textContent();\n  174 |     expect(txt).toMatch(/₹/);\n  175 |   });\n    at /var/www/360lm/tests/fundcustodian.spec.js:172:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:46:59.215Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--4488f-negative-and-shows-red-text-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--4488f-negative-and-shows-red-text-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 25,
                        "line": 172
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-b2cb37c30ab55afae59f",
              "file": "fundcustodian.spec.js",
              "line": 166,
              "column": 3
            },
            {
              "title": "pramod balance card is negative and shows red text",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 42,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 6874,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/neg/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    13 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/neg/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    13 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:172:25",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 25,
                          "line": 172
                        },
                        "snippet": "  170 |     const balEl = page.locator('#my-balance');\n  171 |     // Negative balance → .neg class\n> 172 |     await expect(balEl).toHaveClass(/neg/);\n      |                         ^\n  173 |     const txt = await balEl.textContent();\n  174 |     expect(txt).toMatch(/₹/);\n  175 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 25,
                            "line": 172
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/neg/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    13 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n\n\n  170 |     const balEl = page.locator('#my-balance');\n  171 |     // Negative balance → .neg class\n> 172 |     await expect(balEl).toHaveClass(/neg/);\n      |                         ^\n  173 |     const txt = await balEl.textContent();\n  174 |     expect(txt).toMatch(/₹/);\n  175 |   });\n    at /var/www/360lm/tests/fundcustodian.spec.js:172:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:53:14.673Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--4488f-negative-and-shows-red-text-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--4488f-negative-and-shows-red-text-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 25,
                        "line": 172
                      }
                    },
                    {
                      "workerIndex": 43,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 6790,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/neg/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    14 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/neg/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    14 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:172:25",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 25,
                          "line": 172
                        },
                        "snippet": "  170 |     const balEl = page.locator('#my-balance');\n  171 |     // Negative balance → .neg class\n> 172 |     await expect(balEl).toHaveClass(/neg/);\n      |                         ^\n  173 |     const txt = await balEl.textContent();\n  174 |     expect(txt).toMatch(/₹/);\n  175 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 25,
                            "line": 172
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/neg/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    14 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n\n\n  170 |     const balEl = page.locator('#my-balance');\n  171 |     // Negative balance → .neg class\n> 172 |     await expect(balEl).toHaveClass(/neg/);\n      |                         ^\n  173 |     const txt = await balEl.textContent();\n  174 |     expect(txt).toMatch(/₹/);\n  175 |   });\n    at /var/www/360lm/tests/fundcustodian.spec.js:172:25"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:53:25.018Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--4488f-negative-and-shows-red-text-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--4488f-negative-and-shows-red-text-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 25,
                        "line": 172
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-a9e02f15a81841037820",
              "file": "fundcustodian.spec.js",
              "line": 166,
              "column": 3
            }
          ]
        },
        {
          "title": "Dashboard — gurpreet (new custodian, low activity)",
          "file": "fundcustodian.spec.js",
          "line": 181,
          "column": 6,
          "specs": [
            {
              "title": "gurpreet name shown in header",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 14,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 582,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:06.420Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-052bbbbb2ecdb12953d6",
              "file": "fundcustodian.spec.js",
              "line": 188,
              "column": 3
            },
            {
              "title": "positive balance shows .pos class",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 14,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 5493,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/pos/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    14 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/pos/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    14 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:194:47",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 47,
                          "line": 194
                        },
                        "snippet": "  192 |   test('positive balance shows .pos class', async ({ page }) => {\n  193 |     // gurpreet expected balance: +216.44\n> 194 |     await expect(page.locator('#my-balance')).toHaveClass(/pos/);\n      |                                               ^\n  195 |   });\n  196 |\n  197 |   test('no pending transfers for gurpreet', async ({ page }) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 47,
                            "line": 194
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/pos/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    14 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n\n\n  192 |   test('positive balance shows .pos class', async ({ page }) => {\n  193 |     // gurpreet expected balance: +216.44\n> 194 |     await expect(page.locator('#my-balance')).toHaveClass(/pos/);\n      |                                               ^\n  195 |   });\n  196 |\n  197 |   test('no pending transfers for gurpreet', async ({ page }) => {\n    at /var/www/360lm/tests/fundcustodian.spec.js:194:47"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:07.248Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--97d5c-ive-balance-shows-pos-class-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--97d5c-ive-balance-shows-pos-class-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 47,
                        "line": 194
                      }
                    },
                    {
                      "workerIndex": 15,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 5640,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/pos/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    14 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/pos/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    14 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:194:47",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 47,
                          "line": 194
                        },
                        "snippet": "  192 |   test('positive balance shows .pos class', async ({ page }) => {\n  193 |     // gurpreet expected balance: +216.44\n> 194 |     await expect(page.locator('#my-balance')).toHaveClass(/pos/);\n      |                                               ^\n  195 |   });\n  196 |\n  197 |   test('no pending transfers for gurpreet', async ({ page }) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 47,
                            "line": 194
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/pos/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    14 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n\n\n  192 |   test('positive balance shows .pos class', async ({ page }) => {\n  193 |     // gurpreet expected balance: +216.44\n> 194 |     await expect(page.locator('#my-balance')).toHaveClass(/pos/);\n      |                                               ^\n  195 |   });\n  196 |\n  197 |   test('no pending transfers for gurpreet', async ({ page }) => {\n    at /var/www/360lm/tests/fundcustodian.spec.js:194:47"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:47:13.794Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--97d5c-ive-balance-shows-pos-class-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--97d5c-ive-balance-shows-pos-class-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 47,
                        "line": 194
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-549ce3e00f5551bf942d",
              "file": "fundcustodian.spec.js",
              "line": 192,
              "column": 3
            },
            {
              "title": "no pending transfers for gurpreet",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 743,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:20.735Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-facad53c5aa6536b745e",
              "file": "fundcustodian.spec.js",
              "line": 197,
              "column": 3
            },
            {
              "title": "gurpreet name shown in header",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 44,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1407,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:53:34.405Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-3c582c29aafe3d0e0ceb",
              "file": "fundcustodian.spec.js",
              "line": 188,
              "column": 3
            },
            {
              "title": "positive balance shows .pos class",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 44,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 6174,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/pos/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    13 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/pos/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    13 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:194:47",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 47,
                          "line": 194
                        },
                        "snippet": "  192 |   test('positive balance shows .pos class', async ({ page }) => {\n  193 |     // gurpreet expected balance: +216.44\n> 194 |     await expect(page.locator('#my-balance')).toHaveClass(/pos/);\n      |                                               ^\n  195 |   });\n  196 |\n  197 |   test('no pending transfers for gurpreet', async ({ page }) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 47,
                            "line": 194
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/pos/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    13 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n\n\n  192 |   test('positive balance shows .pos class', async ({ page }) => {\n  193 |     // gurpreet expected balance: +216.44\n> 194 |     await expect(page.locator('#my-balance')).toHaveClass(/pos/);\n      |                                               ^\n  195 |   });\n  196 |\n  197 |   test('no pending transfers for gurpreet', async ({ page }) => {\n    at /var/www/360lm/tests/fundcustodian.spec.js:194:47"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:53:36.340Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--97d5c-ive-balance-shows-pos-class-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--97d5c-ive-balance-shows-pos-class-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 47,
                        "line": 194
                      }
                    },
                    {
                      "workerIndex": 45,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 6255,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/pos/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    13 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/pos/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    13 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:194:47",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 47,
                          "line": 194
                        },
                        "snippet": "  192 |   test('positive balance shows .pos class', async ({ page }) => {\n  193 |     // gurpreet expected balance: +216.44\n> 194 |     await expect(page.locator('#my-balance')).toHaveClass(/pos/);\n      |                                               ^\n  195 |   });\n  196 |\n  197 |   test('no pending transfers for gurpreet', async ({ page }) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 47,
                            "line": 194
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveClass\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#my-balance')\nExpected pattern: \u001b[32m/pos/\u001b[39m\nReceived string:  \u001b[31m\"bal-amount\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m  - Expect \"toHaveClass\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#my-balance')\u001b[22m\n\u001b[2m    13 × locator resolved to <div id=\"my-balance\" class=\"bal-amount\">₹ 0.00</div>\u001b[22m\n\u001b[2m       - unexpected value \"bal-amount\"\u001b[22m\n\n\n  192 |   test('positive balance shows .pos class', async ({ page }) => {\n  193 |     // gurpreet expected balance: +216.44\n> 194 |     await expect(page.locator('#my-balance')).toHaveClass(/pos/);\n      |                                               ^\n  195 |   });\n  196 |\n  197 |   test('no pending transfers for gurpreet', async ({ page }) => {\n    at /var/www/360lm/tests/fundcustodian.spec.js:194:47"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:53:44.282Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--97d5c-ive-balance-shows-pos-class-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Dashboard-—--97d5c-ive-balance-shows-pos-class-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 47,
                        "line": 194
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-363c6279abff29f714bf",
              "file": "fundcustodian.spec.js",
              "line": 192,
              "column": 3
            },
            {
              "title": "no pending transfers for gurpreet",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1536,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:53:56.691Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-e17a78787a3159fff6c8",
              "file": "fundcustodian.spec.js",
              "line": 197,
              "column": 3
            }
          ]
        },
        {
          "title": "Transfer Form",
          "file": "fundcustodian.spec.js",
          "line": 205,
          "column": 6,
          "specs": [
            {
              "title": "giver mode selected by default",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 565,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:21.851Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-ef68eb6005a875505ba7",
              "file": "fundcustodian.spec.js",
              "line": 213,
              "column": 3
            },
            {
              "title": "cash + giver mode shows pending info notice",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 565,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:22.448Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-3b24fd4ba134e6a26c56",
              "file": "fundcustodian.spec.js",
              "line": 218,
              "column": 3
            },
            {
              "title": "switching to receiver mode hides pending notice",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 543,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:23.054Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-48b5d9e149b2131e7da0",
              "file": "fundcustodian.spec.js",
              "line": 222,
              "column": 3
            },
            {
              "title": "cash mode selected by default, ref field hidden",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 588,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:23.626Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-459c826d3e9306798995",
              "file": "fundcustodian.spec.js",
              "line": 227,
              "column": 3
            },
            {
              "title": "selecting UPI shows reference field",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 552,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:24.256Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-9418cb203efc2b9176eb",
              "file": "fundcustodian.spec.js",
              "line": 232,
              "column": 3
            },
            {
              "title": "selecting NEFT shows reference field",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 573,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:24.843Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-fcc7cc3ec4a43af56054",
              "file": "fundcustodian.spec.js",
              "line": 237,
              "column": 3
            },
            {
              "title": "selecting IMPS shows reference field",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 749,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:25.440Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-e467bd64164b4bdca24c",
              "file": "fundcustodian.spec.js",
              "line": 242,
              "column": 3
            },
            {
              "title": "selecting Cheque shows reference field",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 558,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:26.215Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-961abc88669b93f590d6",
              "file": "fundcustodian.spec.js",
              "line": 247,
              "column": 3
            },
            {
              "title": "returning to cash hides reference field again",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 630,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:26.817Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-58b9ed70f79484eba41d",
              "file": "fundcustodian.spec.js",
              "line": 252,
              "column": 3
            },
            {
              "title": "custodian select excludes self (shambhu not in list)",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 484,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:27.490Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-551ecf079ee570d8d027",
              "file": "fundcustodian.spec.js",
              "line": 259,
              "column": 3
            },
            {
              "title": "submit with no custodian shows error toast",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 594,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:27.993Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-f972700ca1e442981b79",
              "file": "fundcustodian.spec.js",
              "line": 267,
              "column": 3
            },
            {
              "title": "submit with no amount shows error toast",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 685,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:28.615Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-c66e845362f4505f2ccb",
              "file": "fundcustodian.spec.js",
              "line": 273,
              "column": 3
            },
            {
              "title": "today date is pre-filled",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 621,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:29.335Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-3a49838b38cadbcae924",
              "file": "fundcustodian.spec.js",
              "line": 279,
              "column": 3
            },
            {
              "title": "clear button resets form to defaults",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 761,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:29.988Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-1a92bf0cbe124ff4a8ef",
              "file": "fundcustodian.spec.js",
              "line": 284,
              "column": 3
            },
            {
              "title": "giver mode selected by default",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1650,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:53:59.026Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-1125987eeee3827488db",
              "file": "fundcustodian.spec.js",
              "line": 213,
              "column": 3
            },
            {
              "title": "cash + giver mode shows pending info notice",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 3621,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:00.785Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-a3f297cc0c13547b65d2",
              "file": "fundcustodian.spec.js",
              "line": 218,
              "column": 3
            },
            {
              "title": "switching to receiver mode hides pending notice",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2543,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:04.596Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-d34ad27dbae4556b0e77",
              "file": "fundcustodian.spec.js",
              "line": 222,
              "column": 3
            },
            {
              "title": "cash mode selected by default, ref field hidden",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2134,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:07.260Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-d65813e414edac672519",
              "file": "fundcustodian.spec.js",
              "line": 227,
              "column": 3
            },
            {
              "title": "selecting UPI shows reference field",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1480,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:09.496Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-cbb8e990279bafb125c2",
              "file": "fundcustodian.spec.js",
              "line": 232,
              "column": 3
            },
            {
              "title": "selecting NEFT shows reference field",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1660,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:11.157Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-d8f923b25c45290b6ecc",
              "file": "fundcustodian.spec.js",
              "line": 237,
              "column": 3
            },
            {
              "title": "selecting IMPS shows reference field",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1480,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:12.899Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-4bccbf499a57974c4ef9",
              "file": "fundcustodian.spec.js",
              "line": 242,
              "column": 3
            },
            {
              "title": "selecting Cheque shows reference field",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2575,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:14.448Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-764f1e9ac54001c4e94d",
              "file": "fundcustodian.spec.js",
              "line": 247,
              "column": 3
            },
            {
              "title": "returning to cash hides reference field again",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2935,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:17.200Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-77292d8be87cc2fca380",
              "file": "fundcustodian.spec.js",
              "line": 252,
              "column": 3
            },
            {
              "title": "custodian select excludes self (shambhu not in list)",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2146,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:20.340Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-795c63d872974f0b0996",
              "file": "fundcustodian.spec.js",
              "line": 259,
              "column": 3
            },
            {
              "title": "submit with no custodian shows error toast",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2342,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:22.612Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-93553a68f921a13a1ff6",
              "file": "fundcustodian.spec.js",
              "line": 267,
              "column": 3
            },
            {
              "title": "submit with no amount shows error toast",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2246,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:25.082Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-c584ed83567c4d0e42a7",
              "file": "fundcustodian.spec.js",
              "line": 273,
              "column": 3
            },
            {
              "title": "today date is pre-filled",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1184,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:27.399Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-be22f6a44ee11b2e5370",
              "file": "fundcustodian.spec.js",
              "line": 279,
              "column": 3
            },
            {
              "title": "clear button resets form to defaults",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2138,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:28.713Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-980ba8254336a5f5fb57",
              "file": "fundcustodian.spec.js",
              "line": 284,
              "column": 3
            }
          ]
        },
        {
          "title": "Advance Form",
          "file": "fundcustodian.spec.js",
          "line": 302,
          "column": 6,
          "specs": [
            {
              "title": "\"Other\" employee reveals manual name field",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 621,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:30.780Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-bd1008c75cbe58ea95cb",
              "file": "fundcustodian.spec.js",
              "line": 310,
              "column": 3
            },
            {
              "title": "selecting a named employee hides manual name field",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 588,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:31.428Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-789e7bcaff6c81f31fd9",
              "file": "fundcustodian.spec.js",
              "line": 316,
              "column": 3
            },
            {
              "title": "cash mode default, ref field hidden",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 499,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:32.032Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-1e0e9761c2c9feb7e8a1",
              "file": "fundcustodian.spec.js",
              "line": 323,
              "column": 3
            },
            {
              "title": "UPI mode shows reference field",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 556,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:32.549Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-695750155217d06b7bfc",
              "file": "fundcustodian.spec.js",
              "line": 327,
              "column": 3
            },
            {
              "title": "NEFT mode shows reference field",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 629,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:33.130Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-90edef50db895b34874c",
              "file": "fundcustodian.spec.js",
              "line": 332,
              "column": 3
            },
            {
              "title": "IMPS mode shows reference field",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 489,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:33.780Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-e5806dd79ff96a582b59",
              "file": "fundcustodian.spec.js",
              "line": 337,
              "column": 3
            },
            {
              "title": "no cheque option in advance form (transfers only)",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 566,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:34.298Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-5e323dab2963d2b2d4e8",
              "file": "fundcustodian.spec.js",
              "line": 342,
              "column": 3
            },
            {
              "title": "submit with no employee shows error",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 526,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:34.890Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-1bd8746c11abd3c9af44",
              "file": "fundcustodian.spec.js",
              "line": 347,
              "column": 3
            },
            {
              "title": "submit with \"Other\" but empty name shows error",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 633,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:35.431Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-5c5748754a84c60cced3",
              "file": "fundcustodian.spec.js",
              "line": 353,
              "column": 3
            },
            {
              "title": "submit with no amount shows error",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 525,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:36.091Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-4680c0c0cd5c22296a37",
              "file": "fundcustodian.spec.js",
              "line": 360,
              "column": 3
            },
            {
              "title": "today date is pre-filled",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 525,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:36.636Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-99c525f4b3ab3f19eb0c",
              "file": "fundcustodian.spec.js",
              "line": 366,
              "column": 3
            },
            {
              "title": "\"Other\" employee reveals manual name field",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2204,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:30.942Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-5c6d097353ad649d8d99",
              "file": "fundcustodian.spec.js",
              "line": 310,
              "column": 3
            },
            {
              "title": "selecting a named employee hides manual name field",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2189,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:33.263Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-c741d11383cbe9a327bf",
              "file": "fundcustodian.spec.js",
              "line": 316,
              "column": 3
            },
            {
              "title": "cash mode default, ref field hidden",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2187,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:35.607Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-fbac97618131384c3c7e",
              "file": "fundcustodian.spec.js",
              "line": 323,
              "column": 3
            },
            {
              "title": "UPI mode shows reference field",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1582,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:37.993Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-37b1cf276059a17862a2",
              "file": "fundcustodian.spec.js",
              "line": 327,
              "column": 3
            },
            {
              "title": "NEFT mode shows reference field",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1299,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:39.681Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-fc4b459a4b26e02deacc",
              "file": "fundcustodian.spec.js",
              "line": 332,
              "column": 3
            },
            {
              "title": "IMPS mode shows reference field",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1402,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:41.041Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-7292e8dca011f3e58da1",
              "file": "fundcustodian.spec.js",
              "line": 337,
              "column": 3
            },
            {
              "title": "no cheque option in advance form (transfers only)",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1442,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:42.592Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-e2934f3895efc0802b02",
              "file": "fundcustodian.spec.js",
              "line": 342,
              "column": 3
            },
            {
              "title": "submit with no employee shows error",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2588,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:44.123Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-27505533382af670f229",
              "file": "fundcustodian.spec.js",
              "line": 347,
              "column": 3
            },
            {
              "title": "submit with \"Other\" but empty name shows error",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2468,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:46.886Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-6d7e50d815ddbc2bf4ad",
              "file": "fundcustodian.spec.js",
              "line": 353,
              "column": 3
            },
            {
              "title": "submit with no amount shows error",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2556,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:49.480Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-3be5bc5840d507cebb49",
              "file": "fundcustodian.spec.js",
              "line": 360,
              "column": 3
            },
            {
              "title": "today date is pre-filled",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2013,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:52.161Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-dede24ad6db44e6e0606",
              "file": "fundcustodian.spec.js",
              "line": 366,
              "column": 3
            }
          ]
        },
        {
          "title": "Ledger — Transfers tab",
          "file": "fundcustodian.spec.js",
          "line": 375,
          "column": 6,
          "specs": [
            {
              "title": "Transfers tab active by default",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 453,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:37.180Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-e57c07202882cdf3a822",
              "file": "fundcustodian.spec.js",
              "line": 383,
              "column": 3
            },
            {
              "title": "shambhu ledger shows transfer rows",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 16,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 10509,
                      "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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:390:71",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 71,
                          "line": 390
                        },
                        "snippet": "  388 |\n  389 |   test('shambhu ledger shows transfer rows', async ({ page }) => {\n> 390 |     await expect(page.locator('#transfers-list .ledger-row').first()).toBeVisible({ timeout: 10000 });\n      |                                                                       ^\n  391 |     const rowCount = await page.locator('#transfers-list .ledger-row').count();\n  392 |     expect(rowCount).toBeGreaterThan(0);\n  393 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 71,
                            "line": 390
                          },
                          "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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\u001b[22m\n\n\n  388 |\n  389 |   test('shambhu ledger shows transfer rows', async ({ page }) => {\n> 390 |     await expect(page.locator('#transfers-list .ledger-row').first()).toBeVisible({ timeout: 10000 });\n      |                                                                       ^\n  391 |     const rowCount = await page.locator('#transfers-list .ledger-row').count();\n  392 |     expect(rowCount).toBeGreaterThan(0);\n  393 |   });\n    at /var/www/360lm/tests/fundcustodian.spec.js:390:71"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:47:37.657Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Tra-ab3ae--ledger-shows-transfer-rows-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Tra-ab3ae--ledger-shows-transfer-rows-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 71,
                        "line": 390
                      }
                    },
                    {
                      "workerIndex": 17,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 10752,
                      "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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:390:71",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 71,
                          "line": 390
                        },
                        "snippet": "  388 |\n  389 |   test('shambhu ledger shows transfer rows', async ({ page }) => {\n> 390 |     await expect(page.locator('#transfers-list .ledger-row').first()).toBeVisible({ timeout: 10000 });\n      |                                                                       ^\n  391 |     const rowCount = await page.locator('#transfers-list .ledger-row').count();\n  392 |     expect(rowCount).toBeGreaterThan(0);\n  393 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 71,
                            "line": 390
                          },
                          "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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\u001b[22m\n\n\n  388 |\n  389 |   test('shambhu ledger shows transfer rows', async ({ page }) => {\n> 390 |     await expect(page.locator('#transfers-list .ledger-row').first()).toBeVisible({ timeout: 10000 });\n      |                                                                       ^\n  391 |     const rowCount = await page.locator('#transfers-list .ledger-row').count();\n  392 |     expect(rowCount).toBeGreaterThan(0);\n  393 |   });\n    at /var/www/360lm/tests/fundcustodian.spec.js:390:71"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:47:49.240Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Tra-ab3ae--ledger-shows-transfer-rows-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Tra-ab3ae--ledger-shows-transfer-rows-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 71,
                        "line": 390
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-e493735869a94e6541d7",
              "file": "fundcustodian.spec.js",
              "line": 389,
              "column": 3
            },
            {
              "title": "status badges present in transfer rows",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 18,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 9690,
                      "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('#transfers-list .badge').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .badge').first()\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('#transfers-list .badge').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .badge').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:396:66",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 66,
                          "line": 396
                        },
                        "snippet": "  394 |\n  395 |   test('status badges present in transfer rows', async ({ page }) => {\n> 396 |     await expect(page.locator('#transfers-list .badge').first()).toBeVisible({ timeout: 8000 });\n      |                                                                  ^\n  397 |   });\n  398 |\n  399 |   test('switching to Advances tab shows advances panel', async ({ page }) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 66,
                            "line": 396
                          },
                          "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('#transfers-list .badge').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .badge').first()\u001b[22m\n\n\n  394 |\n  395 |   test('status badges present in transfer rows', async ({ page }) => {\n> 396 |     await expect(page.locator('#transfers-list .badge').first()).toBeVisible({ timeout: 8000 });\n      |                                                                  ^\n  397 |   });\n  398 |\n  399 |   test('switching to Advances tab shows advances panel', async ({ page }) => {\n    at /var/www/360lm/tests/fundcustodian.spec.js:396:66"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:48:01.298Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Tra-4b0cb-es-present-in-transfer-rows-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Tra-4b0cb-es-present-in-transfer-rows-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 66,
                        "line": 396
                      }
                    },
                    {
                      "workerIndex": 19,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 8670,
                      "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('#transfers-list .badge').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .badge').first()\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('#transfers-list .badge').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .badge').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:396:66",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 66,
                          "line": 396
                        },
                        "snippet": "  394 |\n  395 |   test('status badges present in transfer rows', async ({ page }) => {\n> 396 |     await expect(page.locator('#transfers-list .badge').first()).toBeVisible({ timeout: 8000 });\n      |                                                                  ^\n  397 |   });\n  398 |\n  399 |   test('switching to Advances tab shows advances panel', async ({ page }) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 66,
                            "line": 396
                          },
                          "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('#transfers-list .badge').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .badge').first()\u001b[22m\n\n\n  394 |\n  395 |   test('status badges present in transfer rows', async ({ page }) => {\n> 396 |     await expect(page.locator('#transfers-list .badge').first()).toBeVisible({ timeout: 8000 });\n      |                                                                  ^\n  397 |   });\n  398 |\n  399 |   test('switching to Advances tab shows advances panel', async ({ page }) => {\n    at /var/www/360lm/tests/fundcustodian.spec.js:396:66"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:48:12.833Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Tra-4b0cb-es-present-in-transfer-rows-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Tra-4b0cb-es-present-in-transfer-rows-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 66,
                        "line": 396
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-6c71a1e8e23d5545818f",
              "file": "fundcustodian.spec.js",
              "line": 395,
              "column": 3
            },
            {
              "title": "switching to Advances tab shows advances panel",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 20,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 802,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:48:22.873Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-eaf76ec5b56aa7863fd6",
              "file": "fundcustodian.spec.js",
              "line": 399,
              "column": 3
            },
            {
              "title": "no custodian filter for non-admin",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 20,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 579,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:48:23.881Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-e50e79ea7c8995f141a7",
              "file": "fundcustodian.spec.js",
              "line": 406,
              "column": 3
            },
            {
              "title": "Transfers tab active by default",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2172,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:54.259Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-aefcde38c2032ecc1167",
              "file": "fundcustodian.spec.js",
              "line": 383,
              "column": 3
            },
            {
              "title": "shambhu ledger shows transfer rows",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 46,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 11224,
                      "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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:420:71",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 71,
                          "line": 420
                        },
                        "snippet": "  418 |\n  419 |   test('shambhu ledger shows transfer rows', async ({ page }) => {\n> 420 |     await expect(page.locator('#transfers-list .ledger-row').first()).toBeVisible({ timeout: 10000 });\n      |                                                                       ^\n  421 |     const rowCount = await page.locator('#transfers-list .ledger-row').count();\n  422 |     expect(rowCount).toBeGreaterThan(0);\n  423 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 71,
                            "line": 420
                          },
                          "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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\u001b[22m\n\n\n  418 |\n  419 |   test('shambhu ledger shows transfer rows', async ({ page }) => {\n> 420 |     await expect(page.locator('#transfers-list .ledger-row').first()).toBeVisible({ timeout: 10000 });\n      |                                                                       ^\n  421 |     const rowCount = await page.locator('#transfers-list .ledger-row').count();\n  422 |     expect(rowCount).toBeGreaterThan(0);\n  423 |   });\n    at /var/www/360lm/tests/fundcustodian.spec.js:420:71"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:54:56.632Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Tra-ab3ae--ledger-shows-transfer-rows-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Tra-ab3ae--ledger-shows-transfer-rows-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 71,
                        "line": 420
                      }
                    },
                    {
                      "workerIndex": 47,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 11908,
                      "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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:420:71",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 71,
                          "line": 420
                        },
                        "snippet": "  418 |\n  419 |   test('shambhu ledger shows transfer rows', async ({ page }) => {\n> 420 |     await expect(page.locator('#transfers-list .ledger-row').first()).toBeVisible({ timeout: 10000 });\n      |                                                                       ^\n  421 |     const rowCount = await page.locator('#transfers-list .ledger-row').count();\n  422 |     expect(rowCount).toBeGreaterThan(0);\n  423 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 71,
                            "line": 420
                          },
                          "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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\u001b[22m\n\n\n  418 |\n  419 |   test('shambhu ledger shows transfer rows', async ({ page }) => {\n> 420 |     await expect(page.locator('#transfers-list .ledger-row').first()).toBeVisible({ timeout: 10000 });\n      |                                                                       ^\n  421 |     const rowCount = await page.locator('#transfers-list .ledger-row').count();\n  422 |     expect(rowCount).toBeGreaterThan(0);\n  423 |   });\n    at /var/www/360lm/tests/fundcustodian.spec.js:420:71"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:55:12.380Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Tra-ab3ae--ledger-shows-transfer-rows-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Tra-ab3ae--ledger-shows-transfer-rows-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 71,
                        "line": 420
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-71d6b8b8ae9059fe8bf2",
              "file": "fundcustodian.spec.js",
              "line": 389,
              "column": 3
            },
            {
              "title": "status badges present in transfer rows",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 48,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 9656,
                      "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('#transfers-list .badge').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .badge').first()\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('#transfers-list .badge').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .badge').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:426:66",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 66,
                          "line": 426
                        },
                        "snippet": "  424 |\n  425 |   test('status badges present in transfer rows', async ({ page }) => {\n> 426 |     await expect(page.locator('#transfers-list .badge').first()).toBeVisible({ timeout: 8000 });\n      |                                                                  ^\n  427 |   });\n  428 |\n  429 |   test('switching to Advances tab shows advances panel', async ({ page }) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 66,
                            "line": 426
                          },
                          "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('#transfers-list .badge').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .badge').first()\u001b[22m\n\n\n  424 |\n  425 |   test('status badges present in transfer rows', async ({ page }) => {\n> 426 |     await expect(page.locator('#transfers-list .badge').first()).toBeVisible({ timeout: 8000 });\n      |                                                                  ^\n  427 |   });\n  428 |\n  429 |   test('switching to Advances tab shows advances panel', async ({ page }) => {\n    at /var/www/360lm/tests/fundcustodian.spec.js:426:66"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:55:27.778Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Tra-4b0cb-es-present-in-transfer-rows-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Tra-4b0cb-es-present-in-transfer-rows-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 66,
                        "line": 426
                      }
                    },
                    {
                      "workerIndex": 49,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 9097,
                      "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('#transfers-list .badge').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .badge').first()\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('#transfers-list .badge').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .badge').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:426:66",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 66,
                          "line": 426
                        },
                        "snippet": "  424 |\n  425 |   test('status badges present in transfer rows', async ({ page }) => {\n> 426 |     await expect(page.locator('#transfers-list .badge').first()).toBeVisible({ timeout: 8000 });\n      |                                                                  ^\n  427 |   });\n  428 |\n  429 |   test('switching to Advances tab shows advances panel', async ({ page }) => {"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 66,
                            "line": 426
                          },
                          "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('#transfers-list .badge').first()\nExpected: visible\nTimeout: 8000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 8000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .badge').first()\u001b[22m\n\n\n  424 |\n  425 |   test('status badges present in transfer rows', async ({ page }) => {\n> 426 |     await expect(page.locator('#transfers-list .badge').first()).toBeVisible({ timeout: 8000 });\n      |                                                                  ^\n  427 |   });\n  428 |\n  429 |   test('switching to Advances tab shows advances panel', async ({ page }) => {\n    at /var/www/360lm/tests/fundcustodian.spec.js:426:66"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:55:39.962Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Tra-4b0cb-es-present-in-transfer-rows-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Tra-4b0cb-es-present-in-transfer-rows-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 66,
                        "line": 426
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-335a7b8c0c60f9928824",
              "file": "fundcustodian.spec.js",
              "line": 395,
              "column": 3
            },
            {
              "title": "switching to Advances tab shows advances panel",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 50,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1846,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:55:50.856Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-2d71cb941d942a192eac",
              "file": "fundcustodian.spec.js",
              "line": 399,
              "column": 3
            },
            {
              "title": "no custodian filter for non-admin",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 50,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 942,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:55:52.984Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-07916bfb4aab00ca5be7",
              "file": "fundcustodian.spec.js",
              "line": 406,
              "column": 3
            }
          ]
        },
        {
          "title": "Ledger — admin (harish) with custodian filter",
          "file": "fundcustodian.spec.js",
          "line": 414,
          "column": 6,
          "specs": [
            {
              "title": "admin sees custodian filter dropdown",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 20,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 541,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:48:24.495Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-a59d920e2132ee7fefea",
              "file": "fundcustodian.spec.js",
              "line": 415,
              "column": 3
            },
            {
              "title": "admin sees custodian filter dropdown",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 50,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1214,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:55:53.989Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-c12a16483317dcc85e8c",
              "file": "fundcustodian.spec.js",
              "line": 415,
              "column": 3
            }
          ]
        },
        {
          "title": "Ledger — Advances tab data",
          "file": "fundcustodian.spec.js",
          "line": 430,
          "column": 6,
          "specs": [
            {
              "title": "advances show status badges (outstanding / partially_settled / settled)",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 20,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 10481,
                      "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('#advances-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').first()\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('#advances-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:436:70",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 70,
                          "line": 436
                        },
                        "snippet": "  434 |     await page.locator('#nav-ledger').click();\n  435 |     await page.locator('#tab-advances').click();\n> 436 |     await expect(page.locator('#advances-list .ledger-row').first()).toBeVisible({ timeout: 10000 });\n      |                                                                      ^\n  437 |     // Should see at least outstanding and partially_settled badges\n  438 |     const badges = await page.locator('#advances-list .badge').allTextContents();\n  439 |     const statuses = badges.join(' ');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 70,
                            "line": 436
                          },
                          "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('#advances-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').first()\u001b[22m\n\n\n  434 |     await page.locator('#nav-ledger').click();\n  435 |     await page.locator('#tab-advances').click();\n> 436 |     await expect(page.locator('#advances-list .ledger-row').first()).toBeVisible({ timeout: 10000 });\n      |                                                                      ^\n  437 |     // Should see at least outstanding and partially_settled badges\n  438 |     const badges = await page.locator('#advances-list .badge').allTextContents();\n  439 |     const statuses = badges.join(' ');\n    at /var/www/360lm/tests/fundcustodian.spec.js:436:70"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:48:25.066Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Adv-d5daa--partially-settled-settled--android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Adv-d5daa--partially-settled-settled--android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 70,
                        "line": 436
                      }
                    },
                    {
                      "workerIndex": 21,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 10681,
                      "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('#advances-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').first()\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('#advances-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:436:70",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 70,
                          "line": 436
                        },
                        "snippet": "  434 |     await page.locator('#nav-ledger').click();\n  435 |     await page.locator('#tab-advances').click();\n> 436 |     await expect(page.locator('#advances-list .ledger-row').first()).toBeVisible({ timeout: 10000 });\n      |                                                                      ^\n  437 |     // Should see at least outstanding and partially_settled badges\n  438 |     const badges = await page.locator('#advances-list .badge').allTextContents();\n  439 |     const statuses = badges.join(' ');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 70,
                            "line": 436
                          },
                          "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('#advances-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').first()\u001b[22m\n\n\n  434 |     await page.locator('#nav-ledger').click();\n  435 |     await page.locator('#tab-advances').click();\n> 436 |     await expect(page.locator('#advances-list .ledger-row').first()).toBeVisible({ timeout: 10000 });\n      |                                                                      ^\n  437 |     // Should see at least outstanding and partially_settled badges\n  438 |     const badges = await page.locator('#advances-list .badge').allTextContents();\n  439 |     const statuses = badges.join(' ');\n    at /var/www/360lm/tests/fundcustodian.spec.js:436:70"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:48:36.505Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Adv-d5daa--partially-settled-settled--android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Adv-d5daa--partially-settled-settled--android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 70,
                        "line": 436
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-bf6b30ae3c42f031b684",
              "file": "fundcustodian.spec.js",
              "line": 431,
              "column": 3
            },
            {
              "title": "partially settled advance shows outstanding amount",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 22,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 6101,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoContainText\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\nExpected substring: \u001b[32m\"1,500.00\"\u001b[39m\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toContainText\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoContainText\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\nExpected substring: \u001b[32m\"1,500.00\"\u001b[39m\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toContainText\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:451:27",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 27,
                          "line": 451
                        },
                        "snippet": "  449 |     await expect(page.locator('#ledger-cust-filter')).toBeVisible({ timeout: 8000 });\n  450 |     // Filter should have all custodians\n> 451 |     const options = await page.locator('#ledger-cust-sel option').allTextContents();\n      |                           ^\n  452 |     expect(options.some(o => o.includes('Pramod'))).toBe(true);\n  453 |     expect(options.some(o => o.includes('Shambhu'))).toBe(true);\n  454 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 27,
                            "line": 451
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoContainText\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\nExpected substring: \u001b[32m\"1,500.00\"\u001b[39m\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toContainText\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\u001b[22m\n\n\n  449 |     await expect(page.locator('#ledger-cust-filter')).toBeVisible({ timeout: 8000 });\n  450 |     // Filter should have all custodians\n> 451 |     const options = await page.locator('#ledger-cust-sel option').allTextContents();\n      |                           ^\n  452 |     expect(options.some(o => o.includes('Pramod'))).toBe(true);\n  453 |     expect(options.some(o => o.includes('Shambhu'))).toBe(true);\n  454 |   });\n    at /var/www/360lm/tests/fundcustodian.spec.js:451:27"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:48:48.406Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Adv-8f04d-ce-shows-outstanding-amount-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Adv-8f04d-ce-shows-outstanding-amount-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 27,
                        "line": 451
                      }
                    },
                    {
                      "workerIndex": 23,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 7819,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoContainText\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\nExpected substring: \u001b[32m\"1,500.00\"\u001b[39m\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toContainText\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoContainText\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\nExpected substring: \u001b[32m\"1,500.00\"\u001b[39m\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toContainText\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:451:27",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 27,
                          "line": 451
                        },
                        "snippet": "  449 |     await expect(page.locator('#ledger-cust-filter')).toBeVisible({ timeout: 8000 });\n  450 |     // Filter should have all custodians\n> 451 |     const options = await page.locator('#ledger-cust-sel option').allTextContents();\n      |                           ^\n  452 |     expect(options.some(o => o.includes('Pramod'))).toBe(true);\n  453 |     expect(options.some(o => o.includes('Shambhu'))).toBe(true);\n  454 |   });"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 27,
                            "line": 451
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoContainText\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\nExpected substring: \u001b[32m\"1,500.00\"\u001b[39m\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toContainText\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\u001b[22m\n\n\n  449 |     await expect(page.locator('#ledger-cust-filter')).toBeVisible({ timeout: 8000 });\n  450 |     // Filter should have all custodians\n> 451 |     const options = await page.locator('#ledger-cust-sel option').allTextContents();\n      |                           ^\n  452 |     expect(options.some(o => o.includes('Pramod'))).toBe(true);\n  453 |     expect(options.some(o => o.includes('Shambhu'))).toBe(true);\n  454 |   });\n    at /var/www/360lm/tests/fundcustodian.spec.js:451:27"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:48:56.515Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Adv-8f04d-ce-shows-outstanding-amount-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Adv-8f04d-ce-shows-outstanding-amount-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 27,
                        "line": 451
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-05263987a6087fa1405e",
              "file": "fundcustodian.spec.js",
              "line": 443,
              "column": 3
            },
            {
              "title": "advances show status badges (outstanding / partially_settled / settled)",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 50,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 11766,
                      "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('#advances-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').first()\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('#advances-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:466:70",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 70,
                          "line": 466
                        },
                        "snippet": "  464 |     await page.locator('#nav-ledger').click();\n  465 |     await page.locator('#tab-advances').click();\n> 466 |     await expect(page.locator('#advances-list .ledger-row').first()).toBeVisible({ timeout: 10000 });\n      |                                                                      ^\n  467 |     // Should see at least outstanding and partially_settled badges\n  468 |     const badges = await page.locator('#advances-list .badge').allTextContents();\n  469 |     const statuses = badges.join(' ');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 70,
                            "line": 466
                          },
                          "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('#advances-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').first()\u001b[22m\n\n\n  464 |     await page.locator('#nav-ledger').click();\n  465 |     await page.locator('#tab-advances').click();\n> 466 |     await expect(page.locator('#advances-list .ledger-row').first()).toBeVisible({ timeout: 10000 });\n      |                                                                      ^\n  467 |     // Should see at least outstanding and partially_settled badges\n  468 |     const badges = await page.locator('#advances-list .badge').allTextContents();\n  469 |     const statuses = badges.join(' ');\n    at /var/www/360lm/tests/fundcustodian.spec.js:466:70"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:55:55.305Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Adv-d5daa--partially-settled-settled--desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Adv-d5daa--partially-settled-settled--desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 70,
                        "line": 466
                      }
                    },
                    {
                      "workerIndex": 51,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 12889,
                      "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('#advances-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').first()\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('#advances-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:466:70",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 70,
                          "line": 466
                        },
                        "snippet": "  464 |     await page.locator('#nav-ledger').click();\n  465 |     await page.locator('#tab-advances').click();\n> 466 |     await expect(page.locator('#advances-list .ledger-row').first()).toBeVisible({ timeout: 10000 });\n      |                                                                      ^\n  467 |     // Should see at least outstanding and partially_settled badges\n  468 |     const badges = await page.locator('#advances-list .badge').allTextContents();\n  469 |     const statuses = badges.join(' ');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 70,
                            "line": 466
                          },
                          "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('#advances-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').first()\u001b[22m\n\n\n  464 |     await page.locator('#nav-ledger').click();\n  465 |     await page.locator('#tab-advances').click();\n> 466 |     await expect(page.locator('#advances-list .ledger-row').first()).toBeVisible({ timeout: 10000 });\n      |                                                                      ^\n  467 |     // Should see at least outstanding and partially_settled badges\n  468 |     const badges = await page.locator('#advances-list .badge').allTextContents();\n  469 |     const statuses = badges.join(' ');\n    at /var/www/360lm/tests/fundcustodian.spec.js:466:70"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:56:11.228Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Adv-d5daa--partially-settled-settled--desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Adv-d5daa--partially-settled-settled--desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 70,
                        "line": 466
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-fbe477291331dbb17c6e",
              "file": "fundcustodian.spec.js",
              "line": 431,
              "column": 3
            },
            {
              "title": "partially settled advance shows outstanding amount",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 52,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 10620,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoContainText\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\nExpected substring: \u001b[32m\"1,500.00\"\u001b[39m\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toContainText\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoContainText\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\nExpected substring: \u001b[32m\"1,500.00\"\u001b[39m\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toContainText\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:481:27",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 27,
                          "line": 481
                        },
                        "snippet": "  479 |     // A2: Sachin 2500 partially settled, outstanding 1500\n  480 |     const partRow = page.locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' });\n> 481 |     await expect(partRow).toContainText('1,500.00');\n      |                           ^\n  482 |   });\n  483 | });\n  484 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 27,
                            "line": 481
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoContainText\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\nExpected substring: \u001b[32m\"1,500.00\"\u001b[39m\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toContainText\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\u001b[22m\n\n\n  479 |     // A2: Sachin 2500 partially settled, outstanding 1500\n  480 |     const partRow = page.locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' });\n> 481 |     await expect(partRow).toContainText('1,500.00');\n      |                           ^\n  482 |   });\n  483 | });\n  484 |\n    at /var/www/360lm/tests/fundcustodian.spec.js:481:27"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:56:39.095Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Adv-8f04d-ce-shows-outstanding-amount-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Adv-8f04d-ce-shows-outstanding-amount-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 27,
                        "line": 481
                      }
                    },
                    {
                      "workerIndex": 53,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 9226,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoContainText\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\nExpected substring: \u001b[32m\"1,500.00\"\u001b[39m\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toContainText\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\u001b[22m\n",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoContainText\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\nExpected substring: \u001b[32m\"1,500.00\"\u001b[39m\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toContainText\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:481:27",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 27,
                          "line": 481
                        },
                        "snippet": "  479 |     // A2: Sachin 2500 partially settled, outstanding 1500\n  480 |     const partRow = page.locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' });\n> 481 |     await expect(partRow).toContainText('1,500.00');\n      |                           ^\n  482 |   });\n  483 | });\n  484 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 27,
                            "line": 481
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoContainText\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\nExpected substring: \u001b[32m\"1,500.00\"\u001b[39m\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toContainText\" with timeout 5000ms\u001b[22m\n\u001b[2m  - waiting for locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' })\u001b[22m\n\n\n  479 |     // A2: Sachin 2500 partially settled, outstanding 1500\n  480 |     const partRow = page.locator('#advances-list .ledger-row').filter({ hasText: 'Sachin' });\n> 481 |     await expect(partRow).toContainText('1,500.00');\n      |                           ^\n  482 |   });\n  483 | });\n  484 |\n    at /var/www/360lm/tests/fundcustodian.spec.js:481:27"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:57:00.183Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Adv-8f04d-ce-shows-outstanding-amount-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Ledger-—-Adv-8f04d-ce-shows-outstanding-amount-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 27,
                        "line": 481
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-0a704304aab8aaebf84a",
              "file": "fundcustodian.spec.js",
              "line": 443,
              "column": 3
            }
          ]
        },
        {
          "title": "Manage Custodians (admin only)",
          "file": "fundcustodian.spec.js",
          "line": 458,
          "column": 6,
          "specs": [
            {
              "title": "custodian list loads all 4 custodians",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 24,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 857,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:49:06.422Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-24a5ba9ed0bb01036ea0",
              "file": "fundcustodian.spec.js",
              "line": 468,
              "column": 3
            },
            {
              "title": "primary custodian shows ⭐ Primary badge",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 24,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 634,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:49:07.469Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-d0c9ca9097e82f4d314d",
              "file": "fundcustodian.spec.js",
              "line": 474,
              "column": 3
            },
            {
              "title": "add custodian form — empty ID shows error",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 24,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 720,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:49:08.144Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-39d6c9c5dd6eed803eb7",
              "file": "fundcustodian.spec.js",
              "line": 479,
              "column": 3
            },
            {
              "title": "add custodian form — empty name shows error",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 24,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 821,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:49:08.899Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-d10e902cdd4122cdb627",
              "file": "fundcustodian.spec.js",
              "line": 485,
              "column": 3
            },
            {
              "title": "back button returns to dashboard",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 24,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 890,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:49:09.740Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-0b06a2728ba51186727f",
              "file": "fundcustodian.spec.js",
              "line": 491,
              "column": 3
            },
            {
              "title": "non-admin cannot reach manage screen via nav",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 24,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1144,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:49:10.701Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-d2ff9d722362f27be951",
              "file": "fundcustodian.spec.js",
              "line": 496,
              "column": 3
            },
            {
              "title": "custodian list loads all 4 custodians",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 54,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 3344,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:57:17.950Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-93c2ee71dd3329528b9d",
              "file": "fundcustodian.spec.js",
              "line": 468,
              "column": 3
            },
            {
              "title": "primary custodian shows ⭐ Primary badge",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 54,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2610,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:57:22.332Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-53baee608415d70d0402",
              "file": "fundcustodian.spec.js",
              "line": 474,
              "column": 3
            },
            {
              "title": "add custodian form — empty ID shows error",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 54,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2998,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:57:25.093Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-af2638cfeeb8c5dda02e",
              "file": "fundcustodian.spec.js",
              "line": 479,
              "column": 3
            },
            {
              "title": "add custodian form — empty name shows error",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 54,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2969,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:57:28.288Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-297b829ff49d7f5eec1e",
              "file": "fundcustodian.spec.js",
              "line": 485,
              "column": 3
            },
            {
              "title": "back button returns to dashboard",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 54,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 3593,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:57:31.353Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-7e5e194816d8d75cc7d8",
              "file": "fundcustodian.spec.js",
              "line": 491,
              "column": 3
            },
            {
              "title": "non-admin cannot reach manage screen via nav",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 54,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 3644,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:57:35.089Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-96b51e50ce4e2d6578c7",
              "file": "fundcustodian.spec.js",
              "line": 496,
              "column": 3
            }
          ]
        },
        {
          "title": "Reject Transfer Modal",
          "file": "fundcustodian.spec.js",
          "line": 507,
          "column": 6,
          "specs": [
            {
              "title": "clicking reject button opens reject modal",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 24,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 10529,
                      "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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:511:55",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 55,
                          "line": 511
                        },
                        "snippet": "  509 |   test('add custodian form — empty ID shows error', async ({ page }) => {\n  510 |     await page.locator('#mc-name').fill('Test User');\n> 511 |     await page.locator('button', { hasText: 'Add Custodian' }).click();\n      |                                                       ^\n  512 |     await expect(page.locator('#toast')).toContainText('employee ID');\n  513 |   });\n  514 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 55,
                            "line": 511
                          },
                          "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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\u001b[22m\n\n\n  509 |   test('add custodian form — empty ID shows error', async ({ page }) => {\n  510 |     await page.locator('#mc-name').fill('Test User');\n> 511 |     await page.locator('button', { hasText: 'Add Custodian' }).click();\n      |                                                       ^\n  512 |     await expect(page.locator('#toast')).toContainText('employee ID');\n  513 |   });\n  514 |\n    at /var/www/360lm/tests/fundcustodian.spec.js:511:55"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:49:11.885Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Reject-Trans-537e3-t-button-opens-reject-modal-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Reject-Trans-537e3-t-button-opens-reject-modal-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 55,
                        "line": 511
                      }
                    },
                    {
                      "workerIndex": 25,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 10539,
                      "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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:511:55",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 55,
                          "line": 511
                        },
                        "snippet": "  509 |   test('add custodian form — empty ID shows error', async ({ page }) => {\n  510 |     await page.locator('#mc-name').fill('Test User');\n> 511 |     await page.locator('button', { hasText: 'Add Custodian' }).click();\n      |                                                       ^\n  512 |     await expect(page.locator('#toast')).toContainText('employee ID');\n  513 |   });\n  514 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 55,
                            "line": 511
                          },
                          "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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\u001b[22m\n\n\n  509 |   test('add custodian form — empty ID shows error', async ({ page }) => {\n  510 |     await page.locator('#mc-name').fill('Test User');\n> 511 |     await page.locator('button', { hasText: 'Add Custodian' }).click();\n      |                                                       ^\n  512 |     await expect(page.locator('#toast')).toContainText('employee ID');\n  513 |   });\n  514 |\n    at /var/www/360lm/tests/fundcustodian.spec.js:511:55"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:49:23.695Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Reject-Trans-537e3-t-button-opens-reject-modal-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Reject-Trans-537e3-t-button-opens-reject-modal-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 55,
                        "line": 511
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-c0f89785aa80f2dc2453",
              "file": "fundcustodian.spec.js",
              "line": 508,
              "column": 3
            },
            {
              "title": "cancel button closes reject modal",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 26,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 10565,
                      "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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:520:55",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 55,
                          "line": 520
                        },
                        "snippet": "  518 |     await expect(page.locator('#toast')).toContainText('name');\n  519 |   });\n> 520 |\n      | ^\n  521 |   test('back button returns to dashboard', async ({ page }) => {\n  522 |     await page.locator('button', { hasText: '← Back to Dashboard' }).dispatchEvent('click');\n  523 |     await expect(page.locator('#s-dash')).toHaveClass(/active/);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 55,
                            "line": 520
                          },
                          "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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\u001b[22m\n\n\n  518 |     await expect(page.locator('#toast')).toContainText('name');\n  519 |   });\n> 520 |\n      | ^\n  521 |   test('back button returns to dashboard', async ({ page }) => {\n  522 |     await page.locator('button', { hasText: '← Back to Dashboard' }).dispatchEvent('click');\n  523 |     await expect(page.locator('#s-dash')).toHaveClass(/active/);\n    at /var/www/360lm/tests/fundcustodian.spec.js:520:55"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:49:35.385Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Reject-Trans-9dcda--button-closes-reject-modal-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Reject-Trans-9dcda--button-closes-reject-modal-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 55,
                        "line": 520
                      }
                    },
                    {
                      "workerIndex": 27,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 10744,
                      "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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:520:55",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 55,
                          "line": 520
                        },
                        "snippet": "  518 |     await expect(page.locator('#toast')).toContainText('name');\n  519 |   });\n> 520 |\n      | ^\n  521 |   test('back button returns to dashboard', async ({ page }) => {\n  522 |     await page.locator('button', { hasText: '← Back to Dashboard' }).dispatchEvent('click');\n  523 |     await expect(page.locator('#s-dash')).toHaveClass(/active/);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 55,
                            "line": 520
                          },
                          "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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\u001b[22m\n\n\n  518 |     await expect(page.locator('#toast')).toContainText('name');\n  519 |   });\n> 520 |\n      | ^\n  521 |   test('back button returns to dashboard', async ({ page }) => {\n  522 |     await page.locator('button', { hasText: '← Back to Dashboard' }).dispatchEvent('click');\n  523 |     await expect(page.locator('#s-dash')).toHaveClass(/active/);\n    at /var/www/360lm/tests/fundcustodian.spec.js:520:55"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:49:47.533Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Reject-Trans-9dcda--button-closes-reject-modal-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Reject-Trans-9dcda--button-closes-reject-modal-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 55,
                        "line": 520
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-9f82e9d3279becc0f6d4",
              "file": "fundcustodian.spec.js",
              "line": 517,
              "column": 3
            },
            {
              "title": "clicking reject button opens reject modal",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 54,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 10791,
                      "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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:541:55",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 55,
                          "line": 541
                        },
                        "snippet": "  539 |     await injectSession(page, SESSION.harish);\n  540 |     await page.goto(BASE_URL);\n> 541 |     await expect(page.locator('.btn-reject').first()).toBeVisible({ timeout: 10000 });\n      |                                                       ^\n  542 |     await page.locator('.btn-reject').first().click();\n  543 |     await expect(page.locator('#reject-modal')).toHaveClass(/open/);\n  544 |     await expect(page.locator('.reject-sheet h3')).toContainText('Reject Transfer');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 55,
                            "line": 541
                          },
                          "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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\u001b[22m\n\n\n  539 |     await injectSession(page, SESSION.harish);\n  540 |     await page.goto(BASE_URL);\n> 541 |     await expect(page.locator('.btn-reject').first()).toBeVisible({ timeout: 10000 });\n      |                                                       ^\n  542 |     await page.locator('.btn-reject').first().click();\n  543 |     await expect(page.locator('#reject-modal')).toHaveClass(/open/);\n  544 |     await expect(page.locator('.reject-sheet h3')).toContainText('Reject Transfer');\n    at /var/www/360lm/tests/fundcustodian.spec.js:541:55"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:57:39.029Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Reject-Trans-537e3-t-button-opens-reject-modal-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Reject-Trans-537e3-t-button-opens-reject-modal-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 55,
                        "line": 541
                      }
                    },
                    {
                      "workerIndex": 55,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 11363,
                      "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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:541:55",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 55,
                          "line": 541
                        },
                        "snippet": "  539 |     await injectSession(page, SESSION.harish);\n  540 |     await page.goto(BASE_URL);\n> 541 |     await expect(page.locator('.btn-reject').first()).toBeVisible({ timeout: 10000 });\n      |                                                       ^\n  542 |     await page.locator('.btn-reject').first().click();\n  543 |     await expect(page.locator('#reject-modal')).toHaveClass(/open/);\n  544 |     await expect(page.locator('.reject-sheet h3')).toContainText('Reject Transfer');"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 55,
                            "line": 541
                          },
                          "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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\u001b[22m\n\n\n  539 |     await injectSession(page, SESSION.harish);\n  540 |     await page.goto(BASE_URL);\n> 541 |     await expect(page.locator('.btn-reject').first()).toBeVisible({ timeout: 10000 });\n      |                                                       ^\n  542 |     await page.locator('.btn-reject').first().click();\n  543 |     await expect(page.locator('#reject-modal')).toHaveClass(/open/);\n  544 |     await expect(page.locator('.reject-sheet h3')).toContainText('Reject Transfer');\n    at /var/www/360lm/tests/fundcustodian.spec.js:541:55"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:57:50.894Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Reject-Trans-537e3-t-button-opens-reject-modal-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Reject-Trans-537e3-t-button-opens-reject-modal-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 55,
                        "line": 541
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-17feaf856c6481abb7a8",
              "file": "fundcustodian.spec.js",
              "line": 508,
              "column": 3
            },
            {
              "title": "cancel button closes reject modal",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 56,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 11113,
                      "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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:550:55",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 55,
                          "line": 550
                        },
                        "snippet": "  548 |     await injectSession(page, SESSION.harish);\n  549 |     await page.goto(BASE_URL);\n> 550 |     await expect(page.locator('.btn-reject').first()).toBeVisible({ timeout: 10000 });\n      |                                                       ^\n  551 |     await page.locator('.btn-reject').first().click();\n  552 |     await page.locator('.reject-btns .btn-s').click();\n  553 |     await expect(page.locator('#reject-modal')).not.toHaveClass(/open/);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 55,
                            "line": 550
                          },
                          "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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\u001b[22m\n\n\n  548 |     await injectSession(page, SESSION.harish);\n  549 |     await page.goto(BASE_URL);\n> 550 |     await expect(page.locator('.btn-reject').first()).toBeVisible({ timeout: 10000 });\n      |                                                       ^\n  551 |     await page.locator('.btn-reject').first().click();\n  552 |     await page.locator('.reject-btns .btn-s').click();\n  553 |     await expect(page.locator('#reject-modal')).not.toHaveClass(/open/);\n    at /var/www/360lm/tests/fundcustodian.spec.js:550:55"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:58:06.662Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Reject-Trans-9dcda--button-closes-reject-modal-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Reject-Trans-9dcda--button-closes-reject-modal-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 55,
                        "line": 550
                      }
                    },
                    {
                      "workerIndex": 57,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 11251,
                      "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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:550:55",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 55,
                          "line": 550
                        },
                        "snippet": "  548 |     await injectSession(page, SESSION.harish);\n  549 |     await page.goto(BASE_URL);\n> 550 |     await expect(page.locator('.btn-reject').first()).toBeVisible({ timeout: 10000 });\n      |                                                       ^\n  551 |     await page.locator('.btn-reject').first().click();\n  552 |     await page.locator('.reject-btns .btn-s').click();\n  553 |     await expect(page.locator('#reject-modal')).not.toHaveClass(/open/);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 55,
                            "line": 550
                          },
                          "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('.btn-reject').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('.btn-reject').first()\u001b[22m\n\n\n  548 |     await injectSession(page, SESSION.harish);\n  549 |     await page.goto(BASE_URL);\n> 550 |     await expect(page.locator('.btn-reject').first()).toBeVisible({ timeout: 10000 });\n      |                                                       ^\n  551 |     await page.locator('.btn-reject').first().click();\n  552 |     await page.locator('.reject-btns .btn-s').click();\n  553 |     await expect(page.locator('#reject-modal')).not.toHaveClass(/open/);\n    at /var/www/360lm/tests/fundcustodian.spec.js:550:55"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:58:20.489Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Reject-Trans-9dcda--button-closes-reject-modal-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Reject-Trans-9dcda--button-closes-reject-modal-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 55,
                        "line": 550
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-21e56049a73a4b288c61",
              "file": "fundcustodian.spec.js",
              "line": 517,
              "column": 3
            }
          ]
        },
        {
          "title": "Bottom Navigation",
          "file": "fundcustodian.spec.js",
          "line": 530,
          "column": 6,
          "specs": [
            {
              "title": "nav → Transfer shows transfer screen",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 28,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 906,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:49:59.553Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-1fe5c51479cb627e6017",
              "file": "fundcustodian.spec.js",
              "line": 537,
              "column": 3
            },
            {
              "title": "nav → Advance shows advance screen",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 28,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2423,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:50:00.671Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-d6cf3c3e21a7d3674ed1",
              "file": "fundcustodian.spec.js",
              "line": 544,
              "column": 3
            },
            {
              "title": "nav → Ledger shows ledger screen",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 28,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1213,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:50:03.156Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-b6162d87517fdb5f7f64",
              "file": "fundcustodian.spec.js",
              "line": 550,
              "column": 3
            },
            {
              "title": "nav → Dashboard returns home",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 28,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1456,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:50:04.541Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-551b6bf70781ebd5731f",
              "file": "fundcustodian.spec.js",
              "line": 556,
              "column": 3
            },
            {
              "title": "Hub button is visible on every screen",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 28,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1462,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:50:06.137Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-db2bab9ebcfa601ddfc3",
              "file": "fundcustodian.spec.js",
              "line": 563,
              "column": 3
            },
            {
              "title": "nav → Transfer shows transfer screen",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 58,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1422,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:58:34.194Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-1403f351436cbb8d6daa",
              "file": "fundcustodian.spec.js",
              "line": 537,
              "column": 3
            },
            {
              "title": "nav → Advance shows advance screen",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 58,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1919,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:58:36.353Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-efea879496cabf15649a",
              "file": "fundcustodian.spec.js",
              "line": 544,
              "column": 3
            },
            {
              "title": "nav → Ledger shows ledger screen",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 58,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1845,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:58:38.389Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-567dd23c0791430f34c0",
              "file": "fundcustodian.spec.js",
              "line": 550,
              "column": 3
            },
            {
              "title": "nav → Dashboard returns home",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 58,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2086,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:58:40.372Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-e4a4288e8881ff9d44df",
              "file": "fundcustodian.spec.js",
              "line": 556,
              "column": 3
            },
            {
              "title": "Hub button is visible on every screen",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 58,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1618,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:58:42.608Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "1caa50027b536c34a40f-df6b398b147755b5374a",
              "file": "fundcustodian.spec.js",
              "line": 563,
              "column": 3
            }
          ]
        },
        {
          "title": "Status Badge Rendering",
          "file": "fundcustodian.spec.js",
          "line": 574,
          "column": 6,
          "specs": [
            {
              "title": "admin ledger shows all expected transfer statuses",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 28,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 10783,
                      "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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:579:71",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 71,
                          "line": 579
                        },
                        "snippet": "  577 |     await expect(page.locator('#nav-advance')).toHaveClass(/active/);\n  578 |   });\n> 579 |\n      | ^\n  580 |   test('nav → Ledger shows ledger screen', async ({ page }) => {\n  581 |     await page.locator('#nav-ledger').click();\n  582 |     await expect(page.locator('#s-ledger')).toHaveClass(/active/);"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 71,
                            "line": 579
                          },
                          "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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\u001b[22m\n\n\n  577 |     await expect(page.locator('#nav-advance')).toHaveClass(/active/);\n  578 |   });\n> 579 |\n      | ^\n  580 |   test('nav → Ledger shows ledger screen', async ({ page }) => {\n  581 |     await page.locator('#nav-ledger').click();\n  582 |     await expect(page.locator('#s-ledger')).toHaveClass(/active/);\n    at /var/www/360lm/tests/fundcustodian.spec.js:579:71"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:50:07.692Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Status-Badge-a6816--expected-transfer-statuses-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Status-Badge-a6816--expected-transfer-statuses-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 71,
                        "line": 579
                      }
                    },
                    {
                      "workerIndex": 29,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 12668,
                      "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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:609:71",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 71,
                          "line": 609
                        },
                        "snippet": "  607 |     await page.goto(BASE_URL);\n  608 |     await page.locator('#nav-ledger').click();\n> 609 |     await expect(page.locator('#transfers-list .ledger-row').first()).toBeVisible({ timeout: 10000 });\n      |                                                                       ^\n  610 |     const badgeTexts = await page.locator('#transfers-list .badge').allTextContents();\n  611 |     const flattened = badgeTexts.join(' ');\n  612 |     // Test data includes all statuses across the full ledger"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 71,
                            "line": 609
                          },
                          "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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\u001b[22m\n\n\n  607 |     await page.goto(BASE_URL);\n  608 |     await page.locator('#nav-ledger').click();\n> 609 |     await expect(page.locator('#transfers-list .ledger-row').first()).toBeVisible({ timeout: 10000 });\n      |                                                                       ^\n  610 |     const badgeTexts = await page.locator('#transfers-list .badge').allTextContents();\n  611 |     const flattened = badgeTexts.join(' ');\n  612 |     // Test data includes all statuses across the full ledger\n    at /var/www/360lm/tests/fundcustodian.spec.js:609:71"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:50:21.436Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Status-Badge-a6816--expected-transfer-statuses-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Status-Badge-a6816--expected-transfer-statuses-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 71,
                        "line": 609
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-23285101eada7bb8d05b",
              "file": "fundcustodian.spec.js",
              "line": 575,
              "column": 3
            },
            {
              "title": "admin ledger shows all expected transfer statuses",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 58,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 11735,
                      "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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:609:71",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 71,
                          "line": 609
                        },
                        "snippet": "  607 |     await page.goto(BASE_URL);\n  608 |     await page.locator('#nav-ledger').click();\n> 609 |     await expect(page.locator('#transfers-list .ledger-row').first()).toBeVisible({ timeout: 10000 });\n      |                                                                       ^\n  610 |     const badgeTexts = await page.locator('#transfers-list .badge').allTextContents();\n  611 |     const flattened = badgeTexts.join(' ');\n  612 |     // Test data includes all statuses across the full ledger"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 71,
                            "line": 609
                          },
                          "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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\u001b[22m\n\n\n  607 |     await page.goto(BASE_URL);\n  608 |     await page.locator('#nav-ledger').click();\n> 609 |     await expect(page.locator('#transfers-list .ledger-row').first()).toBeVisible({ timeout: 10000 });\n      |                                                                       ^\n  610 |     const badgeTexts = await page.locator('#transfers-list .badge').allTextContents();\n  611 |     const flattened = badgeTexts.join(' ');\n  612 |     // Test data includes all statuses across the full ledger\n    at /var/www/360lm/tests/fundcustodian.spec.js:609:71"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-05-29T05:58:44.250Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Status-Badge-a6816--expected-transfer-statuses-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Status-Badge-a6816--expected-transfer-statuses-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 71,
                        "line": 609
                      }
                    },
                    {
                      "workerIndex": 59,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 11165,
                      "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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\u001b[22m\n\n    at /var/www/360lm/tests/fundcustodian.spec.js:609:71",
                        "location": {
                          "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                          "column": 71,
                          "line": 609
                        },
                        "snippet": "  607 |     await page.goto(BASE_URL);\n  608 |     await page.locator('#nav-ledger').click();\n> 609 |     await expect(page.locator('#transfers-list .ledger-row').first()).toBeVisible({ timeout: 10000 });\n      |                                                                       ^\n  610 |     const badgeTexts = await page.locator('#transfers-list .badge').allTextContents();\n  611 |     const flattened = badgeTexts.join(' ');\n  612 |     // Test data includes all statuses across the full ledger"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                            "column": 71,
                            "line": 609
                          },
                          "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('#transfers-list .ledger-row').first()\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 10000ms\u001b[22m\n\u001b[2m  - waiting for locator('#transfers-list .ledger-row').first()\u001b[22m\n\n\n  607 |     await page.goto(BASE_URL);\n  608 |     await page.locator('#nav-ledger').click();\n> 609 |     await expect(page.locator('#transfers-list .ledger-row').first()).toBeVisible({ timeout: 10000 });\n      |                                                                       ^\n  610 |     const badgeTexts = await page.locator('#transfers-list .badge').allTextContents();\n  611 |     const flattened = badgeTexts.join(' ');\n  612 |     // Test data includes all statuses across the full ledger\n    at /var/www/360lm/tests/fundcustodian.spec.js:609:71"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-05-29T05:58:57.957Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/fundcustodian-Status-Badge-a6816--expected-transfer-statuses-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/fundcustodian-Status-Badge-a6816--expected-transfer-statuses-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/fundcustodian.spec.js",
                        "column": 71,
                        "line": 609
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "1caa50027b536c34a40f-6d6b62b2b820568852bd",
              "file": "fundcustodian.spec.js",
              "line": 575,
              "column": 3
            }
          ]
        }
      ]
    }
  ],
  "errors": [],
  "stats": {
    "startTime": "2026-05-29T05:45:07.854Z",
    "duration": 841959.305,
    "expected": 138,
    "skipped": 0,
    "unexpected": 30,
    "flaky": 0
  }
}
