{
  "config": {
    "configFile": "/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/playwright.config.ts",
    "rootDir": "/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real",
    "forbidOnly": false,
    "fullyParallel": false,
    "globalSetup": null,
    "globalTeardown": null,
    "globalTimeout": 0,
    "grep": {},
    "grepInvert": null,
    "maxFailures": 0,
    "metadata": {
      "actualWorkers": 1
    },
    "preserveOutput": "always",
    "projects": [
      {
        "outputDir": "/Users/rvanvuren/Projects/alqove-web/.cache/scheduling-qa/E2E-bb6168a707df86d4/test-results",
        "repeatEach": 1,
        "retries": 0,
        "metadata": {
          "actualWorkers": 1
        },
        "id": "",
        "name": "",
        "testDir": "/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real",
        "testIgnore": [],
        "testMatch": [
          "/.*\\.spec\\.ts$/"
        ],
        "timeout": 90000
      }
    ],
    "quiet": false,
    "reporter": [
      [
        "list",
        null
      ],
      [
        "json",
        {
          "outputFile": "/Users/rvanvuren/Projects/alqove-web/.cache/scheduling-qa/E2E-bb6168a707df86d4/results.json"
        }
      ]
    ],
    "reportSlowTests": {
      "max": 5,
      "threshold": 300000
    },
    "shard": null,
    "tags": [],
    "updateSnapshots": "missing",
    "updateSourceMethod": "patch",
    "version": "1.60.0",
    "workers": 1,
    "webServer": null
  },
  "suites": [
    {
      "title": "00-auth.spec.ts",
      "file": "00-auth.spec.ts",
      "column": 0,
      "line": 0,
      "specs": [
        {
          "title": "real login resolves manager membership and selected-store boundary",
          "ok": true,
          "tags": [],
          "tests": [
            {
              "timeout": 90000,
              "annotations": [],
              "expectedStatus": "passed",
              "projectId": "",
              "projectName": "",
              "results": [
                {
                  "workerIndex": 0,
                  "parallelIndex": 0,
                  "status": "passed",
                  "duration": 4691,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-09-06T19:12:11.234Z",
                  "annotations": [],
                  "attachments": [
                    {
                      "name": "auth-switcher",
                      "contentType": "application/json",
                      "body": "ewogICJhY3RvciI6ICJtYW5hZ2VyIiwKICAic3RvcmUiOiAiZjU5MmVkMjEtMDRmNy0zNDYwLTkyMTAtYmU5ZWMyNDg4NDU3IiwKICAicGVyc2lzdGVkIjogdHJ1ZQp9"
                    }
                  ]
                }
              ],
              "status": "expected"
            }
          ],
          "id": "4be2244f332125737752-c9fef29bc065cb250ca6",
          "file": "00-auth.spec.ts",
          "line": 3,
          "column": 5
        }
      ]
    },
    {
      "title": "10-schedule-api.spec.ts",
      "file": "10-schedule-api.spec.ts",
      "column": 0,
      "line": 0,
      "specs": [
        {
          "title": "real API enforces stale revisions, tenant child IDs, and DST copy preview/commit",
          "ok": true,
          "tags": [],
          "tests": [
            {
              "timeout": 90000,
              "annotations": [],
              "expectedStatus": "passed",
              "projectId": "",
              "projectName": "",
              "results": [
                {
                  "workerIndex": 0,
                  "parallelIndex": 0,
                  "status": "passed",
                  "duration": 491,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-09-06T19:12:16.113Z",
                  "annotations": [],
                  "attachments": [
                    {
                      "name": "dst-revision-tenancy",
                      "contentType": "application/json",
                      "body": "ewogICJvcmlnaW5hbCI6IHsKICAgICJpZCI6ICJlMTE2YmViMC0zNGM5LTQyNGYtYTJmMy0yNGE5NGE2MzU5ZmMiLAogICAgInN0b3JlX2lkIjogIjY1YmVmOWE2LTRlZjItM2NhNS1iNDMyLTRjNWQzNzhlM2FjMiIsCiAgICAic3RvcmVfbWVtYmVyc2hpcF9pZCI6ICI4N2ZiYTAxYy1lZjc0LTM0NjMtYjQ1OS0wZWRhMDUyMzViNjkiLAogICAgIm1lbWJlcl9uYW1lIjogIkUyRS1iYjYxNjhhNzA3ZGY4NmQ0IFN0YWZmIiwKICAgICJwb3NpdGlvbl9pZCI6IG51bGwsCiAgICAicG9zaXRpb25fbmFtZSI6IG51bGwsCiAgICAic3RhcnRzX2F0IjogIjIwMjYtMDMtMDJUMTc6MDA6MDAuMDAwMDAwWiIsCiAgICAiZW5kc19hdCI6ICIyMDI2LTAzLTAzVDAxOjAwOjAwLjAwMDAwMFoiLAogICAgIm5vdGVzIjogIkUyRS1iYjYxNjhhNzA3ZGY4NmQ0IERTVCBzb3VyY2UiLAogICAgInB1Ymxpc2hlZF9hdCI6IG51bGwsCiAgICAicmV2aXNpb24iOiAiMjAyNi0wOS0wNlQxOToxMjoxNi4xNDIzMjNaIgogIH0sCiAgInVwZGF0ZWQiOiB7CiAgICAiaWQiOiAiZTExNmJlYjAtMzRjOS00MjRmLWEyZjMtMjRhOTRhNjM1OWZjIiwKICAgICJzdG9yZV9pZCI6ICI2NWJlZjlhNi00ZWYyLTNjYTUtYjQzMi00YzVkMzc4ZTNhYzIiLAogICAgInN0b3JlX21lbWJlcnNoaXBfaWQiOiAiODdmYmEwMWMtZWY3NC0zNDYzLWI0NTktMGVkYTA1MjM1YjY5IiwKICAgICJtZW1iZXJfbmFtZSI6ICJFMkUtYmI2MTY4YTcwN2RmODZkNCBTdGFmZiIsCiAgICAicG9zaXRpb25faWQiOiBudWxsLAogICAgInBvc2l0aW9uX25hbWUiOiBudWxsLAogICAgInN0YXJ0c19hdCI6ICIyMDI2LTAzLTAyVDE3OjAwOjAwLjAwMDAwMFoiLAogICAgImVuZHNfYXQiOiAiMjAyNi0wMy0wM1QwMTowMDowMC4wMDAwMDBaIiwKICAgICJub3RlcyI6ICJFMkUtYmI2MTY4YTcwN2RmODZkNCBlZGl0ZWQiLAogICAgInB1Ymxpc2hlZF9hdCI6IG51bGwsCiAgICAicmV2aXNpb24iOiAiMjAyNi0wOS0wNlQxOToxMjoxNi4xOTg2NjNaIgogIH0sCiAgImNvcGllZCI6IHsKICAgICJ3ZWVrX3N0YXJ0IjogIjIwMjYtMDMtMDkiLAogICAgInN0YXJ0c19hdCI6ICIyMDI2LTAzLTA5VDA3OjAwOjAwLjAwMDAwMFoiLAogICAgImVuZHNfYXQiOiAiMjAyNi0wMy0xNlQwNzowMDowMC4wMDAwMDBaIiwKICAgICJ0aW1lem9uZSI6ICJBbWVyaWNhL0xvc19BbmdlbGVzIiwKICAgICJzaGlmdHMiOiBbCiAgICAgIHsKICAgICAgICAiaWQiOiAiMWFmMGNlYjMtNjVmMy00YWE0LWFhYjctZjQwYjNjNjc4NmFhIiwKICAgICAgICAic3RvcmVfaWQiOiAiNjViZWY5YTYtNGVmMi0zY2E1LWI0MzItNGM1ZDM3OGUzYWMyIiwKICAgICAgICAic3RvcmVfbWVtYmVyc2hpcF9pZCI6ICI4N2ZiYTAxYy1lZjc0LTM0NjMtYjQ1OS0wZWRhMDUyMzViNjkiLAogICAgICAgICJtZW1iZXJfbmFtZSI6ICJFMkUtYmI2MTY4YTcwN2RmODZkNCBTdGFmZiIsCiAgICAgICAgInBvc2l0aW9uX2lkIjogbnVsbCwKICAgICAgICAicG9zaXRpb25fbmFtZSI6IG51bGwsCiAgICAgICAgInN0YXJ0c19hdCI6ICIyMDI2LTAzLTA5VDE2OjAwOjAwLjAwMDAwMFoiLAogICAgICAgICJlbmRzX2F0IjogIjIwMjYtMDMtMTBUMDA6MDA6MDAuMDAwMDAwWiIsCiAgICAgICAgIm5vdGVzIjogIkUyRS1iYjYxNjhhNzA3ZGY4NmQ0IGVkaXRlZCIsCiAgICAgICAgInB1Ymxpc2hlZF9hdCI6IG51bGwsCiAgICAgICAgInJldmlzaW9uIjogIjIwMjYtMDktMDZUMTk6MTI6MTYuMzgwNzM2WiIKICAgICAgfQogICAgXSwKICAgICJwdWJsaWNhdGlvbiI6IG51bGwKICB9LAogICJzcWwiOiBbCiAgICB7CiAgICAgICJpZCI6ICJlMTE2YmViMC0zNGM5LTQyNGYtYTJmMy0yNGE5NGE2MzU5ZmMiLAogICAgICAic3RvcmVfaWQiOiAiNjViZWY5YTYtNGVmMi0zY2E1LWI0MzItNGM1ZDM3OGUzYWMyIiwKICAgICAgInN0b3JlX21lbWJlcnNoaXBfaWQiOiAiODdmYmEwMWMtZWY3NC0zNDYzLWI0NTktMGVkYTA1MjM1YjY5IiwKICAgICAgInBvc2l0aW9uX2lkIjogbnVsbCwKICAgICAgInN0YXJ0c19hdCI6ICIyMDI2LTAzLTAyIDE3OjAwOjAwLjAwMDAwMCIsCiAgICAgICJlbmRzX2F0IjogIjIwMjYtMDMtMDMgMDE6MDA6MDAuMDAwMDAwIiwKICAgICAgIm5vdGVzIjogIkUyRS1iYjYxNjhhNzA3ZGY4NmQ0IGVkaXRlZCIsCiAgICAgICJwdWJsaXNoZWRfYXQiOiBudWxsLAogICAgICAicHVibGlzaGVkX2J5IjogbnVsbCwKICAgICAgImNyZWF0ZWRfYnkiOiAiZDY2YTNhMzItM2U3Ni0zOTUxLWIxM2UtZTIyYzIxYzA4MWJlIiwKICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyNi0wOS0wNiAxOToxMjoxNi4xNDIzMjMiLAogICAgICAidXBkYXRlZF9hdCI6ICIyMDI2LTA5LTA2IDE5OjEyOjE2LjE5ODY2MyIsCiAgICAgICJkZWxldGVkX2F0IjogbnVsbAogICAgfSwKICAgIHsKICAgICAgImlkIjogIjFhZjBjZWIzLTY1ZjMtNGFhNC1hYWI3LWY0MGIzYzY3ODZhYSIsCiAgICAgICJzdG9yZV9pZCI6ICI2NWJlZjlhNi00ZWYyLTNjYTUtYjQzMi00YzVkMzc4ZTNhYzIiLAogICAgICAic3RvcmVfbWVtYmVyc2hpcF9pZCI6ICI4N2ZiYTAxYy1lZjc0LTM0NjMtYjQ1OS0wZWRhMDUyMzViNjkiLAogICAgICAicG9zaXRpb25faWQiOiBudWxsLAogICAgICAic3RhcnRzX2F0IjogIjIwMjYtMDMtMDkgMTY6MDA6MDAuMDAwMDAwIiwKICAgICAgImVuZHNfYXQiOiAiMjAyNi0wMy0xMCAwMDowMDowMC4wMDAwMDAiLAogICAgICAibm90ZXMiOiAiRTJFLWJiNjE2OGE3MDdkZjg2ZDQgZWRpdGVkIiwKICAgICAgInB1Ymxpc2hlZF9hdCI6IG51bGwsCiAgICAgICJwdWJsaXNoZWRfYnkiOiBudWxsLAogICAgICAiY3JlYXRlZF9ieSI6ICI1ZTZkNmVkYy1hOGJhLTMzYWUtOTlkNi1lNWY0YmE5YWFjZTMiLAogICAgICAiY3JlYXRlZF9hdCI6ICIyMDI2LTA5LTA2IDE5OjEyOjE2LjM4MDczNiIsCiAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjYtMDktMDYgMTk6MTI6MTYuMzgwNzM2IiwKICAgICAgImRlbGV0ZWRfYXQiOiBudWxsCiAgICB9CiAgXQp9"
                    }
                  ]
                }
              ],
              "status": "expected"
            }
          ],
          "id": "c3074283c2bde52fc5f0-fa47491c20bb0435a9a7",
          "file": "10-schedule-api.spec.ts",
          "line": 3,
          "column": 5
        }
      ]
    },
    {
      "title": "20-schedule-browser.spec.ts",
      "file": "20-schedule-browser.spec.ts",
      "column": 0,
      "line": 0,
      "specs": [
        {
          "title": "owner creates assigned/open drafts, publishes, edits, copies and switches tenants using real UI",
          "ok": false,
          "tags": [],
          "tests": [
            {
              "timeout": 90000,
              "annotations": [],
              "expectedStatus": "passed",
              "projectId": "",
              "projectName": "",
              "results": [
                {
                  "workerIndex": 0,
                  "parallelIndex": 0,
                  "status": "failed",
                  "duration": 24294,
                  "error": {
                    "message": "TimeoutError: locator.selectOption: Timeout 20000ms exceeded.\nCall log:\n\u001b[2m  - waiting for getByRole('dialog').getByLabel('Employee', { exact: true })\u001b[22m\n",
                    "stack": "TimeoutError: locator.selectOption: Timeout 20000ms exceeded.\nCall log:\n\u001b[2m  - waiting for getByRole('dialog').getByLabel('Employee', { exact: true })\u001b[22m\n\n    at /Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/20-schedule-browser.spec.ts:13:58",
                    "location": {
                      "file": "/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/20-schedule-browser.spec.ts",
                      "column": 58,
                      "line": 13
                    },
                    "snippet": "  11 |     await page.getByRole('button', { name: 'Add shift', exact: true }).click();\n  12 |     const dialog = page.getByRole('dialog');\n> 13 |     await dialog.getByLabel('Employee', { exact: true }).selectOption(membership);\n     |                                                          ^\n  14 |     await dialog.getByLabel('Starts (store time)', { exact: true }).fill(`${day}T09:00`);\n  15 |     await dialog.getByLabel('Ends (store time)', { exact: true }).fill(`${day}T17:00`);\n  16 |     await dialog.getByLabel('Notes', { exact: true }).fill(notes);"
                  },
                  "errors": [
                    {
                      "location": {
                        "file": "/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/20-schedule-browser.spec.ts",
                        "column": 58,
                        "line": 13
                      },
                      "message": "TimeoutError: locator.selectOption: Timeout 20000ms exceeded.\nCall log:\n\u001b[2m  - waiting for getByRole('dialog').getByLabel('Employee', { exact: true })\u001b[22m\n\n\n  11 |     await page.getByRole('button', { name: 'Add shift', exact: true }).click();\n  12 |     const dialog = page.getByRole('dialog');\n> 13 |     await dialog.getByLabel('Employee', { exact: true }).selectOption(membership);\n     |                                                          ^\n  14 |     await dialog.getByLabel('Starts (store time)', { exact: true }).fill(`${day}T09:00`);\n  15 |     await dialog.getByLabel('Ends (store time)', { exact: true }).fill(`${day}T17:00`);\n  16 |     await dialog.getByLabel('Notes', { exact: true }).fill(notes);\n    at /Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/20-schedule-browser.spec.ts:13:58"
                    }
                  ],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-09-06T19:12:16.610Z",
                  "annotations": [],
                  "attachments": [
                    {
                      "name": "screenshot",
                      "contentType": "image/png",
                      "path": "/Users/rvanvuren/Projects/alqove-web/.cache/scheduling-qa/E2E-bb6168a707df86d4/test-results/20-schedule-browser-owner--dccd3-tches-tenants-using-real-UI/test-failed-1.png"
                    },
                    {
                      "name": "error-context",
                      "contentType": "text/markdown",
                      "path": "/Users/rvanvuren/Projects/alqove-web/.cache/scheduling-qa/E2E-bb6168a707df86d4/test-results/20-schedule-browser-owner--dccd3-tches-tenants-using-real-UI/error-context.md"
                    },
                    {
                      "name": "trace",
                      "contentType": "application/zip",
                      "path": "/Users/rvanvuren/Projects/alqove-web/.cache/scheduling-qa/E2E-bb6168a707df86d4/test-results/20-schedule-browser-owner--dccd3-tches-tenants-using-real-UI/trace.zip"
                    }
                  ],
                  "errorLocation": {
                    "file": "/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/20-schedule-browser.spec.ts",
                    "column": 58,
                    "line": 13
                  }
                }
              ],
              "status": "unexpected"
            }
          ],
          "id": "c6a1cb2133d4d2733fcf-68c4f0b40260b9ce6e19",
          "file": "20-schedule-browser.spec.ts",
          "line": 3,
          "column": 5
        },
        {
          "title": "staff browser excludes drafts, refreshes published own/team view and switches stores",
          "ok": false,
          "tags": [],
          "tests": [
            {
              "timeout": 90000,
              "annotations": [],
              "expectedStatus": "passed",
              "projectId": "",
              "projectName": "",
              "results": [
                {
                  "workerIndex": 1,
                  "parallelIndex": 0,
                  "status": "failed",
                  "duration": 20977,
                  "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: getByRole('combobox', { name: 'Store', exact: true })\nExpected: visible\nTimeout: 20000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 20000ms\u001b[22m\n\u001b[2m  - waiting for getByRole('combobox', { name: 'Store', exact: true })\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: getByRole('combobox', { name: 'Store', exact: true })\nExpected: visible\nTimeout: 20000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 20000ms\u001b[22m\n\u001b[2m  - waiting for getByRole('combobox', { name: 'Store', exact: true })\u001b[22m\n\n    at login (/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/helpers.ts:32:26)\n    at /Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/20-schedule-browser.spec.ts:63:3",
                    "location": {
                      "file": "/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/helpers.ts",
                      "column": 26,
                      "line": 32
                    },
                    "snippet": "   at helpers.ts:32\n\n  30 |   await page.goto(target);\n  31 |   const selector = page.getByRole('combobox', { name: 'Store', exact: true });\n> 32 |   await expect(selector).toBeVisible();\n     |                          ^\n  33 |   await selector.selectOption(fixture.stores[store].id);\n  34 | }\n  35 |"
                  },
                  "errors": [
                    {
                      "location": {
                        "file": "/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/helpers.ts",
                        "column": 26,
                        "line": 32
                      },
                      "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: getByRole('combobox', { name: 'Store', exact: true })\nExpected: visible\nTimeout: 20000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 20000ms\u001b[22m\n\u001b[2m  - waiting for getByRole('combobox', { name: 'Store', exact: true })\u001b[22m\n\n\n   at helpers.ts:32\n\n  30 |   await page.goto(target);\n  31 |   const selector = page.getByRole('combobox', { name: 'Store', exact: true });\n> 32 |   await expect(selector).toBeVisible();\n     |                          ^\n  33 |   await selector.selectOption(fixture.stores[store].id);\n  34 | }\n  35 |\n    at login (/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/helpers.ts:32:26)\n    at /Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/20-schedule-browser.spec.ts:63:3"
                    }
                  ],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-09-06T19:12:41.237Z",
                  "annotations": [],
                  "attachments": [
                    {
                      "name": "screenshot",
                      "contentType": "image/png",
                      "path": "/Users/rvanvuren/Projects/alqove-web/.cache/scheduling-qa/E2E-bb6168a707df86d4/test-results/20-schedule-browser-staff--8e787-am-view-and-switches-stores/test-failed-1.png"
                    },
                    {
                      "name": "error-context",
                      "contentType": "text/markdown",
                      "path": "/Users/rvanvuren/Projects/alqove-web/.cache/scheduling-qa/E2E-bb6168a707df86d4/test-results/20-schedule-browser-staff--8e787-am-view-and-switches-stores/error-context.md"
                    },
                    {
                      "name": "trace",
                      "contentType": "application/zip",
                      "path": "/Users/rvanvuren/Projects/alqove-web/.cache/scheduling-qa/E2E-bb6168a707df86d4/test-results/20-schedule-browser-staff--8e787-am-view-and-switches-stores/trace.zip"
                    }
                  ],
                  "errorLocation": {
                    "file": "/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/helpers.ts",
                    "column": 26,
                    "line": 32
                  }
                }
              ],
              "status": "unexpected"
            }
          ],
          "id": "c6a1cb2133d4d2733fcf-5843f1afa85fddc88848",
          "file": "20-schedule-browser.spec.ts",
          "line": 60,
          "column": 5
        }
      ]
    },
    {
      "title": "30-clock-payroll.spec.ts",
      "file": "30-clock-payroll.spec.ts",
      "column": 0,
      "line": 0,
      "specs": [
        {
          "title": "staff clocks and breaks through real buttons with durable idempotent replay",
          "ok": false,
          "tags": [],
          "tests": [
            {
              "timeout": 90000,
              "annotations": [],
              "expectedStatus": "passed",
              "projectId": "",
              "projectName": "",
              "results": [
                {
                  "workerIndex": 2,
                  "parallelIndex": 0,
                  "status": "failed",
                  "duration": 21068,
                  "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: getByRole('combobox', { name: 'Store', exact: true })\nExpected: visible\nTimeout: 20000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 20000ms\u001b[22m\n\u001b[2m  - waiting for getByRole('combobox', { name: 'Store', exact: true })\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: getByRole('combobox', { name: 'Store', exact: true })\nExpected: visible\nTimeout: 20000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 20000ms\u001b[22m\n\u001b[2m  - waiting for getByRole('combobox', { name: 'Store', exact: true })\u001b[22m\n\n    at login (/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/helpers.ts:32:26)\n    at /Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/30-clock-payroll.spec.ts:25:3",
                    "location": {
                      "file": "/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/helpers.ts",
                      "column": 26,
                      "line": 32
                    },
                    "snippet": "   at helpers.ts:32\n\n  30 |   await page.goto(target);\n  31 |   const selector = page.getByRole('combobox', { name: 'Store', exact: true });\n> 32 |   await expect(selector).toBeVisible();\n     |                          ^\n  33 |   await selector.selectOption(fixture.stores[store].id);\n  34 | }\n  35 |"
                  },
                  "errors": [
                    {
                      "location": {
                        "file": "/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/helpers.ts",
                        "column": 26,
                        "line": 32
                      },
                      "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: getByRole('combobox', { name: 'Store', exact: true })\nExpected: visible\nTimeout: 20000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" with timeout 20000ms\u001b[22m\n\u001b[2m  - waiting for getByRole('combobox', { name: 'Store', exact: true })\u001b[22m\n\n\n   at helpers.ts:32\n\n  30 |   await page.goto(target);\n  31 |   const selector = page.getByRole('combobox', { name: 'Store', exact: true });\n> 32 |   await expect(selector).toBeVisible();\n     |                          ^\n  33 |   await selector.selectOption(fixture.stores[store].id);\n  34 | }\n  35 |\n    at login (/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/helpers.ts:32:26)\n    at /Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/30-clock-payroll.spec.ts:25:3"
                    }
                  ],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-09-06T19:13:02.671Z",
                  "annotations": [],
                  "attachments": [
                    {
                      "name": "screenshot",
                      "contentType": "image/png",
                      "path": "/Users/rvanvuren/Projects/alqove-web/.cache/scheduling-qa/E2E-bb6168a707df86d4/test-results/30-clock-payroll-staff-clo-d4af5-h-durable-idempotent-replay/test-failed-1.png"
                    },
                    {
                      "name": "error-context",
                      "contentType": "text/markdown",
                      "path": "/Users/rvanvuren/Projects/alqove-web/.cache/scheduling-qa/E2E-bb6168a707df86d4/test-results/30-clock-payroll-staff-clo-d4af5-h-durable-idempotent-replay/error-context.md"
                    },
                    {
                      "name": "trace",
                      "contentType": "application/zip",
                      "path": "/Users/rvanvuren/Projects/alqove-web/.cache/scheduling-qa/E2E-bb6168a707df86d4/test-results/30-clock-payroll-staff-clo-d4af5-h-durable-idempotent-replay/trace.zip"
                    }
                  ],
                  "errorLocation": {
                    "file": "/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/helpers.ts",
                    "column": 26,
                    "line": 32
                  }
                }
              ],
              "status": "unexpected"
            }
          ],
          "id": "11458750d704032b6e3f-8431482e12415154e32f",
          "file": "30-clock-payroll.spec.ts",
          "line": 7,
          "column": 5
        },
        {
          "title": "manager correction and approval leads to owner browser CSV download and immutable replay",
          "ok": true,
          "tags": [],
          "tests": [
            {
              "timeout": 90000,
              "annotations": [],
              "expectedStatus": "passed",
              "projectId": "",
              "projectName": "",
              "results": [
                {
                  "workerIndex": 3,
                  "parallelIndex": 0,
                  "status": "passed",
                  "duration": 9278,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-09-06T19:13:24.180Z",
                  "annotations": [],
                  "attachments": [
                    {
                      "name": "manager-correction-approval",
                      "contentType": "application/json",
                      "body": "ewogICJzaGVldCI6IHsKICAgICJpZCI6ICJmNDRjNjAzYi1kNDZkLTRhMTMtYjFlZi0wNmJjYTRkNjQ4NWIiLAogICAgInN0b3JlX21lbWJlcnNoaXBfaWQiOiAiOTA5OWQ0MWMtYzY5Ny0zYjFiLWEzYmItZjBmNzQ3M2Y3N2E2IiwKICAgICJtZW1iZXJfbmFtZSI6ICJFMkUtYmI2MTY4YTcwN2RmODZkNCBNYW5hZ2VyIiwKICAgICJ3ZWVrX3N0YXJ0X2RhdGUiOiAiMjAyNi0wNS0wNCIsCiAgICAic2NoZWR1bGVkX21pbnV0ZXMiOiAwLAogICAgInJlZ3VsYXJfbWludXRlcyI6IDEyMCwKICAgICJvdmVydGltZV9taW51dGVzIjogMCwKICAgICJkb3VibGV0aW1lX21pbnV0ZXMiOiAwLAogICAgInVucGFpZF9icmVha19taW51dGVzIjogMCwKICAgICJ0b3RhbF9wYXlfY2VudHMiOiA0ODAwLAogICAgInN0YXR1cyI6ICJhcHByb3ZlZCIsCiAgICAiY2FsY3VsYXRpb25fbWV0YWRhdGEiOiB7CiAgICAgICJzY2hlbWFfdmVyc2lvbiI6IDEsCiAgICAgICJ0aW1lem9uZSI6ICJBbWVyaWNhL0xvc19BbmdlbGVzIiwKICAgICAgInN0YXJ0c19hdCI6ICIyMDI2LTA1LTA0VDA3OjAwOjAwKzAwOjAwIiwKICAgICAgImVuZHNfYXQiOiAiMjAyNi0wNS0xMVQwNzowMDowMCswMDowMCIsCiAgICAgICJkYWlseV9icmVha2Rvd24iOiB7CiAgICAgICAgIjIwMjYtMDUtMDQiOiB7CiAgICAgICAgICAicmVndWxhcl9taW51dGVzIjogMTIwLAogICAgICAgICAgIm92ZXJ0aW1lX21pbnV0ZXMiOiAwLAogICAgICAgICAgImRvdWJsZXRpbWVfbWludXRlcyI6IDAsCiAgICAgICAgICAidG90YWxfbWludXRlcyI6IDEyMCwKICAgICAgICAgICJjb25zZWN1dGl2ZV9kYXkiOiAxCiAgICAgICAgfQogICAgICB9LAogICAgICAic3RyYW5kZWRfY2xvY2tfaW5zIjogW10sCiAgICAgICJvcGVuX3Nlc3Npb25zIjogW10sCiAgICAgICJvdmVyc2l6ZWRfc2Vzc2lvbnMiOiBbXSwKICAgICAgInB1bmNoZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImlkIjogIjdkMTMyMWM4LWRhOWItNDQ0Ni1iODhhLTkyYWQ2MWNhNGYyNiIsCiAgICAgICAgICAidHlwZSI6ICJjbG9ja19pbiIsCiAgICAgICAgICAidHMiOiAxNzc3OTA2ODAwLAogICAgICAgICAgImJyZWFrX3R5cGUiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiaWQiOiAiOGEyNjFkMzItNzMzYi00MGVlLTk3ODgtNzVkM2Q0MmQ2ODNlIiwKICAgICAgICAgICJ0eXBlIjogImNsb2NrX291dCIsCiAgICAgICAgICAidHMiOiAxNzc3OTE0MDAwLAogICAgICAgICAgImJyZWFrX3R5cGUiOiBudWxsCiAgICAgICAgfQogICAgICBdCiAgICB9CiAgfSwKICAic3FsIjogWwogICAgewogICAgICAiaWQiOiAiYTU5NDQ0OGEtNjUwNy00MjRiLTljNzYtNDcwYzA2NDNiODBjIiwKICAgICAgInN0b3JlX2lkIjogIjY1YmVmOWE2LTRlZjItM2NhNS1iNDMyLTRjNWQzNzhlM2FjMiIsCiAgICAgICJzdG9yZV9tZW1iZXJzaGlwX2lkIjogIjg3ZmJhMDFjLWVmNzQtMzQ2My1iNDU5LTBlZGEwNTIzNWI2OSIsCiAgICAgICJ3ZWVrX3N0YXJ0X2RhdGUiOiAiMjAyNi0wNS0wNCIsCiAgICAgICJzY2hlZHVsZWRfbWludXRlcyI6IDAsCiAgICAgICJyZWd1bGFyX21pbnV0ZXMiOiAwLAogICAgICAib3ZlcnRpbWVfbWludXRlcyI6IDAsCiAgICAgICJkb3VibGV0aW1lX21pbnV0ZXMiOiAwLAogICAgICAidW5wYWlkX2JyZWFrX21pbnV0ZXMiOiAwLAogICAgICAidG90YWxfcGF5X2NlbnRzIjogMCwKICAgICAgInN0YXR1cyI6ICJhcHByb3ZlZCIsCiAgICAgICJjYWxjdWxhdGlvbl9tZXRhZGF0YSI6ICJ7XCJzY2hlbWFfdmVyc2lvblwiOjEsXCJ0aW1lem9uZVwiOlwiQW1lcmljYVxcL0xvc19BbmdlbGVzXCIsXCJzdGFydHNfYXRcIjpcIjIwMjYtMDUtMDRUMDc6MDA6MDArMDA6MDBcIixcImVuZHNfYXRcIjpcIjIwMjYtMDUtMTFUMDc6MDA6MDArMDA6MDBcIixcImRhaWx5X2JyZWFrZG93blwiOltdLFwic3RyYW5kZWRfY2xvY2tfaW5zXCI6W10sXCJvcGVuX3Nlc3Npb25zXCI6W10sXCJvdmVyc2l6ZWRfc2Vzc2lvbnNcIjpbXSxcInB1bmNoZXNcIjpbXX0iLAogICAgICAiYXBwcm92ZWRfYXQiOiAiMjAyNi0wOS0wNiAxOToxMzoyOSIsCiAgICAgICJhcHByb3ZlZF9ieSI6ICJkNjZhM2EzMi0zZTc2LTM5NTEtYjEzZS1lMjJjMjFjMDgxYmUiLAogICAgICAiZXhwb3J0ZWRfYXQiOiBudWxsLAogICAgICAiY3JlYXRlZF9hdCI6ICIyMDI2LTA5LTA2IDE5OjEzOjI4IiwKICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyNi0wOS0wNiAxOToxMzoyOSIKICAgIH0sCiAgICB7CiAgICAgICJpZCI6ICJmNDRjNjAzYi1kNDZkLTRhMTMtYjFlZi0wNmJjYTRkNjQ4NWIiLAogICAgICAic3RvcmVfaWQiOiAiNjViZWY5YTYtNGVmMi0zY2E1LWI0MzItNGM1ZDM3OGUzYWMyIiwKICAgICAgInN0b3JlX21lbWJlcnNoaXBfaWQiOiAiOTA5OWQ0MWMtYzY5Ny0zYjFiLWEzYmItZjBmNzQ3M2Y3N2E2IiwKICAgICAgIndlZWtfc3RhcnRfZGF0ZSI6ICIyMDI2LTA1LTA0IiwKICAgICAgInNjaGVkdWxlZF9taW51dGVzIjogMCwKICAgICAgInJlZ3VsYXJfbWludXRlcyI6IDEyMCwKICAgICAgIm92ZXJ0aW1lX21pbnV0ZXMiOiAwLAogICAgICAiZG91YmxldGltZV9taW51dGVzIjogMCwKICAgICAgInVucGFpZF9icmVha19taW51dGVzIjogMCwKICAgICAgInRvdGFsX3BheV9jZW50cyI6IDQ4MDAsCiAgICAgICJzdGF0dXMiOiAiYXBwcm92ZWQiLAogICAgICAiY2FsY3VsYXRpb25fbWV0YWRhdGEiOiAie1wic2NoZW1hX3ZlcnNpb25cIjoxLFwidGltZXpvbmVcIjpcIkFtZXJpY2FcXC9Mb3NfQW5nZWxlc1wiLFwic3RhcnRzX2F0XCI6XCIyMDI2LTA1LTA0VDA3OjAwOjAwKzAwOjAwXCIsXCJlbmRzX2F0XCI6XCIyMDI2LTA1LTExVDA3OjAwOjAwKzAwOjAwXCIsXCJkYWlseV9icmVha2Rvd25cIjp7XCIyMDI2LTA1LTA0XCI6e1wicmVndWxhcl9taW51dGVzXCI6MTIwLFwib3ZlcnRpbWVfbWludXRlc1wiOjAsXCJkb3VibGV0aW1lX21pbnV0ZXNcIjowLFwidG90YWxfbWludXRlc1wiOjEyMCxcImNvbnNlY3V0aXZlX2RheVwiOjF9fSxcInN0cmFuZGVkX2Nsb2NrX2luc1wiOltdLFwib3Blbl9zZXNzaW9uc1wiOltdLFwib3ZlcnNpemVkX3Nlc3Npb25zXCI6W10sXCJwdW5jaGVzXCI6W3tcImlkXCI6XCI3ZDEzMjFjOC1kYTliLTQ0NDYtYjg4YS05MmFkNjFjYTRmMjZcIixcInR5cGVcIjpcImNsb2NrX2luXCIsXCJ0c1wiOjE3Nzc5MDY4MDAsXCJicmVha190eXBlXCI6bnVsbH0se1wiaWRcIjpcIjhhMjYxZDMyLTczM2ItNDBlZS05Nzg4LTc1ZDNkNDJkNjgzZVwiLFwidHlwZVwiOlwiY2xvY2tfb3V0XCIsXCJ0c1wiOjE3Nzc5MTQwMDAsXCJicmVha190eXBlXCI6bnVsbH1dfSIsCiAgICAgICJhcHByb3ZlZF9hdCI6ICIyMDI2LTA5LTA2IDE5OjEzOjI4IiwKICAgICAgImFwcHJvdmVkX2J5IjogImQ2NmEzYTMyLTNlNzYtMzk1MS1iMTNlLWUyMmMyMWMwODFiZSIsCiAgICAgICJleHBvcnRlZF9hdCI6IG51bGwsCiAgICAgICJjcmVhdGVkX2F0IjogIjIwMjYtMDktMDYgMTk6MTM6MjgiLAogICAgICAidXBkYXRlZF9hdCI6ICIyMDI2LTA5LTA2IDE5OjEzOjI4IgogICAgfSwKICAgIHsKICAgICAgImlkIjogIjkzYjUxYWM2LTAzMTMtNDU5Ni1hM2M4LWRiY2RlMTM0ZDA5MSIsCiAgICAgICJzdG9yZV9pZCI6ICI2NWJlZjlhNi00ZWYyLTNjYTUtYjQzMi00YzVkMzc4ZTNhYzIiLAogICAgICAic3RvcmVfbWVtYmVyc2hpcF9pZCI6ICJiZmFlZTdlMS1lMTkxLTM1MWEtOTMzOC0wZGQxY2RmZmM1ZDUiLAogICAgICAid2Vla19zdGFydF9kYXRlIjogIjIwMjYtMDUtMDQiLAogICAgICAic2NoZWR1bGVkX21pbnV0ZXMiOiAwLAogICAgICAicmVndWxhcl9taW51dGVzIjogMCwKICAgICAgIm92ZXJ0aW1lX21pbnV0ZXMiOiAwLAogICAgICAiZG91YmxldGltZV9taW51dGVzIjogMCwKICAgICAgInVucGFpZF9icmVha19taW51dGVzIjogMCwKICAgICAgInRvdGFsX3BheV9jZW50cyI6IDAsCiAgICAgICJzdGF0dXMiOiAiYXBwcm92ZWQiLAogICAgICAiY2FsY3VsYXRpb25fbWV0YWRhdGEiOiAie1wic2NoZW1hX3ZlcnNpb25cIjoxLFwidGltZXpvbmVcIjpcIkFtZXJpY2FcXC9Mb3NfQW5nZWxlc1wiLFwic3RhcnRzX2F0XCI6XCIyMDI2LTA1LTA0VDA3OjAwOjAwKzAwOjAwXCIsXCJlbmRzX2F0XCI6XCIyMDI2LTA1LTExVDA3OjAwOjAwKzAwOjAwXCIsXCJkYWlseV9icmVha2Rvd25cIjpbXSxcInN0cmFuZGVkX2Nsb2NrX2luc1wiOltdLFwib3Blbl9zZXNzaW9uc1wiOltdLFwib3ZlcnNpemVkX3Nlc3Npb25zXCI6W10sXCJwdW5jaGVzXCI6W119IiwKICAgICAgImFwcHJvdmVkX2F0IjogIjIwMjYtMDktMDYgMTk6MTM6MjkiLAogICAgICAiYXBwcm92ZWRfYnkiOiAiZDY2YTNhMzItM2U3Ni0zOTUxLWIxM2UtZTIyYzIxYzA4MWJlIiwKICAgICAgImV4cG9ydGVkX2F0IjogbnVsbCwKICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyNi0wOS0wNiAxOToxMzoyOCIsCiAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjYtMDktMDYgMTk6MTM6MjkiCiAgICB9CiAgXSwKICAicHVuY2hlcyI6IFsKICAgIHsKICAgICAgImlkIjogIjdkMTMyMWM4LWRhOWItNDQ0Ni1iODhhLTkyYWQ2MWNhNGYyNiIsCiAgICAgICJzdG9yZV9pZCI6ICI2NWJlZjlhNi00ZWYyLTNjYTUtYjQzMi00YzVkMzc4ZTNhYzIiLAogICAgICAic3RvcmVfbWVtYmVyc2hpcF9pZCI6ICI5MDk5ZDQxYy1jNjk3LTNiMWItYTNiYi1mMGY3NDczZjc3YTYiLAogICAgICAic2hpZnRfaWQiOiBudWxsLAogICAgICAicHVuY2hfdHlwZSI6ICJjbG9ja19pbiIsCiAgICAgICJwdW5jaGVkX2F0IjogIjIwMjYtMDUtMDQgMTU6MDA6MDAiLAogICAgICAiYnJlYWtfdHlwZSI6IG51bGwsCiAgICAgICJub3RlIjogIkUyRS1iYjYxNjhhNzA3ZGY4NmQ0IGNvcnJlY3QgbWlzc2VkIGZpcnN0IGhvdXIiLAogICAgICAicmV2aXNpb24iOiAiMzk4MTk5MzgtNzE4OS00MGE4LTg3NzQtMTJkNWZjMzhiMTY4IiwKICAgICAgImlzX21hbnVhbCI6IDEsCiAgICAgICJjcmVhdGVkX2J5IjogImQ2NmEzYTMyLTNlNzYtMzk1MS1iMTNlLWUyMmMyMWMwODFiZSIsCiAgICAgICJ1cGRhdGVkX2J5IjogImQ2NmEzYTMyLTNlNzYtMzk1MS1iMTNlLWUyMmMyMWMwODFiZSIsCiAgICAgICJkZWxldGVkX2J5IjogbnVsbCwKICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyNi0wOS0wNiAxOToxMzoyNCIsCiAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjYtMDktMDYgMTk6MTM6MjgiLAogICAgICAiZGVsZXRlZF9hdCI6IG51bGwKICAgIH0sCiAgICB7CiAgICAgICJpZCI6ICI4YTI2MWQzMi03MzNiLTQwZWUtOTc4OC03NWQzZDQyZDY4M2UiLAogICAgICAic3RvcmVfaWQiOiAiNjViZWY5YTYtNGVmMi0zY2E1LWI0MzItNGM1ZDM3OGUzYWMyIiwKICAgICAgInN0b3JlX21lbWJlcnNoaXBfaWQiOiAiOTA5OWQ0MWMtYzY5Ny0zYjFiLWEzYmItZjBmNzQ3M2Y3N2E2IiwKICAgICAgInNoaWZ0X2lkIjogbnVsbCwKICAgICAgInB1bmNoX3R5cGUiOiAiY2xvY2tfb3V0IiwKICAgICAgInB1bmNoZWRfYXQiOiAiMjAyNi0wNS0wNCAxNzowMDowMCIsCiAgICAgICJicmVha190eXBlIjogbnVsbCwKICAgICAgIm5vdGUiOiAiRTJFLWJiNjE2OGE3MDdkZjg2ZDQgY29ycmVjdGlvbiBzZXR1cCIsCiAgICAgICJyZXZpc2lvbiI6ICJiZTU0Y2I2YS1mYzJlLTQwODMtOTAwYy03NDM0Njk5ZjlhYzAiLAogICAgICAiaXNfbWFudWFsIjogMSwKICAgICAgImNyZWF0ZWRfYnkiOiAiZDY2YTNhMzItM2U3Ni0zOTUxLWIxM2UtZTIyYzIxYzA4MWJlIiwKICAgICAgInVwZGF0ZWRfYnkiOiBudWxsLAogICAgICAiZGVsZXRlZF9ieSI6IG51bGwsCiAgICAgICJjcmVhdGVkX2F0IjogIjIwMjYtMDktMDYgMTk6MTM6MjQiLAogICAgICAidXBkYXRlZF9hdCI6ICIyMDI2LTA5LTA2IDE5OjEzOjI0IiwKICAgICAgImRlbGV0ZWRfYXQiOiBudWxsCiAgICB9CiAgXQp9"
                    },
                    {
                      "name": "payroll-browser-download-replay",
                      "contentType": "application/json",
                      "body": "ewogICJleHBvcnQiOiB7CiAgICAiaWQiOiAiOTIzODJhMzktMGM3NS00MDVmLWI3ODctYTAwMDgxMmM5YTVhIiwKICAgICJ3ZWVrX3N0YXJ0cyI6IFsKICAgICAgIjIwMjYtMDUtMDQiCiAgICBdLAogICAgInJvd19jb3VudCI6IDMsCiAgICAidG90YWxfbWludXRlcyI6IDEyMCwKICAgICJ0b3RhbF9wYXlfY2VudHMiOiA0ODAwLAogICAgInJvdW5kaW5nX21vZGUiOiAibm9uZSIsCiAgICAicm91bmRpbmdfaW5jcmVtZW50X21pbnV0ZXMiOiAxLAogICAgInBlcmlvZF9zdGFydCI6ICIyMDI2LTA1LTA0IiwKICAgICJwZXJpb2RfZW5kIjogIjIwMjYtMDUtMTAiLAogICAgImZpbGVuYW1lIjogInBheXJvbGxfMjAyNi0wNS0wNF8yMDI2LTA1LTA0LmNzdiIsCiAgICAiY3N2X2hhc2giOiAiMWVlNTM2NjY5NDJhNTE0ZDU5MjljZTljNmUxMmI4NWVjZDI0NDUwMmRhMzgyN2IwZmNkMWFlN2ZlNzI2YjAyNSIsCiAgICAiY3JlYXRlZF9hdCI6ICIyMDI2LTA5LTA2VDE5OjEzOjMzLjAwMDAwMFoiLAogICAgInBheV9iYXNpcyI6ICJhY3R1YWxfbWludXRlcyIsCiAgICAid2FybmluZ3MiOiBbXQogIH0sCiAgImNzdl9zaGEyNTYiOiAiMWVlNTM2NjY5NDJhNTE0ZDU5MjljZTljNmUxMmI4NWVjZDI0NDUwMmRhMzgyN2IwZmNkMWFlN2ZlNzI2YjAyNSIsCiAgImNzdl9ieXRlcyI6IDQzNiwKICAic3FsIjogWwogICAgewogICAgICAiaWQiOiAiOTIzODJhMzktMGM3NS00MDVmLWI3ODctYTAwMDgxMmM5YTVhIiwKICAgICAgInN0b3JlX2lkIjogIjY1YmVmOWE2LTRlZjItM2NhNS1iNDMyLTRjNWQzNzhlM2FjMiIsCiAgICAgICJleHBvcnRlZF9ieSI6ICI1ZTZkNmVkYy1hOGJhLTMzYWUtOTlkNi1lNWY0YmE5YWFjZTMiLAogICAgICAiaWRlbXBvdGVuY3lfa2V5IjogIjQ4OGZiOTI5LTU0YjYtNDJmZi1iNGZkLTUwNTk0MzY1MGY2MyIsCiAgICAgICJyZXF1ZXN0X2hhc2giOiAiYWQ0MGQzYTcyZTcyNDc0NDk5NDU5OWNlMTc4YmRkOTdhMmY3MTQ4MGE3NmM1ZjY3OTFmMjE5ZThlNWYyMmU1MyIsCiAgICAgICJjc3ZfaGFzaCI6ICIxZWU1MzY2Njk0MmE1MTRkNTkyOWNlOWM2ZTEyYjg1ZWNkMjQ0NTAyZGEzODI3YjBmY2QxYWU3ZmU3MjZiMDI1IiwKICAgICAgImV4cG9ydF9kZXRhaWxzIjogIntcInNjaGVtYV92ZXJzaW9uXCI6MSxcInBheV9iYXNpc1wiOlwiYWN0dWFsX21pbnV0ZXNcIixcIndhcm5pbmdzXCI6W10sXCJoZWFkZXJzXCI6W1wiTWVtYmVyc2hpcCBJRFwiLFwiRW1wbG95ZWUgTmFtZVwiLFwiV2VlayBTdGFydFwiLFwiUmVndWxhciBIb3Vyc1wiLFwiT3ZlcnRpbWUgSG91cnNcIixcIkRvdWJsZXRpbWUgSG91cnNcIixcIlRvdGFsIEhvdXJzXCIsXCJUb3RhbCBQYXlcIl0sXCJyb3dzXCI6W1tcIjg3ZmJhMDFjLWVmNzQtMzQ2My1iNDU5LTBlZGEwNTIzNWI2OVwiLFwiRTJFLWJiNjE2OGE3MDdkZjg2ZDQgU3RhZmZcIixcIjIwMjYtMDUtMDRcIixcIjAuMDBcIixcIjAuMDBcIixcIjAuMDBcIixcIjAuMDBcIixcIjAuMDBcIl0sW1wiOTA5OWQ0MWMtYzY5Ny0zYjFiLWEzYmItZjBmNzQ3M2Y3N2E2XCIsXCJFMkUtYmI2MTY4YTcwN2RmODZkNCBNYW5hZ2VyXCIsXCIyMDI2LTA1LTA0XCIsXCIyLjAwXCIsXCIwLjAwXCIsXCIwLjAwXCIsXCIyLjAwXCIsXCI0OC4wMFwiXSxbXCJiZmFlZTdlMS1lMTkxLTM1MWEtOTMzOC0wZGQxY2RmZmM1ZDVcIixcIkUyRS1iYjYxNjhhNzA3ZGY4NmQ0IE93bmVyXCIsXCIyMDI2LTA1LTA0XCIsXCIwLjAwXCIsXCIwLjAwXCIsXCIwLjAwXCIsXCIwLjAwXCIsXCIwLjAwXCJdXX0iLAogICAgICAid2Vla19zdGFydHMiOiAiW1wiMjAyNi0wNS0wNFwiXSIsCiAgICAgICJ0aW1lc2hlZXRfaWRzIjogIltcImE1OTQ0NDhhLTY1MDctNDI0Yi05Yzc2LTQ3MGMwNjQzYjgwY1wiLFwiZjQ0YzYwM2ItZDQ2ZC00YTEzLWIxZWYtMDZiY2E0ZDY0ODViXCIsXCI5M2I1MWFjNi0wMzEzLTQ1OTYtYTNjOC1kYmNkZTEzNGQwOTFcIl0iLAogICAgICAicm93X2NvdW50IjogMywKICAgICAgInRvdGFsX21pbnV0ZXMiOiAxMjAsCiAgICAgICJ0b3RhbF9wYXlfY2VudHMiOiA0ODAwLAogICAgICAicm91bmRpbmdfbW9kZSI6ICJub25lIiwKICAgICAgInJvdW5kaW5nX2luY3JlbWVudF9taW51dGVzIjogMSwKICAgICAgInBlcmlvZF9zdGFydCI6ICIyMDI2LTA1LTA0IiwKICAgICAgInBlcmlvZF9lbmQiOiAiMjAyNi0wNS0xMCIsCiAgICAgICJmaWxlbmFtZSI6ICJwYXlyb2xsXzIwMjYtMDUtMDRfMjAyNi0wNS0wNC5jc3YiLAogICAgICAiY29uZmxpY3RfcXVhcmFudGluZV9rZXkiOiBudWxsLAogICAgICAiY3JlYXRlZF9hdCI6ICIyMDI2LTA5LTA2IDE5OjEzOjMzIiwKICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyNi0wOS0wNiAxOToxMzozMyIKICAgIH0KICBdCn0="
                    }
                  ]
                }
              ],
              "status": "expected"
            }
          ],
          "id": "11458750d704032b6e3f-a0bda1f7103d193583ff",
          "file": "30-clock-payroll.spec.ts",
          "line": 53,
          "column": 5
        }
      ]
    },
    {
      "title": "40-guards.spec.ts",
      "file": "40-guards.spec.ts",
      "column": 0,
      "line": 0,
      "specs": [
        {
          "title": "stranded-clock approval/export guards and cross-store punch IDs fail closed",
          "ok": true,
          "tags": [],
          "tests": [
            {
              "timeout": 90000,
              "annotations": [],
              "expectedStatus": "passed",
              "projectId": "",
              "projectName": "",
              "results": [
                {
                  "workerIndex": 3,
                  "parallelIndex": 0,
                  "status": "passed",
                  "duration": 318,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-09-06T19:13:33.573Z",
                  "annotations": [],
                  "attachments": [
                    {
                      "name": "stranded-guards",
                      "contentType": "application/json",
                      "body": "ewogICJzaGVldCI6IHsKICAgICJpZCI6ICI4MzVmNGI3Yi1hYTI5LTQwY2QtOGRmMS1jN2IxZjVmMzBjMDIiLAogICAgInN0b3JlX21lbWJlcnNoaXBfaWQiOiAiN2YwZTczMGQtNDBlZi0zZjQ1LTkyYzMtNjc5ZTE3NzFmNTNhIiwKICAgICJtZW1iZXJfbmFtZSI6ICJFMkUtYmI2MTY4YTcwN2RmODZkNCBNYW5hZ2VyIiwKICAgICJ3ZWVrX3N0YXJ0X2RhdGUiOiAiMjAyNi0wNC0wNiIsCiAgICAic2NoZWR1bGVkX21pbnV0ZXMiOiAwLAogICAgInJlZ3VsYXJfbWludXRlcyI6IDAsCiAgICAib3ZlcnRpbWVfbWludXRlcyI6IDAsCiAgICAiZG91YmxldGltZV9taW51dGVzIjogMCwKICAgICJ1bnBhaWRfYnJlYWtfbWludXRlcyI6IDAsCiAgICAic3RhdHVzIjogInBlbmRpbmciLAogICAgImNhbGN1bGF0aW9uX21ldGFkYXRhIjogewogICAgICAic2NoZW1hX3ZlcnNpb24iOiAxLAogICAgICAidGltZXpvbmUiOiAiQW1lcmljYS9Mb3NfQW5nZWxlcyIsCiAgICAgICJzdGFydHNfYXQiOiAiMjAyNi0wNC0wNlQwNzowMDowMCswMDowMCIsCiAgICAgICJlbmRzX2F0IjogIjIwMjYtMDQtMTNUMDc6MDA6MDArMDA6MDAiLAogICAgICAiZGFpbHlfYnJlYWtkb3duIjogW10sCiAgICAgICJzdHJhbmRlZF9jbG9ja19pbnMiOiBbCiAgICAgICAgewogICAgICAgICAgInB1bmNoX2lkIjogIjM5N2U3ZTM0LTQ0NzEtNDA3MC1hZTc2LTNlYmY1NzNmNWQ4OSIsCiAgICAgICAgICAiZGF0ZSI6ICIyMDI2LTA0LTA2IgogICAgICAgIH0KICAgICAgXSwKICAgICAgIm9wZW5fc2Vzc2lvbnMiOiBbCiAgICAgICAgewogICAgICAgICAgInB1bmNoX2lkIjogIjM5N2U3ZTM0LTQ0NzEtNDA3MC1hZTc2LTNlYmY1NzNmNWQ4OSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJvdmVyc2l6ZWRfc2Vzc2lvbnMiOiBbXSwKICAgICAgInB1bmNoZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImlkIjogIjM5N2U3ZTM0LTQ0NzEtNDA3MC1hZTc2LTNlYmY1NzNmNWQ4OSIsCiAgICAgICAgICAidHlwZSI6ICJjbG9ja19pbiIsCiAgICAgICAgICAidHMiOiAxNzc1NDkxMjAwLAogICAgICAgICAgImJyZWFrX3R5cGUiOiBudWxsCiAgICAgICAgfQogICAgICBdCiAgICB9CiAgfSwKICAicHVuY2hlcyI6IFsKICAgIHsKICAgICAgImlkIjogIjM5N2U3ZTM0LTQ0NzEtNDA3MC1hZTc2LTNlYmY1NzNmNWQ4OSIsCiAgICAgICJzdG9yZV9pZCI6ICJmNTkyZWQyMS0wNGY3LTM0NjAtOTIxMC1iZTllYzI0ODg0NTciLAogICAgICAic3RvcmVfbWVtYmVyc2hpcF9pZCI6ICI3ZjBlNzMwZC00MGVmLTNmNDUtOTJjMy02NzllMTc3MWY1M2EiLAogICAgICAic2hpZnRfaWQiOiBudWxsLAogICAgICAicHVuY2hfdHlwZSI6ICJjbG9ja19pbiIsCiAgICAgICJwdW5jaGVkX2F0IjogIjIwMjYtMDQtMDYgMTY6MDA6MDAiLAogICAgICAiYnJlYWtfdHlwZSI6IG51bGwsCiAgICAgICJub3RlIjogIkUyRS1iYjYxNjhhNzA3ZGY4NmQ0IHN0cmFuZGVkIGd1YXJkIiwKICAgICAgInJldmlzaW9uIjogIjFmYzNlZGQ5LWVhMTYtNDhkMC1iOGNkLTA1NGJhMTNjNzg0NyIsCiAgICAgICJpc19tYW51YWwiOiAxLAogICAgICAiY3JlYXRlZF9ieSI6ICJkNjZhM2EzMi0zZTc2LTM5NTEtYjEzZS1lMjJjMjFjMDgxYmUiLAogICAgICAidXBkYXRlZF9ieSI6IG51bGwsCiAgICAgICJkZWxldGVkX2J5IjogbnVsbCwKICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyNi0wOS0wNiAxOToxMzozMyIsCiAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjYtMDktMDYgMTk6MTM6MzMiLAogICAgICAiZGVsZXRlZF9hdCI6IG51bGwKICAgIH0KICBdLAogICJleHBvcnRzIjogW10KfQ=="
                    }
                  ]
                }
              ],
              "status": "expected"
            }
          ],
          "id": "c7397b2a9aa80a519ce2-fb6432fabdc751085763",
          "file": "40-guards.spec.ts",
          "line": 3,
          "column": 5
        }
      ]
    },
    {
      "title": "50-payroll-api.spec.ts",
      "file": "50-payroll-api.spec.ts",
      "column": 0,
      "line": 0,
      "specs": [
        {
          "title": "real API payroll snapshot replays unchanged after settings mutation and rejects exported corrections",
          "ok": false,
          "tags": [],
          "tests": [
            {
              "timeout": 90000,
              "annotations": [],
              "expectedStatus": "passed",
              "projectId": "",
              "projectName": "",
              "results": [
                {
                  "workerIndex": 3,
                  "parallelIndex": 0,
                  "status": "failed",
                  "duration": 144,
                  "error": {
                    "message": "Error: POST /payroll/exports: {\"message\":\"Correct missing clock-outs before approving or exporting.\",\"errors\":{\"stranded_clock_ins\":[\"Correct missing clock-outs before approving or exporting.\"]}}\n\n\u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m201\u001b[39m\nReceived: \u001b[31m422\u001b[39m",
                    "stack": "Error: POST /payroll/exports: {\"message\":\"Correct missing clock-outs before approving or exporting.\",\"errors\":{\"stranded_clock_ins\":[\"Correct missing clock-outs before approving or exporting.\"]}}\n\n\u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m201\u001b[39m\nReceived: \u001b[31m422\u001b[39m\n    at api (/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/helpers.ts:20:76)\n    at /Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/50-payroll-api.spec.ts:18:20",
                    "location": {
                      "file": "/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/helpers.ts",
                      "column": 76,
                      "line": 20
                    },
                    "snippet": "   at helpers.ts:20\n\n  18 |   // Never include request options/credentials in failure messages.\n  19 |   const text = await response.text();\n> 20 |   expect(response.status(), `${method} ${suffix}: ${text.slice(0, 1800)}`).toBe(status);\n     |                                                                            ^\n  21 |   return text ? JSON.parse(text).data : undefined;\n  22 | }\n  23 |"
                  },
                  "errors": [
                    {
                      "location": {
                        "file": "/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/helpers.ts",
                        "column": 76,
                        "line": 20
                      },
                      "message": "Error: POST /payroll/exports: {\"message\":\"Correct missing clock-outs before approving or exporting.\",\"errors\":{\"stranded_clock_ins\":[\"Correct missing clock-outs before approving or exporting.\"]}}\n\n\u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m201\u001b[39m\nReceived: \u001b[31m422\u001b[39m\n\n   at helpers.ts:20\n\n  18 |   // Never include request options/credentials in failure messages.\n  19 |   const text = await response.text();\n> 20 |   expect(response.status(), `${method} ${suffix}: ${text.slice(0, 1800)}`).toBe(status);\n     |                                                                            ^\n  21 |   return text ? JSON.parse(text).data : undefined;\n  22 | }\n  23 |\n    at api (/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/helpers.ts:20:76)\n    at /Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/50-payroll-api.spec.ts:18:20"
                    }
                  ],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-09-06T19:13:33.898Z",
                  "annotations": [],
                  "attachments": [
                    {
                      "name": "error-context",
                      "contentType": "text/markdown",
                      "path": "/Users/rvanvuren/Projects/alqove-web/.cache/scheduling-qa/E2E-bb6168a707df86d4/test-results/50-payroll-api-real-API-pa-01b87-ejects-exported-corrections/error-context.md"
                    },
                    {
                      "name": "trace",
                      "contentType": "application/zip",
                      "path": "/Users/rvanvuren/Projects/alqove-web/.cache/scheduling-qa/E2E-bb6168a707df86d4/test-results/50-payroll-api-real-API-pa-01b87-ejects-exported-corrections/trace.zip"
                    }
                  ],
                  "errorLocation": {
                    "file": "/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/helpers.ts",
                    "column": 76,
                    "line": 20
                  }
                }
              ],
              "status": "unexpected"
            }
          ],
          "id": "f2d6717b33a336c9d05a-ca5474418c34094d247c",
          "file": "50-payroll-api.spec.ts",
          "line": 4,
          "column": 5
        }
      ]
    }
  ],
  "errors": [],
  "stats": {
    "startTime": "2026-09-06T19:12:10.928Z",
    "duration": 83191.875,
    "expected": 4,
    "skipped": 0,
    "unexpected": 4,
    "flaky": 0
  }
}