{
  "config": {
    "argv": [
      "/opt/hostedtoolcache/node/20.20.2/x64/bin/node",
      "/home/runner/work/dr-card-web/dr-card-web/node_modules/.bin/playwright",
      "test",
      "tests/e2e/test-gate.spec.ts"
    ],
    "configFile": "/home/runner/work/dr-card-web/dr-card-web/playwright.config.ts",
    "rootDir": "/home/runner/work/dr-card-web/dr-card-web/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/sanchuang-dev/dr-card-web/commit/94fe026d3b47d511fbc9defcf457ac5851d3884e",
        "commitHash": "94fe026d3b47d511fbc9defcf457ac5851d3884e",
        "prHref": "https://github.com/sanchuang-dev/dr-card-web/pull/292",
        "prTitle": "test｜TabBar 扫码参数收窄为 QR",
        "prBaseHash": "0f7b6fb0609284bd1ca147acccc5ace65f064a06",
        "buildHref": "https://github.com/sanchuang-dev/dr-card-web/actions/runs/42537917618"
      },
      "gitCommit": {
        "shortHash": "94fe026",
        "hash": "94fe026d3b47d511fbc9defcf457ac5851d3884e",
        "subject": "Merge 895dae6fe4789f744c32d930f56911f51ba4e32a into 0f7b6fb0609284bd1ca147acccc5ace65f064a06",
        "body": "Merge 895dae6fe4789f744c32d930f56911f51ba4e32a into 0f7b6fb0609284bd1ca147acccc5ace65f064a06\n",
        "author": {
          "name": "Tomz Dang",
          "email": "dangjingtao@163.com",
          "time": 1794182460000
        },
        "committer": {
          "name": "GitHub",
          "email": "noreply@github.com",
          "time": 1794182460000
        },
        "branch": "HEAD"
      },
      "gitDiff": "diff --git a/src/components/mobile/BottomNav.test.tsx b/src/components/mobile/BottomNav.test.tsx\nindex c6a3c1a..1cbed4d 100644\n--- a/src/components/mobile/BottomNav.test.tsx\n+++ b/src/components/mobile/BottomNav.test.tsx\n@@ -53,7 +53,7 @@ describe('BottomNav middle scan item', () => {\n     fireEvent.click(button)\n \n     await waitFor(() => {\n-      expect(bridgeMocks.scanCode).toHaveBeenCalledWith({ scanType: 'all' })\n+      expect(bridgeMocks.scanCode).toHaveBeenCalledWith({ scanType: 'qr' })\n     })\n   })\n \ndiff --git a/src/components/mobile/BottomNav.tsx b/src/components/mobile/BottomNav.tsx\nindex d0eaa41..25750c0 100644\n--- a/src/components/mobile/BottomNav.tsx\n+++ b/src/components/mobile/BottomNav.tsx\n@@ -93,7 +93,7 @@ export default function BottomNav({ variant = 'main' }: { variant?: 'main' | 'le\n     if (!getNativeBridgeDiagnostics().capabilities.scanCode) return\n \n     try {\n-      await scanCode({ scanType: 'all' })\n+      await scanCode({ scanType: 'qr' })\n     } catch {\n       // 扫码取消 / 失败 / 超时均静默回落到当前页，不新增反馈链路。\n     }\ndiff --git a/src/pages/ScanVerify.test.tsx b/src/pages/ScanVerify.test.tsx\nindex 3208786..299e9fa 100644\n--- a/src/pages/ScanVerify.test.tsx\n+++ b/src/pages/ScanVerify.test.tsx\n@@ -111,7 +111,7 @@ describe('ScanVerify', () => {\n     fireEvent.click(screen.getByRole('button', { name: '开始扫码核销' }))\n \n     await waitFor(() => {\n-      expect(mocks.scanCode).toHaveBeenCalledWith({ scanType: 'all' })\n+      expect(mocks.scanCode).toHaveBeenCalledWith({ scanType: 'qr' })\n     })\n     expect(mocks.navigate).toHaveBeenCalledWith('/card/verify/confirm', {\n       replace: true,\n@@ -140,6 +140,7 @@ describe('ScanVerify', () => {\n         state: { nativeScanCode: 'IOS-SCAN-CODE' },\n       })\n     })\n+    expect(mocks.scanCode).toHaveBeenCalledWith({ scanType: 'qr' })\n     expect(mocks.navigate).not.toHaveBeenCalledWith(\n       '/card/verify/confirm',\n       expect.objectContaining({\ndiff --git a/src/pages/ScanVerify.tsx b/src/pages/ScanVerify.tsx\nindex d2f527d..0eac3a8 100644\n--- a/src/pages/ScanVerify.tsx\n+++ b/src/pages/ScanVerify.tsx\n@@ -48,7 +48,7 @@ export default function ScanVerify() {\n \n     try {\n       const host = getNativeHost()\n-      const result = await scanCode({ scanType: 'all' })\n+      const result = await scanCode({ scanType: 'qr' })\n \n       if (host === 'android') {\n         const state: ScanVerifyNavigationState = {\n@@ -86,7 +86,7 @@ export default function ScanVerify() {\n     ? '当前 App 版本暂不支持扫码'\n     : scanning\n       ? '正在调用系统扫码…'\n-      : error ?? '将二维码 / 条形码对准扫描框，点击开始扫码'\n+      : error ?? '将二维码对准扫描框，点击开始扫码'\n \n   return (\n     <div className=\"relative min-h-full bg-black text-white\">",
      "actualWorkers": 2
    },
    "preserveOutput": "always",
    "projects": [
      {
        "outputDir": "/home/runner/work/dr-card-web/dr-card-web/test-results/artifacts",
        "repeatEach": 1,
        "retries": 1,
        "metadata": {
          "ci": {
            "commitHref": "https://github.com/sanchuang-dev/dr-card-web/commit/94fe026d3b47d511fbc9defcf457ac5851d3884e",
            "commitHash": "94fe026d3b47d511fbc9defcf457ac5851d3884e",
            "prHref": "https://github.com/sanchuang-dev/dr-card-web/pull/292",
            "prTitle": "test｜TabBar 扫码参数收窄为 QR",
            "prBaseHash": "0f7b6fb0609284bd1ca147acccc5ace65f064a06",
            "buildHref": "https://github.com/sanchuang-dev/dr-card-web/actions/runs/42537917618"
          },
          "gitCommit": {
            "shortHash": "94fe026",
            "hash": "94fe026d3b47d511fbc9defcf457ac5851d3884e",
            "subject": "Merge 895dae6fe4789f744c32d930f56911f51ba4e32a into 0f7b6fb0609284bd1ca147acccc5ace65f064a06",
            "body": "Merge 895dae6fe4789f744c32d930f56911f51ba4e32a into 0f7b6fb0609284bd1ca147acccc5ace65f064a06\n",
            "author": {
              "name": "Tomz Dang",
              "email": "dangjingtao@163.com",
              "time": 1794182460000
            },
            "committer": {
              "name": "GitHub",
              "email": "noreply@github.com",
              "time": 1794182460000
            },
            "branch": "HEAD"
          },
          "gitDiff": "diff --git a/src/components/mobile/BottomNav.test.tsx b/src/components/mobile/BottomNav.test.tsx\nindex c6a3c1a..1cbed4d 100644\n--- a/src/components/mobile/BottomNav.test.tsx\n+++ b/src/components/mobile/BottomNav.test.tsx\n@@ -53,7 +53,7 @@ describe('BottomNav middle scan item', () => {\n     fireEvent.click(button)\n \n     await waitFor(() => {\n-      expect(bridgeMocks.scanCode).toHaveBeenCalledWith({ scanType: 'all' })\n+      expect(bridgeMocks.scanCode).toHaveBeenCalledWith({ scanType: 'qr' })\n     })\n   })\n \ndiff --git a/src/components/mobile/BottomNav.tsx b/src/components/mobile/BottomNav.tsx\nindex d0eaa41..25750c0 100644\n--- a/src/components/mobile/BottomNav.tsx\n+++ b/src/components/mobile/BottomNav.tsx\n@@ -93,7 +93,7 @@ export default function BottomNav({ variant = 'main' }: { variant?: 'main' | 'le\n     if (!getNativeBridgeDiagnostics().capabilities.scanCode) return\n \n     try {\n-      await scanCode({ scanType: 'all' })\n+      await scanCode({ scanType: 'qr' })\n     } catch {\n       // 扫码取消 / 失败 / 超时均静默回落到当前页，不新增反馈链路。\n     }\ndiff --git a/src/pages/ScanVerify.test.tsx b/src/pages/ScanVerify.test.tsx\nindex 3208786..299e9fa 100644\n--- a/src/pages/ScanVerify.test.tsx\n+++ b/src/pages/ScanVerify.test.tsx\n@@ -111,7 +111,7 @@ describe('ScanVerify', () => {\n     fireEvent.click(screen.getByRole('button', { name: '开始扫码核销' }))\n \n     await waitFor(() => {\n-      expect(mocks.scanCode).toHaveBeenCalledWith({ scanType: 'all' })\n+      expect(mocks.scanCode).toHaveBeenCalledWith({ scanType: 'qr' })\n     })\n     expect(mocks.navigate).toHaveBeenCalledWith('/card/verify/confirm', {\n       replace: true,\n@@ -140,6 +140,7 @@ describe('ScanVerify', () => {\n         state: { nativeScanCode: 'IOS-SCAN-CODE' },\n       })\n     })\n+    expect(mocks.scanCode).toHaveBeenCalledWith({ scanType: 'qr' })\n     expect(mocks.navigate).not.toHaveBeenCalledWith(\n       '/card/verify/confirm',\n       expect.objectContaining({\ndiff --git a/src/pages/ScanVerify.tsx b/src/pages/ScanVerify.tsx\nindex d2f527d..0eac3a8 100644\n--- a/src/pages/ScanVerify.tsx\n+++ b/src/pages/ScanVerify.tsx\n@@ -48,7 +48,7 @@ export default function ScanVerify() {\n \n     try {\n       const host = getNativeHost()\n-      const result = await scanCode({ scanType: 'all' })\n+      const result = await scanCode({ scanType: 'qr' })\n \n       if (host === 'android') {\n         const state: ScanVerifyNavigationState = {\n@@ -86,7 +86,7 @@ export default function ScanVerify() {\n     ? '当前 App 版本暂不支持扫码'\n     : scanning\n       ? '正在调用系统扫码…'\n-      : error ?? '将二维码 / 条形码对准扫描框，点击开始扫码'\n+      : error ?? '将二维码对准扫描框，点击开始扫码'\n \n   return (\n     <div className=\"relative min-h-full bg-black text-white\">",
          "actualWorkers": 2
        },
        "id": "chromium-mobile",
        "name": "chromium-mobile",
        "testDir": "/home/runner/work/dr-card-web/dr-card-web/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": 43,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-11-09T00:02:55.486Z",
                  "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": 1334,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-11-09T00:02:55.486Z",
                  "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": 1361,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-11-09T00:02:55.574Z",
                  "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": 1114,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-11-09T00:02:57.556Z",
                  "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": 1110,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-11-09T00:02:57.567Z",
                  "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": 1,
                  "parallelIndex": 1,
                  "status": "passed",
                  "duration": 998,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-11-09T00:02:58.693Z",
                  "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": 0,
                  "parallelIndex": 0,
                  "status": "passed",
                  "duration": 1092,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-11-09T00:02:58.696Z",
                  "annotations": [],
                  "attachments": []
                }
              ],
              "status": "expected"
            }
          ],
          "id": "37c772ca39f4c8e5dd7a-8caf237c4d42513fff2f",
          "file": "test-gate.spec.ts",
          "line": 80,
          "column": 1
        }
      ]
    }
  ],
  "errors": [],
  "stats": {
    "startTime": "2026-11-09T00:02:54.769Z",
    "duration": 5077.627,
    "expected": 7,
    "skipped": 0,
    "unexpected": 0,
    "flaky": 0
  }
}