{
  "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-45c35e325c2a797f/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-45c35e325c2a797f/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": 4682,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-09-06T19:00:27.928Z",
                  "annotations": [],
                  "attachments": [
                    {
                      "name": "auth-switcher",
                      "contentType": "application/json",
                      "body": "ewogICJhY3RvciI6ICJtYW5hZ2VyIiwKICAic3RvcmUiOiAiMGY5YWFjODQtMTQyNi0zZjQyLTlhNmYtZTEzN2YzNzgwNGQzIiwKICAicGVyc2lzdGVkIjogdHJ1ZQp9"
                    }
                  ]
                }
              ],
              "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": 545,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-09-06T19:00:32.838Z",
                  "annotations": [],
                  "attachments": [
                    {
                      "name": "dst-revision-tenancy",
                      "contentType": "application/json",
                      "body": "ewogICJvcmlnaW5hbCI6IHsKICAgICJpZCI6ICI0OWIyMGU0Yi1hNDMyLTQ1ODgtOWMyNi1hOTFiODk3Nzk5NzUiLAogICAgInN0b3JlX2lkIjogIjUyZWY0MDhjLTI2NmItM2I5OS05MjNjLTM5NGY2NmViMmZkYiIsCiAgICAic3RvcmVfbWVtYmVyc2hpcF9pZCI6ICI0NTA5ZTZmZC03ZGViLTNhMWEtYWU5ZS04ZmU4ZjUwNmJlNTciLAogICAgIm1lbWJlcl9uYW1lIjogIkUyRS00NWMzNWUzMjVjMmE3OTdmIFN0YWZmIiwKICAgICJwb3NpdGlvbl9pZCI6IG51bGwsCiAgICAicG9zaXRpb25fbmFtZSI6IG51bGwsCiAgICAic3RhcnRzX2F0IjogIjIwMjYtMDMtMDJUMTc6MDA6MDAuMDAwMDAwWiIsCiAgICAiZW5kc19hdCI6ICIyMDI2LTAzLTAzVDAxOjAwOjAwLjAwMDAwMFoiLAogICAgIm5vdGVzIjogIkUyRS00NWMzNWUzMjVjMmE3OTdmIERTVCBzb3VyY2UiLAogICAgInB1Ymxpc2hlZF9hdCI6IG51bGwsCiAgICAicmV2aXNpb24iOiAiMjAyNi0wOS0wNlQxOTowMDozMi44NjU5MTBaIgogIH0sCiAgInVwZGF0ZWQiOiB7CiAgICAiaWQiOiAiNDliMjBlNGItYTQzMi00NTg4LTljMjYtYTkxYjg5Nzc5OTc1IiwKICAgICJzdG9yZV9pZCI6ICI1MmVmNDA4Yy0yNjZiLTNiOTktOTIzYy0zOTRmNjZlYjJmZGIiLAogICAgInN0b3JlX21lbWJlcnNoaXBfaWQiOiAiNDUwOWU2ZmQtN2RlYi0zYTFhLWFlOWUtOGZlOGY1MDZiZTU3IiwKICAgICJtZW1iZXJfbmFtZSI6ICJFMkUtNDVjMzVlMzI1YzJhNzk3ZiBTdGFmZiIsCiAgICAicG9zaXRpb25faWQiOiBudWxsLAogICAgInBvc2l0aW9uX25hbWUiOiBudWxsLAogICAgInN0YXJ0c19hdCI6ICIyMDI2LTAzLTAyVDE3OjAwOjAwLjAwMDAwMFoiLAogICAgImVuZHNfYXQiOiAiMjAyNi0wMy0wM1QwMTowMDowMC4wMDAwMDBaIiwKICAgICJub3RlcyI6ICJFMkUtNDVjMzVlMzI1YzJhNzk3ZiBlZGl0ZWQiLAogICAgInB1Ymxpc2hlZF9hdCI6IG51bGwsCiAgICAicmV2aXNpb24iOiAiMjAyNi0wOS0wNlQxOTowMDozMi45MzI5NzFaIgogIH0sCiAgImNvcGllZCI6IHsKICAgICJ3ZWVrX3N0YXJ0IjogIjIwMjYtMDMtMDkiLAogICAgInN0YXJ0c19hdCI6ICIyMDI2LTAzLTA5VDA3OjAwOjAwLjAwMDAwMFoiLAogICAgImVuZHNfYXQiOiAiMjAyNi0wMy0xNlQwNzowMDowMC4wMDAwMDBaIiwKICAgICJ0aW1lem9uZSI6ICJBbWVyaWNhL0xvc19BbmdlbGVzIiwKICAgICJzaGlmdHMiOiBbCiAgICAgIHsKICAgICAgICAiaWQiOiAiMDJhMWM2MzktMTgxNC00MzliLTlkOTMtYWM0Mzk5Y2FjN2UxIiwKICAgICAgICAic3RvcmVfaWQiOiAiNTJlZjQwOGMtMjY2Yi0zYjk5LTkyM2MtMzk0ZjY2ZWIyZmRiIiwKICAgICAgICAic3RvcmVfbWVtYmVyc2hpcF9pZCI6ICI0NTA5ZTZmZC03ZGViLTNhMWEtYWU5ZS04ZmU4ZjUwNmJlNTciLAogICAgICAgICJtZW1iZXJfbmFtZSI6ICJFMkUtNDVjMzVlMzI1YzJhNzk3ZiBTdGFmZiIsCiAgICAgICAgInBvc2l0aW9uX2lkIjogbnVsbCwKICAgICAgICAicG9zaXRpb25fbmFtZSI6IG51bGwsCiAgICAgICAgInN0YXJ0c19hdCI6ICIyMDI2LTAzLTA5VDE2OjAwOjAwLjAwMDAwMFoiLAogICAgICAgICJlbmRzX2F0IjogIjIwMjYtMDMtMTBUMDA6MDA6MDAuMDAwMDAwWiIsCiAgICAgICAgIm5vdGVzIjogIkUyRS00NWMzNWUzMjVjMmE3OTdmIGVkaXRlZCIsCiAgICAgICAgInB1Ymxpc2hlZF9hdCI6IG51bGwsCiAgICAgICAgInJldmlzaW9uIjogIjIwMjYtMDktMDZUMTk6MDA6MzMuMTM1MzYwWiIKICAgICAgfQogICAgXSwKICAgICJwdWJsaWNhdGlvbiI6IG51bGwKICB9LAogICJzcWwiOiBbCiAgICB7CiAgICAgICJpZCI6ICI0OWIyMGU0Yi1hNDMyLTQ1ODgtOWMyNi1hOTFiODk3Nzk5NzUiLAogICAgICAic3RvcmVfaWQiOiAiNTJlZjQwOGMtMjY2Yi0zYjk5LTkyM2MtMzk0ZjY2ZWIyZmRiIiwKICAgICAgInN0b3JlX21lbWJlcnNoaXBfaWQiOiAiNDUwOWU2ZmQtN2RlYi0zYTFhLWFlOWUtOGZlOGY1MDZiZTU3IiwKICAgICAgInBvc2l0aW9uX2lkIjogbnVsbCwKICAgICAgInN0YXJ0c19hdCI6ICIyMDI2LTAzLTAyIDE3OjAwOjAwLjAwMDAwMCIsCiAgICAgICJlbmRzX2F0IjogIjIwMjYtMDMtMDMgMDE6MDA6MDAuMDAwMDAwIiwKICAgICAgIm5vdGVzIjogIkUyRS00NWMzNWUzMjVjMmE3OTdmIGVkaXRlZCIsCiAgICAgICJwdWJsaXNoZWRfYXQiOiBudWxsLAogICAgICAicHVibGlzaGVkX2J5IjogbnVsbCwKICAgICAgImNyZWF0ZWRfYnkiOiAiNDc2ZTBiZjUtMmMwNS0zMTE2LWE0NGYtNmFiNTBhNWU1ZGYyIiwKICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyNi0wOS0wNiAxOTowMDozMi44NjU5MTAiLAogICAgICAidXBkYXRlZF9hdCI6ICIyMDI2LTA5LTA2IDE5OjAwOjMyLjkzMjk3MSIsCiAgICAgICJkZWxldGVkX2F0IjogbnVsbAogICAgfSwKICAgIHsKICAgICAgImlkIjogIjAyYTFjNjM5LTE4MTQtNDM5Yi05ZDkzLWFjNDM5OWNhYzdlMSIsCiAgICAgICJzdG9yZV9pZCI6ICI1MmVmNDA4Yy0yNjZiLTNiOTktOTIzYy0zOTRmNjZlYjJmZGIiLAogICAgICAic3RvcmVfbWVtYmVyc2hpcF9pZCI6ICI0NTA5ZTZmZC03ZGViLTNhMWEtYWU5ZS04ZmU4ZjUwNmJlNTciLAogICAgICAicG9zaXRpb25faWQiOiBudWxsLAogICAgICAic3RhcnRzX2F0IjogIjIwMjYtMDMtMDkgMTY6MDA6MDAuMDAwMDAwIiwKICAgICAgImVuZHNfYXQiOiAiMjAyNi0wMy0xMCAwMDowMDowMC4wMDAwMDAiLAogICAgICAibm90ZXMiOiAiRTJFLTQ1YzM1ZTMyNWMyYTc5N2YgZWRpdGVkIiwKICAgICAgInB1Ymxpc2hlZF9hdCI6IG51bGwsCiAgICAgICJwdWJsaXNoZWRfYnkiOiBudWxsLAogICAgICAiY3JlYXRlZF9ieSI6ICIzMDEwYmQ5ZC1iN2RkLTM5YTUtOWM3Yi1mNjYxODY5MDZjODMiLAogICAgICAiY3JlYXRlZF9hdCI6ICIyMDI2LTA5LTA2IDE5OjAwOjMzLjEzNTM2MCIsCiAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjYtMDktMDYgMTk6MDA6MzMuMTM1MzYwIiwKICAgICAgImRlbGV0ZWRfYXQiOiBudWxsCiAgICB9CiAgXQp9"
                    }
                  ]
                }
              ],
              "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 to staff/team, edits back to draft and switches tenants",
          "ok": false,
          "tags": [],
          "tests": [
            {
              "timeout": 90000,
              "annotations": [],
              "expectedStatus": "passed",
              "projectId": "",
              "projectName": "",
              "results": [
                {
                  "workerIndex": 0,
                  "parallelIndex": 0,
                  "status": "timedOut",
                  "duration": 90151,
                  "error": {
                    "message": "\u001b[31mTest timeout of 90000ms exceeded.\u001b[39m",
                    "stack": "\u001b[31mTest timeout of 90000ms exceeded.\u001b[39m"
                  },
                  "errors": [
                    {
                      "message": "\u001b[31mTest timeout of 90000ms exceeded.\u001b[39m"
                    },
                    {
                      "location": {
                        "file": "/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/20-schedule-browser.spec.ts",
                        "column": 58,
                        "line": 13
                      },
                      "message": "Error: locator.selectOption: Test timeout of 90000ms 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:00:33.390Z",
                  "annotations": [],
                  "attachments": [
                    {
                      "name": "screenshot",
                      "contentType": "image/png",
                      "path": "/Users/rvanvuren/Projects/alqove-web/.cache/scheduling-qa/E2E-45c35e325c2a797f/test-results/20-schedule-browser-owner--318f2--draft-and-switches-tenants/test-failed-1.png"
                    },
                    {
                      "name": "error-context",
                      "contentType": "text/markdown",
                      "path": "/Users/rvanvuren/Projects/alqove-web/.cache/scheduling-qa/E2E-45c35e325c2a797f/test-results/20-schedule-browser-owner--318f2--draft-and-switches-tenants/error-context.md"
                    },
                    {
                      "name": "trace",
                      "contentType": "application/zip",
                      "path": "/Users/rvanvuren/Projects/alqove-web/.cache/scheduling-qa/E2E-45c35e325c2a797f/test-results/20-schedule-browser-owner--318f2--draft-and-switches-tenants/trace.zip"
                    }
                  ]
                }
              ],
              "status": "unexpected"
            }
          ],
          "id": "c6a1cb2133d4d2733fcf-988f61366d71b6ce8597",
          "file": "20-schedule-browser.spec.ts",
          "line": 3,
          "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; manager corrects/approves; owner exports immutable CSV",
          "ok": false,
          "tags": [],
          "tests": [
            {
              "timeout": 90000,
              "annotations": [],
              "expectedStatus": "passed",
              "projectId": "",
              "projectName": "",
              "results": [
                {
                  "workerIndex": 1,
                  "parallelIndex": 0,
                  "status": "failed",
                  "duration": 22038,
                  "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:19: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:19:3"
                    }
                  ],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-09-06T19:02:03.957Z",
                  "annotations": [],
                  "attachments": [
                    {
                      "name": "screenshot",
                      "contentType": "image/png",
                      "path": "/Users/rvanvuren/Projects/alqove-web/.cache/scheduling-qa/E2E-45c35e325c2a797f/test-results/30-clock-payroll-staff-clo-abf98-owner-exports-immutable-CSV/test-failed-1.png"
                    },
                    {
                      "name": "error-context",
                      "contentType": "text/markdown",
                      "path": "/Users/rvanvuren/Projects/alqove-web/.cache/scheduling-qa/E2E-45c35e325c2a797f/test-results/30-clock-payroll-staff-clo-abf98-owner-exports-immutable-CSV/error-context.md"
                    },
                    {
                      "name": "trace",
                      "contentType": "application/zip",
                      "path": "/Users/rvanvuren/Projects/alqove-web/.cache/scheduling-qa/E2E-45c35e325c2a797f/test-results/30-clock-payroll-staff-clo-abf98-owner-exports-immutable-CSV/trace.zip"
                    }
                  ],
                  "errorLocation": {
                    "file": "/Users/rvanvuren/Projects/alqove-web/e2e-scheduling-real/helpers.ts",
                    "column": 26,
                    "line": 32
                  }
                }
              ],
              "status": "unexpected"
            }
          ],
          "id": "11458750d704032b6e3f-ae93a34b47a5620cce39",
          "file": "30-clock-payroll.spec.ts",
          "line": 7,
          "column": 5
        }
      ]
    }
  ],
  "errors": [],
  "stats": {
    "startTime": "2026-09-06T19:00:27.566Z",
    "duration": 118724.81599999999,
    "expected": 2,
    "skipped": 0,
    "unexpected": 2,
    "flaky": 0
  }
}