{
  "config": {
    "argv": [
      "/opt/hostedtoolcache/node/20.20.2/x64/bin/node",
      "/home/runner/work/dr-card-ui/dr-card-ui/node_modules/.bin/playwright",
      "test",
      "tests/e2e/test-gate.spec.ts"
    ],
    "configFile": "/home/runner/work/dr-card-ui/dr-card-ui/playwright.config.ts",
    "rootDir": "/home/runner/work/dr-card-ui/dr-card-ui/tests/e2e",
    "failOnFlakyTests": false,
    "forbidOnly": true,
    "fullyParallel": true,
    "globalSetup": null,
    "globalTeardown": null,
    "globalTimeout": 0,
    "grep": {},
    "grepInvert": null,
    "maxFailures": 0,
    "metadata": {
      "ci": {
        "commitHref": "https://github.com/dangjingtao/dr-card-ui/commit/0286fc15701e7e54df9118255266d2f906b7547d",
        "commitHash": "0286fc15701e7e54df9118255266d2f906b7547d",
        "prHref": "https://github.com/dangjingtao/dr-card-ui/pull/186",
        "prTitle": "fix(test/oss): #171 静态上传不再被业务配置门禁",
        "prBaseHash": "41bbd16de6ab876ec5bdeb834eca6be67477eade",
        "buildHref": "https://github.com/dangjingtao/dr-card-ui/actions/runs/38033303887"
      },
      "gitCommit": {
        "shortHash": "0286fc1",
        "hash": "0286fc15701e7e54df9118255266d2f906b7547d",
        "subject": "Merge d1ff3506f508f9ac64c46989e01b37243e39760d into 41bbd16de6ab876ec5bdeb834eca6be67477eade",
        "body": "Merge d1ff3506f508f9ac64c46989e01b37243e39760d into 41bbd16de6ab876ec5bdeb834eca6be67477eade\n",
        "author": {
          "name": "Tomz Dang",
          "email": "dangjingtao@163.com",
          "time": 1791616016000
        },
        "committer": {
          "name": "GitHub",
          "email": "noreply@github.com",
          "time": 1791616016000
        },
        "branch": "HEAD"
      },
      "gitDiff": "diff --git a/.github/workflows/oss-web-nonprod.yml b/.github/workflows/oss-web-nonprod.yml\nindex 9429424..48dc077 100644\n--- a/.github/workflows/oss-web-nonprod.yml\n+++ b/.github/workflows/oss-web-nonprod.yml\n@@ -79,8 +79,8 @@ jobs:\n     needs: package-check\n     runs-on: ubuntu-latest\n     timeout-minutes: 25\n-    # Each environment requires its own NON-production OSS credentials.\n-    # Never use oss-production or fallback to production credentials.\n+    # Repository-level OSS credentials may publish the guarded nonproduction prefixes.\n+    # Environment-level secrets can still override them later for stricter RAM isolation.\n     environment:\n       name: oss-${{ github.ref_name == 'preview' && 'ui' || github.ref_name }}\n     env:\n@@ -88,8 +88,6 @@ jobs:\n       OSS_ENDPOINT: https://oss-cn-guangzhou.aliyuncs.com\n       OSS_ACCESS_KEY_ID: ${{ secrets.OSS_ACCESS_KEY_ID }}\n       OSS_ACCESS_KEY_SECRET: ${{ secrets.OSS_ACCESS_KEY_SECRET }}\n-      VITE_API_BASE_URL: ${{ vars.OSS_API_BASE_URL }}\n-      VITE_BUDDY_PUBLIC_ORIGIN: ${{ vars.OSS_PUBLIC_ORIGIN }}\n       OSS_WEB_TARGET: ${{ github.ref_name == 'preview' && 'ui' || github.ref_name }}\n       H5_OSS_ARTIFACT: '1'\n     steps:\n@@ -98,7 +96,7 @@ jobs:\n         with:\n           node-version: 20\n           cache: npm\n-      - name: Require dedicated nonproduction credentials and test API config\n+      - name: Require OSS credentials and guarded branch/target pair\n         shell: bash\n         run: |\n           set -euo pipefail\n@@ -108,10 +106,6 @@ jobs:\n             preview:ui|dev:dev|test:test) ;;\n             *) echo \"::error::Wrong branch/target pair\"; exit 1 ;;\n           esac\n-          if [[ \"$OSS_WEB_TARGET\" == \"test\" ]]; then\n-            [[ \"$VITE_API_BASE_URL\" == https://* ]] || { echo \"::error::oss-test requires OSS_API_BASE_URL HTTPS\"; exit 1; }\n-            [[ \"$VITE_BUDDY_PUBLIC_ORIGIN\" == https://* ]] || { echo \"::error::oss-test requires OSS_PUBLIC_ORIGIN HTTPS\"; exit 1; }\n-          fi\n       - run: npm ci --no-audit --no-fund\n       - name: Build and verify environment-specific web package\n         shell: bash\n@@ -143,5 +137,5 @@ jobs:\n             echo \"OSS: \\`oss://kbs-sdl/kbs-web/$OSS_WEB_TARGET/\\`\"\n             echo \"Source: \\`$GITHUB_SHA\\` · Run: \\`$GITHUB_RUN_ID.$GITHUB_RUN_ATTEMPT\\`\"\n             echo \"All package bytes read back from OSS. The index is uploaded last; no keys were deleted.\"\n-            echo \"Public web domain, HTTPS, SPA fallback and App WebView remain external acceptance items.\"\n+            echo \"API/origin readiness, public domain, SPA fallback and App WebView remain separate acceptance items.\"\n           } >> \"$GITHUB_STEP_SUMMARY\"\ndiff --git a/docs/deploy/oss-web-fixed-nonprod.md b/docs/deploy/oss-web-fixed-nonprod.md\nindex 7748585..fa2c0a4 100644\n--- a/docs/deploy/oss-web-fixed-nonprod.md\n+++ b/docs/deploy/oss-web-fixed-nonprod.md\n@@ -12,7 +12,7 @@ Bucket `kbs-sdl`（`cn-guangzhou`）：\n | --- | --- | --- | --- |\n | `preview` | `kbs-web/ui/` | `preview` | Mock / Disabled |\n | `dev` | `kbs-web/dev/` | `dev` | 默认 Mock / Disabled |\n-| `test` | `kbs-web/test/` | `test` | 真实 API / Native |\n+| `test` | `kbs-web/test/` | `test` | API 模式 / Native；API 连通性单独验收 |\n | `prod` | `kbs-web/prod/last/` | `prod` | **仅构建验证，暂不接入新部署** |\n \n 示例：`http://kbs.3cgroup.cn/kbs-web/ui/` 等需要公司端将 URL 精确映射到上述对象前缀，且服务器对 SPA 路由做对应目录的 fallback，不能把静态资源 404 伪装成 HTML。优先启用 HTTPS。当前属于待公司验证的**目标地址**，不能用 CI 成功代替公网真实页面验证。\n@@ -21,7 +21,7 @@ Bucket `kbs-sdl`（`cn-guangzhou`）：\n \n ## GitHub 环境准备（必须由仓库/云账号管理员完成）\n \n-**#171 更新**：非生产推送会实际尝试上传；取消 `OSS_WEB_NONPROD_ENABLED` 开关。缺少所属环境 OSS 凭据时，部署作业明确失败，不能用 CI 打包成功代替真实发布。仍使用不同环境的 OSS 身份，不借用生产密钥，不做对象删除。\n+**#171 更新**：非生产推送会实际尝试上传；取消 `OSS_WEB_NONPROD_ENABLED` 开关。缺少 OSS 凭据时部署作业明确失败，不能用 CI 打包成功代替真实发布。当前可由 Repository secrets 统一提供 OSS AK；`oss-ui/dev/test` Environment 继续承载环境边界，未来如需更强 RAM 隔离，可用同名 Environment secrets 覆盖。发布脚本不做对象删除。\n \n 首次执行自动部署前，在 GitHub Settings → Environments 创建：\n \n@@ -29,16 +29,14 @@ Bucket `kbs-sdl`（`cn-guangzhou`）：\n - `oss-dev`：只允许 `dev` 分支；\n - `oss-test`：只允许 `test` 分支。\n \n-每套环境应具有自己的最小权限发布身份，限制**只操作该环境的** `kbs-web/ui/*`、`kbs-web/dev/*` 或 `kbs-web/test/*`。不得复用拥有 `kbs-web/prod/*` 写/删权限的生产密钥。\n+当前可以使用 Repository-level OSS 凭据完成非生产固定目录发布；代码仍强制 `preview→ui`、`dev→dev`、`test→test`，且不执行删除。若后续需要云侧最小权限隔离，再为三个 Environment 配置同名、仅限各自前缀的 RAM 凭据即可，无需改变工作流。\n \n-| GitHub Environment 参数 | 类型 | 要求 |\n+| GitHub 参数 | 类型 | 要求 |\n | --- | --- | --- |\n-| `OSS_ACCESS_KEY_ID` | Secret | 仅该环境拥有写/读所属前缀权限 |\n-| `OSS_ACCESS_KEY_SECRET` | Secret | 对应密钥，不进入源代码、`VITE_*` 或公开日志 |\n-| `OSS_API_BASE_URL` | Variable | `test` 必须填写真实测试后端 HTTPS API；ui/dev 按需 |\n-| `OSS_PUBLIC_ORIGIN` | Variable | `test` 必须填写真实有效 HTTPS Origin，用于搭子邀请；ui/dev 按需 |\n+| `OSS_ACCESS_KEY_ID` | Repository 或 Environment Secret | OSS 写/读凭据；Environment 同名值可覆盖仓库级值 |\n+| `OSS_ACCESS_KEY_SECRET` | Repository 或 Environment Secret | 对应密钥，不进入源代码、`VITE_*` 或公开日志 |\n \n-未正确配置时，部署作业**明确失败**；不借用 `oss-production`，不伪装成功，不隐式使用示例 API。项目原有 `Build` 与 CF 部署工作流继续保留。\n+缺少 OSS 凭据时部署作业**明确失败**。测试 API / 邀请 Origin 不再作为静态包上传前置：固定目录可以先落 OSS 并完成人工页面验证，`build-meta.json` 会如实记录 API / Origin 是否配置；真实业务连通性继续在 #171 单独验收。项目原有 `Build` 与 CF 部署工作流继续保留。\n \n ## CI / 发布流程\n \ndiff --git a/scripts/build-h5.mjs b/scripts/build-h5.mjs\nindex 0fa2d60..8e25a15 100644\n--- a/scripts/build-h5.mjs\n+++ b/scripts/build-h5.mjs\n@@ -119,7 +119,7 @@ const apiBaseUrl =\n   cloudflareBuildContext && (target.appEnvironment === 'dev' || target.appEnvironment === 'preview')\n     ? ''\n     : configuredApiBaseUrl\n-if (target.appEnvironment === 'test' && !apiBaseUrl) {\n+if (target.appEnvironment === 'test' && !apiBaseUrl && !ossWebTarget) {\n   errors.push('test builds require VITE_API_BASE_URL; a production-like test bundle must target a real backend.')\n }\n if (apiBaseUrl) {\n@@ -134,7 +134,7 @@ if (apiBaseUrl) {\n }\n \n const publicOrigin = readEnv('VITE_BUDDY_PUBLIC_ORIGIN')?.trim() ?? ''\n-if (dataMode === 'api' && prodLike && !publicOrigin && ossWebTarget !== 'prod') {\n+if (dataMode === 'api' && prodLike && !publicOrigin && !ossWebTarget) {\n   errors.push(`${target.appEnvironment} API builds require VITE_BUDDY_PUBLIC_ORIGIN.`)\n }\n if (publicOrigin) {\ndiff --git a/scripts/verify-oss-web-package.mjs b/scripts/verify-oss-web-package.mjs\nindex 717beca..bc922e2 100644\n--- a/scripts/verify-oss-web-package.mjs\n+++ b/scripts/verify-oss-web-package.mjs\n@@ -19,10 +19,9 @@ if (meta.appEnvironment !== allowed[target] ||\n   throw new Error(`OSS package build identity mismatch for ${target}`)\n }\n if (target === 'test' || target === 'prod') {\n-  // API origin readiness is checked during business acceptance, not before\n-  // someone can upload a fixed-path prod bundle for human verification.\n+  // API/origin readiness is business acceptance, not a prerequisite for\n+  // uploading a fixed-path test/prod bundle for human verification.\n   if (meta.dataMode !== 'api' || meta.bridgeMode !== 'native' ||\n-      (target === 'test' && (!meta.apiBaseConfigured || !meta.buddyPublicOriginConfigured)) ||\n       existsSync(join(root, 'mockServiceWorker.js'))) {\n     throw new Error('Formal H5 cannot ship Mock or invalid Native bridge')\n   }",
      "actualWorkers": 2
    },
    "preserveOutput": "always",
    "projects": [
      {
        "outputDir": "/home/runner/work/dr-card-ui/dr-card-ui/test-results/artifacts",
        "repeatEach": 1,
        "retries": 1,
        "metadata": {
          "ci": {
            "commitHref": "https://github.com/dangjingtao/dr-card-ui/commit/0286fc15701e7e54df9118255266d2f906b7547d",
            "commitHash": "0286fc15701e7e54df9118255266d2f906b7547d",
            "prHref": "https://github.com/dangjingtao/dr-card-ui/pull/186",
            "prTitle": "fix(test/oss): #171 静态上传不再被业务配置门禁",
            "prBaseHash": "41bbd16de6ab876ec5bdeb834eca6be67477eade",
            "buildHref": "https://github.com/dangjingtao/dr-card-ui/actions/runs/38033303887"
          },
          "gitCommit": {
            "shortHash": "0286fc1",
            "hash": "0286fc15701e7e54df9118255266d2f906b7547d",
            "subject": "Merge d1ff3506f508f9ac64c46989e01b37243e39760d into 41bbd16de6ab876ec5bdeb834eca6be67477eade",
            "body": "Merge d1ff3506f508f9ac64c46989e01b37243e39760d into 41bbd16de6ab876ec5bdeb834eca6be67477eade\n",
            "author": {
              "name": "Tomz Dang",
              "email": "dangjingtao@163.com",
              "time": 1791616016000
            },
            "committer": {
              "name": "GitHub",
              "email": "noreply@github.com",
              "time": 1791616016000
            },
            "branch": "HEAD"
          },
          "gitDiff": "diff --git a/.github/workflows/oss-web-nonprod.yml b/.github/workflows/oss-web-nonprod.yml\nindex 9429424..48dc077 100644\n--- a/.github/workflows/oss-web-nonprod.yml\n+++ b/.github/workflows/oss-web-nonprod.yml\n@@ -79,8 +79,8 @@ jobs:\n     needs: package-check\n     runs-on: ubuntu-latest\n     timeout-minutes: 25\n-    # Each environment requires its own NON-production OSS credentials.\n-    # Never use oss-production or fallback to production credentials.\n+    # Repository-level OSS credentials may publish the guarded nonproduction prefixes.\n+    # Environment-level secrets can still override them later for stricter RAM isolation.\n     environment:\n       name: oss-${{ github.ref_name == 'preview' && 'ui' || github.ref_name }}\n     env:\n@@ -88,8 +88,6 @@ jobs:\n       OSS_ENDPOINT: https://oss-cn-guangzhou.aliyuncs.com\n       OSS_ACCESS_KEY_ID: ${{ secrets.OSS_ACCESS_KEY_ID }}\n       OSS_ACCESS_KEY_SECRET: ${{ secrets.OSS_ACCESS_KEY_SECRET }}\n-      VITE_API_BASE_URL: ${{ vars.OSS_API_BASE_URL }}\n-      VITE_BUDDY_PUBLIC_ORIGIN: ${{ vars.OSS_PUBLIC_ORIGIN }}\n       OSS_WEB_TARGET: ${{ github.ref_name == 'preview' && 'ui' || github.ref_name }}\n       H5_OSS_ARTIFACT: '1'\n     steps:\n@@ -98,7 +96,7 @@ jobs:\n         with:\n           node-version: 20\n           cache: npm\n-      - name: Require dedicated nonproduction credentials and test API config\n+      - name: Require OSS credentials and guarded branch/target pair\n         shell: bash\n         run: |\n           set -euo pipefail\n@@ -108,10 +106,6 @@ jobs:\n             preview:ui|dev:dev|test:test) ;;\n             *) echo \"::error::Wrong branch/target pair\"; exit 1 ;;\n           esac\n-          if [[ \"$OSS_WEB_TARGET\" == \"test\" ]]; then\n-            [[ \"$VITE_API_BASE_URL\" == https://* ]] || { echo \"::error::oss-test requires OSS_API_BASE_URL HTTPS\"; exit 1; }\n-            [[ \"$VITE_BUDDY_PUBLIC_ORIGIN\" == https://* ]] || { echo \"::error::oss-test requires OSS_PUBLIC_ORIGIN HTTPS\"; exit 1; }\n-          fi\n       - run: npm ci --no-audit --no-fund\n       - name: Build and verify environment-specific web package\n         shell: bash\n@@ -143,5 +137,5 @@ jobs:\n             echo \"OSS: \\`oss://kbs-sdl/kbs-web/$OSS_WEB_TARGET/\\`\"\n             echo \"Source: \\`$GITHUB_SHA\\` · Run: \\`$GITHUB_RUN_ID.$GITHUB_RUN_ATTEMPT\\`\"\n             echo \"All package bytes read back from OSS. The index is uploaded last; no keys were deleted.\"\n-            echo \"Public web domain, HTTPS, SPA fallback and App WebView remain external acceptance items.\"\n+            echo \"API/origin readiness, public domain, SPA fallback and App WebView remain separate acceptance items.\"\n           } >> \"$GITHUB_STEP_SUMMARY\"\ndiff --git a/docs/deploy/oss-web-fixed-nonprod.md b/docs/deploy/oss-web-fixed-nonprod.md\nindex 7748585..fa2c0a4 100644\n--- a/docs/deploy/oss-web-fixed-nonprod.md\n+++ b/docs/deploy/oss-web-fixed-nonprod.md\n@@ -12,7 +12,7 @@ Bucket `kbs-sdl`（`cn-guangzhou`）：\n | --- | --- | --- | --- |\n | `preview` | `kbs-web/ui/` | `preview` | Mock / Disabled |\n | `dev` | `kbs-web/dev/` | `dev` | 默认 Mock / Disabled |\n-| `test` | `kbs-web/test/` | `test` | 真实 API / Native |\n+| `test` | `kbs-web/test/` | `test` | API 模式 / Native；API 连通性单独验收 |\n | `prod` | `kbs-web/prod/last/` | `prod` | **仅构建验证，暂不接入新部署** |\n \n 示例：`http://kbs.3cgroup.cn/kbs-web/ui/` 等需要公司端将 URL 精确映射到上述对象前缀，且服务器对 SPA 路由做对应目录的 fallback，不能把静态资源 404 伪装成 HTML。优先启用 HTTPS。当前属于待公司验证的**目标地址**，不能用 CI 成功代替公网真实页面验证。\n@@ -21,7 +21,7 @@ Bucket `kbs-sdl`（`cn-guangzhou`）：\n \n ## GitHub 环境准备（必须由仓库/云账号管理员完成）\n \n-**#171 更新**：非生产推送会实际尝试上传；取消 `OSS_WEB_NONPROD_ENABLED` 开关。缺少所属环境 OSS 凭据时，部署作业明确失败，不能用 CI 打包成功代替真实发布。仍使用不同环境的 OSS 身份，不借用生产密钥，不做对象删除。\n+**#171 更新**：非生产推送会实际尝试上传；取消 `OSS_WEB_NONPROD_ENABLED` 开关。缺少 OSS 凭据时部署作业明确失败，不能用 CI 打包成功代替真实发布。当前可由 Repository secrets 统一提供 OSS AK；`oss-ui/dev/test` Environment 继续承载环境边界，未来如需更强 RAM 隔离，可用同名 Environment secrets 覆盖。发布脚本不做对象删除。\n \n 首次执行自动部署前，在 GitHub Settings → Environments 创建：\n \n@@ -29,16 +29,14 @@ Bucket `kbs-sdl`（`cn-guangzhou`）：\n - `oss-dev`：只允许 `dev` 分支；\n - `oss-test`：只允许 `test` 分支。\n \n-每套环境应具有自己的最小权限发布身份，限制**只操作该环境的** `kbs-web/ui/*`、`kbs-web/dev/*` 或 `kbs-web/test/*`。不得复用拥有 `kbs-web/prod/*` 写/删权限的生产密钥。\n+当前可以使用 Repository-level OSS 凭据完成非生产固定目录发布；代码仍强制 `preview→ui`、`dev→dev`、`test→test`，且不执行删除。若后续需要云侧最小权限隔离，再为三个 Environment 配置同名、仅限各自前缀的 RAM 凭据即可，无需改变工作流。\n \n-| GitHub Environment 参数 | 类型 | 要求 |\n+| GitHub 参数 | 类型 | 要求 |\n | --- | --- | --- |\n-| `OSS_ACCESS_KEY_ID` | Secret | 仅该环境拥有写/读所属前缀权限 |\n-| `OSS_ACCESS_KEY_SECRET` | Secret | 对应密钥，不进入源代码、`VITE_*` 或公开日志 |\n-| `OSS_API_BASE_URL` | Variable | `test` 必须填写真实测试后端 HTTPS API；ui/dev 按需 |\n-| `OSS_PUBLIC_ORIGIN` | Variable | `test` 必须填写真实有效 HTTPS Origin，用于搭子邀请；ui/dev 按需 |\n+| `OSS_ACCESS_KEY_ID` | Repository 或 Environment Secret | OSS 写/读凭据；Environment 同名值可覆盖仓库级值 |\n+| `OSS_ACCESS_KEY_SECRET` | Repository 或 Environment Secret | 对应密钥，不进入源代码、`VITE_*` 或公开日志 |\n \n-未正确配置时，部署作业**明确失败**；不借用 `oss-production`，不伪装成功，不隐式使用示例 API。项目原有 `Build` 与 CF 部署工作流继续保留。\n+缺少 OSS 凭据时部署作业**明确失败**。测试 API / 邀请 Origin 不再作为静态包上传前置：固定目录可以先落 OSS 并完成人工页面验证，`build-meta.json` 会如实记录 API / Origin 是否配置；真实业务连通性继续在 #171 单独验收。项目原有 `Build` 与 CF 部署工作流继续保留。\n \n ## CI / 发布流程\n \ndiff --git a/scripts/build-h5.mjs b/scripts/build-h5.mjs\nindex 0fa2d60..8e25a15 100644\n--- a/scripts/build-h5.mjs\n+++ b/scripts/build-h5.mjs\n@@ -119,7 +119,7 @@ const apiBaseUrl =\n   cloudflareBuildContext && (target.appEnvironment === 'dev' || target.appEnvironment === 'preview')\n     ? ''\n     : configuredApiBaseUrl\n-if (target.appEnvironment === 'test' && !apiBaseUrl) {\n+if (target.appEnvironment === 'test' && !apiBaseUrl && !ossWebTarget) {\n   errors.push('test builds require VITE_API_BASE_URL; a production-like test bundle must target a real backend.')\n }\n if (apiBaseUrl) {\n@@ -134,7 +134,7 @@ if (apiBaseUrl) {\n }\n \n const publicOrigin = readEnv('VITE_BUDDY_PUBLIC_ORIGIN')?.trim() ?? ''\n-if (dataMode === 'api' && prodLike && !publicOrigin && ossWebTarget !== 'prod') {\n+if (dataMode === 'api' && prodLike && !publicOrigin && !ossWebTarget) {\n   errors.push(`${target.appEnvironment} API builds require VITE_BUDDY_PUBLIC_ORIGIN.`)\n }\n if (publicOrigin) {\ndiff --git a/scripts/verify-oss-web-package.mjs b/scripts/verify-oss-web-package.mjs\nindex 717beca..bc922e2 100644\n--- a/scripts/verify-oss-web-package.mjs\n+++ b/scripts/verify-oss-web-package.mjs\n@@ -19,10 +19,9 @@ if (meta.appEnvironment !== allowed[target] ||\n   throw new Error(`OSS package build identity mismatch for ${target}`)\n }\n if (target === 'test' || target === 'prod') {\n-  // API origin readiness is checked during business acceptance, not before\n-  // someone can upload a fixed-path prod bundle for human verification.\n+  // API/origin readiness is business acceptance, not a prerequisite for\n+  // uploading a fixed-path test/prod bundle for human verification.\n   if (meta.dataMode !== 'api' || meta.bridgeMode !== 'native' ||\n-      (target === 'test' && (!meta.apiBaseConfigured || !meta.buddyPublicOriginConfigured)) ||\n       existsSync(join(root, 'mockServiceWorker.js'))) {\n     throw new Error('Formal H5 cannot ship Mock or invalid Native bridge')\n   }",
          "actualWorkers": 2
        },
        "id": "chromium-mobile",
        "name": "chromium-mobile",
        "testDir": "/home/runner/work/dr-card-ui/dr-card-ui/tests/e2e",
        "testIgnore": [],
        "testMatch": [
          "**/*.@(spec|test).?(c|m)[jt]s?(x)"
        ],
        "timeout": 30000
      }
    ],
    "quiet": false,
    "reporter": [
      [
        "line",
        null
      ],
      [
        "html",
        {
          "outputFolder": "playwright-report",
          "open": "never"
        }
      ],
      [
        "json",
        {
          "outputFile": "test-results/playwright-results.json"
        }
      ]
    ],
    "reportSlowTests": {
      "max": 5,
      "threshold": 300000
    },
    "shard": null,
    "tags": [],
    "updateSnapshots": "missing",
    "updateSourceMethod": "patch",
    "version": "1.63.0",
    "workers": 2,
    "webServer": null
  },
  "suites": [
    {
      "title": "test-gate.spec.ts",
      "file": "test-gate.spec.ts",
      "column": 0,
      "line": 0,
      "specs": [
        {
          "title": "@test-gate build identity matches the production-like test policy",
          "ok": true,
          "tags": [
            "test-gate"
          ],
          "tests": [
            {
              "timeout": 30000,
              "annotations": [],
              "expectedStatus": "passed",
              "projectId": "chromium-mobile",
              "projectName": "chromium-mobile",
              "results": [
                {
                  "workerIndex": 0,
                  "parallelIndex": 0,
                  "status": "passed",
                  "duration": 48,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-10-10T07:07:59.108Z",
                  "annotations": [],
                  "attachments": []
                }
              ],
              "status": "expected"
            }
          ],
          "id": "37c772ca39f4c8e5dd7a-c3b6e0ce5d8c5d8734e5",
          "file": "test-gate.spec.ts",
          "line": 31,
          "column": 1
        },
        {
          "title": "@test-gate browser entry does not start the app router",
          "ok": true,
          "tags": [
            "test-gate"
          ],
          "tests": [
            {
              "timeout": 30000,
              "annotations": [],
              "expectedStatus": "passed",
              "projectId": "chromium-mobile",
              "projectName": "chromium-mobile",
              "results": [
                {
                  "workerIndex": 1,
                  "parallelIndex": 1,
                  "status": "passed",
                  "duration": 1065,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-10-10T07:07:59.108Z",
                  "annotations": [],
                  "attachments": []
                }
              ],
              "status": "expected"
            }
          ],
          "id": "37c772ca39f4c8e5dd7a-8ed37c8041402a2a6b34",
          "file": "test-gate.spec.ts",
          "line": 40,
          "column": 1
        },
        {
          "title": "@test-gate / shows the unsupported-host notice in a browser",
          "ok": true,
          "tags": [
            "test-gate"
          ],
          "tests": [
            {
              "timeout": 30000,
              "annotations": [],
              "expectedStatus": "passed",
              "projectId": "chromium-mobile",
              "projectName": "chromium-mobile",
              "results": [
                {
                  "workerIndex": 0,
                  "parallelIndex": 0,
                  "status": "passed",
                  "duration": 1106,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-10-10T07:07:59.203Z",
                  "annotations": [],
                  "attachments": []
                }
              ],
              "status": "expected"
            }
          ],
          "id": "37c772ca39f4c8e5dd7a-b030d57053896c93a550",
          "file": "test-gate.spec.ts",
          "line": 51,
          "column": 3
        },
        {
          "title": "@test-gate /profile shows the unsupported-host notice in a browser",
          "ok": true,
          "tags": [
            "test-gate"
          ],
          "tests": [
            {
              "timeout": 30000,
              "annotations": [],
              "expectedStatus": "passed",
              "projectId": "chromium-mobile",
              "projectName": "chromium-mobile",
              "results": [
                {
                  "workerIndex": 1,
                  "parallelIndex": 1,
                  "status": "passed",
                  "duration": 1007,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-10-10T07:08:00.471Z",
                  "annotations": [],
                  "attachments": []
                }
              ],
              "status": "expected"
            }
          ],
          "id": "37c772ca39f4c8e5dd7a-8605535a2807e17fcccc",
          "file": "test-gate.spec.ts",
          "line": 51,
          "column": 3
        },
        {
          "title": "@test-gate /settings shows the unsupported-host notice in a browser",
          "ok": true,
          "tags": [
            "test-gate"
          ],
          "tests": [
            {
              "timeout": 30000,
              "annotations": [],
              "expectedStatus": "passed",
              "projectId": "chromium-mobile",
              "projectName": "chromium-mobile",
              "results": [
                {
                  "workerIndex": 0,
                  "parallelIndex": 0,
                  "status": "passed",
                  "duration": 964,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-10-10T07:08:00.506Z",
                  "annotations": [],
                  "attachments": []
                }
              ],
              "status": "expected"
            }
          ],
          "id": "37c772ca39f4c8e5dd7a-4a2fdc9884c1725de4f8",
          "file": "test-gate.spec.ts",
          "line": 51,
          "column": 3
        },
        {
          "title": "@test-gate gated browser entry issues no business API request",
          "ok": true,
          "tags": [
            "test-gate"
          ],
          "tests": [
            {
              "timeout": 30000,
              "annotations": [],
              "expectedStatus": "passed",
              "projectId": "chromium-mobile",
              "projectName": "chromium-mobile",
              "results": [
                {
                  "workerIndex": 0,
                  "parallelIndex": 0,
                  "status": "passed",
                  "duration": 980,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-10-10T07:08:01.493Z",
                  "annotations": [],
                  "attachments": []
                }
              ],
              "status": "expected"
            }
          ],
          "id": "37c772ca39f4c8e5dd7a-09f38a2b8ed735e192d8",
          "file": "test-gate.spec.ts",
          "line": 65,
          "column": 1
        },
        {
          "title": "@test-gate injected native host bypasses the notice and starts the app",
          "ok": true,
          "tags": [
            "test-gate"
          ],
          "tests": [
            {
              "timeout": 30000,
              "annotations": [],
              "expectedStatus": "passed",
              "projectId": "chromium-mobile",
              "projectName": "chromium-mobile",
              "results": [
                {
                  "workerIndex": 1,
                  "parallelIndex": 1,
                  "status": "passed",
                  "duration": 1023,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-10-10T07:08:01.503Z",
                  "annotations": [],
                  "attachments": []
                }
              ],
              "status": "expected"
            }
          ],
          "id": "37c772ca39f4c8e5dd7a-8caf237c4d42513fff2f",
          "file": "test-gate.spec.ts",
          "line": 80,
          "column": 1
        }
      ]
    }
  ],
  "errors": [],
  "stats": {
    "startTime": "2026-10-10T07:07:58.227Z",
    "duration": 4358.237999999999,
    "expected": 7,
    "skipped": 0,
    "unexpected": 0,
    "flaky": 0
  }
}