{
  "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/ececd194234fbb416aa8493340572a09808b8acd",
        "commitHash": "ececd194234fbb416aa8493340572a09808b8acd",
        "prHref": "https://github.com/sanchuang-dev/dr-card-web/pull/229",
        "prTitle": "release(test): 晋级 V8 紧凑橙色自然周签到卡",
        "prBaseHash": "00a3763bba4e0a9e2e70f21b74a1748120c5c9ea",
        "buildHref": "https://github.com/sanchuang-dev/dr-card-web/actions/runs/38534536530"
      },
      "gitCommit": {
        "shortHash": "ececd19",
        "hash": "ececd194234fbb416aa8493340572a09808b8acd",
        "subject": "Merge fb494f05b44010c519fb3d98aa9e2a9da41d8ac3 into 00a3763bba4e0a9e2e70f21b74a1748120c5c9ea",
        "body": "Merge fb494f05b44010c519fb3d98aa9e2a9da41d8ac3 into 00a3763bba4e0a9e2e70f21b74a1748120c5c9ea\n",
        "author": {
          "name": "Tomz Dang",
          "email": "dangjingtao@163.com",
          "time": 1791966088000
        },
        "committer": {
          "name": "GitHub",
          "email": "noreply@github.com",
          "time": 1791966088000
        },
        "branch": "HEAD"
      },
      "gitDiff": "diff --git a/src/pages/checkin/components/CheckinBoard.test.tsx b/src/pages/checkin/components/CheckinBoard.test.tsx\nindex 36031cf..e0aa588 100644\n--- a/src/pages/checkin/components/CheckinBoard.test.tsx\n+++ b/src/pages/checkin/components/CheckinBoard.test.tsx\n@@ -96,7 +96,7 @@ describe('Issue #220: homepage natural week entry', () => {\n     expect(entry.textContent).toContain('周奖励以后台活动规则为准')\n   })\n \n-  it('distinguishes completed-today and signed-day chip from their card backgrounds', () => {\n+  it('renders V8 short day tiles, dates only for today, signed check for earlier dates, and API-driven points', () => {\n     vi.useFakeTimers()\n     vi.setSystemTime(new Date(2026, 9, 14, 12))\n     render(\n@@ -106,20 +106,61 @@ describe('Issue #220: homepage natural week entry', () => {\n           weekRecordsState=\"success\"\n           records={[\n             { id: 1, user_id: 3, points: 10, consecutive_days: 1, status: 10, year: '2026', month: '10', day: '12' },\n-            { id: 2, user_id: 3, points: 10, consecutive_days: 3, status: 10, year: '2026', month: '10', day: '14' },\n+            { id: 2, user_id: 3, points: 30, consecutive_days: 3, status: 10, year: '2026', month: '10', day: '14' },\n           ]}\n-          signStatus={{ signed: true, consecutiveDays: 3, points: 10, rewardDesc: '' }}\n+          signStatus={{ signed: true, consecutiveDays: 3, points: 30, rewardDesc: '' }}\n         />\n       </MemoryRouter>,\n     )\n \n     const today = document.querySelector('[data-checkin-week-day=\"2026-10-14\"]')\n     const monday = document.querySelector('[data-checkin-week-day=\"2026-10-12\"]')\n-    expect(today?.textContent).toContain('已签')\n-    expect(today?.querySelector('svg')).not.toBeNull()\n-    expect(monday?.querySelector(':scope > span:nth-child(2)')?.className).toContain('bg-[var(--premium-100)]')\n-    expect(screen.getByText('签到详情')).toBeTruthy()\n+    expect(today?.textContent).toContain('14')\n+    expect(today?.textContent).not.toContain('今天')\n+    expect(today?.textContent).not.toContain('已签')\n+    expect(today?.querySelector('svg')).toBeNull()\n+    expect(today?.className).toContain('min-h-[65px]')\n+    expect(monday?.querySelector('svg')).not.toBeNull()\n+    expect(screen.getByText('+30')).toBeTruthy()\n+    expect(screen.getByText('查看月历')).toBeTruthy()\n+    expect(screen.queryByText('签到详情')).toBeNull()\n     expect(screen.queryByText('签到规则')).toBeNull()\n   })\n \n+  it('never fills missing daily points with a guessed +10', () => {\n+    vi.useFakeTimers()\n+    vi.setSystemTime(new Date(2026, 9, 14, 12))\n+    render(\n+      <MemoryRouter>\n+        <CheckinBoard mode=\"home\" weekRecordsState=\"error\" records={null} signStatus={null} />\n+      </MemoryRouter>,\n+    )\n+    const entry = screen.getByRole('button', { name: '查看本周签到，进入本月签到日历' })\n+    expect(entry.textContent).toContain('—/7')\n+    expect(entry.textContent).toContain('签到记录暂不可用')\n+    expect(entry.textContent).toContain('每日签到 · 领取泡泡值')\n+    expect(entry.textContent).not.toContain('+10')\n+  })\n+\n+  it('keeps loading distinct from failure and hides confirmed zero points', () => {\n+    vi.useFakeTimers()\n+    vi.setSystemTime(new Date(2026, 9, 14, 12))\n+    render(\n+      <MemoryRouter>\n+        <CheckinBoard\n+          mode=\"home\"\n+          weekRecordsState=\"loading\"\n+          records={null}\n+          signStatus={{ signed: false, consecutiveDays: 0, points: 0, rewardDesc: '' }}\n+        />\n+      </MemoryRouter>,\n+    )\n+\n+    const entry = screen.getByRole('button', { name: '查看本周签到，进入本月签到日历' })\n+    expect(entry.textContent).toContain('—/7')\n+    expect(entry.textContent).toContain('签到记录加载中')\n+    expect(entry.textContent).not.toContain('签到记录暂不可用')\n+    expect(entry.textContent).not.toContain('+0')\n+  })\n+\n })\ndiff --git a/src/pages/checkin/components/CheckinBoard.tsx b/src/pages/checkin/components/CheckinBoard.tsx\nindex 836034b..04074c7 100644\n--- a/src/pages/checkin/components/CheckinBoard.tsx\n+++ b/src/pages/checkin/components/CheckinBoard.tsx\n@@ -380,98 +380,80 @@ export default function CheckinBoard({\n           aria-label={weeklyCompletedDays === null\n             ? '查看本周签到，进入本月签到日历'\n             : '查看本周签到，已签到 ' + weeklyCompletedDays + ' / 7 天，进入本月签到日历'}\n-          className=\"mx-4 block w-[calc(100%-2rem)] rounded-[21px] border border-border-subtle bg-checkin-home-surface px-[15px] pb-3.5 pt-4 text-left shadow-bubble transition active:scale-[0.995] active:bg-surface-pressed max-[350px]:px-2.5\"\n+          className=\"mx-4 block w-[calc(100%-2rem)] rounded-[22px] border border-border-subtle bg-checkin-home-surface px-3.5 pb-3 pt-4 text-left shadow-bubble transition active:bg-surface-pressed max-[350px]:px-2.5\"\n         >\n-          {/* UIUX-1014：将已验收的 375px 七日视觉移植到 #220 的真实自然周签到数据。 */}\n-          <span className=\"flex flex-wrap items-center justify-between gap-x-2 gap-y-2\">\n-            <span className=\"flex min-w-0 items-center gap-2\">\n-              <span className=\"flex h-[34px] w-[34px] flex-none items-center justify-center rounded-[10px] bg-reward-subtle text-reward-strong\" aria-hidden>\n-                <CalendarDays className=\"h-[19px] w-[19px]\" />\n-              </span>\n-              <span className=\"whitespace-nowrap text-[18px] font-bold tracking-tight text-text-primary max-[350px]:text-[16px]\">本周签到</span>\n-              <span className=\"whitespace-nowrap text-[17px] font-bold tabular-nums text-reward-text\">\n-                {weeklyCompletedDays === null ? '—/7' : weeklyCompletedDays + '/7'}\n-              </span>\n+          {/* 用户确认的 V8：紧凑 65px 自然周日期卡，仅突出当天；数据仍来自真实签到接口。 */}\n+          <span className=\"flex items-center gap-2\">\n+            <span className=\"flex h-8 w-8 flex-none items-center justify-center rounded-[10px] bg-[var(--color-checkin-home-icon-surface)] text-[var(--color-checkin-home-accent)]\" aria-hidden>\n+              <CalendarDays className=\"h-5 w-5\" />\n             </span>\n-            <span className=\"flex min-h-11 flex-none items-center gap-0.5 rounded-full bg-surface-subtle px-2.5 text-xs font-medium text-text-secondary max-[350px]:px-2\">\n-              {weeklyCompletedDays === null\n-                ? weekRecordsState === 'error' ? '记录暂不可用' : '记录加载中'\n-                : weeklyCompletedDays === 7 ? '本周已满勤' : '已签到 ' + weeklyCompletedDays + ' 天'}\n-              <ChevronRight className=\"h-4 w-4\" aria-hidden />\n+            <span className=\"whitespace-nowrap text-base font-bold tracking-tight text-text-primary\">本周签到</span>\n+            <span className=\"whitespace-nowrap text-base font-bold tabular-nums text-[var(--color-checkin-home-accent-strong)]\">\n+              {weeklyCompletedDays === null ? '—/7' : weeklyCompletedDays + '/7'}\n             </span>\n           </span>\n \n-          <span className=\"mt-1 block text-xs leading-[18px] text-text-tertiary\">\n+          <span className=\"mt-2 block text-xs leading-[17px] text-text-tertiary\">\n             周一至周日 · {weekLabel}\n           </span>\n \n-          <span className=\"mt-[19px] grid grid-cols-7 gap-[3px] max-[350px]:gap-0.5\" aria-hidden>\n+          <span className=\"mt-[13px] grid grid-cols-7 gap-1 max-[350px]:gap-[3px]\" aria-hidden>\n             {cycleDays.map((item, index) => {\n               const completed = weekRecordsReady && item.signed\n               const today = item.state === 'today'\n-              const missing = weekRecordsReady && item.state === 'makeup' && !completed\n               return (\n                 <span\n                   key={item.dateKey}\n                   data-checkin-week-day={item.dateKey}\n-                  className={'flex min-h-[106px] min-w-0 flex-col items-center rounded-[13px] px-0 py-[9px] text-center max-[350px]:rounded-[10px] ' + (\n-                    today ? 'bg-checkin-home-today'\n-                      : completed ? 'bg-reward-subtle'\n-                        : 'bg-surface-subtle'\n+                  className={'flex min-h-[65px] min-w-0 flex-col items-center rounded-[11px] px-px pb-1.5 pt-[7px] max-[350px]:min-h-[63px] max-[350px]:rounded-[9px] ' + (\n+                    today ? 'bg-checkin-home-today shadow-[var(--shadow-checkin-home-today)]'\n+                      : 'bg-[var(--color-checkin-home-tile)]'\n                   )}\n                 >\n-                  <span className={'text-xs font-medium leading-4 ' + (\n-                    today ? 'text-checkin-home-today-text' : completed ? 'text-reward-text' : 'text-checkin-home-muted'\n+                  <span className={'text-[11px] font-medium leading-[14px] ' + (\n+                    today ? 'text-checkin-home-today-text' : 'text-checkin-home-muted'\n                   )}>\n                     {CHECKIN_WEEK_LABELS[index]}\n                   </span>\n-                  <span className={'mt-2.5 flex h-[34px] w-[34px] items-center justify-center rounded-full text-[15px] font-semibold tabular-nums max-[350px]:h-[30px] max-[350px]:w-[30px] ' + (\n-                    today ? 'bg-reward-subtle text-reward-text'\n-                      : completed ? 'bg-[var(--premium-100)] text-reward-text'\n-                        : 'bg-checkin-home-day-surface text-checkin-home-day-text'\n-                  )}>\n-                    {completed ? <Check className=\"h-[21px] w-[21px]\" strokeWidth={3} /> : item.day}\n-                  </span>\n-                  <span className={'mt-2.5 min-h-[15px] text-[11px] leading-[15px] ' + (\n-                    today ? 'font-semibold text-checkin-home-today-text' : completed ? 'text-reward-text' : 'text-text-tertiary'\n+                  <span className={'mt-1.5 flex h-7 w-7 flex-none items-center justify-center rounded-full text-[15px] font-semibold tabular-nums max-[350px]:h-[27px] max-[350px]:w-[27px] ' + (\n+                    today ? 'bg-[var(--color-checkin-home-today-chip)] text-[var(--color-checkin-home-today-date)]'\n+                      : 'bg-checkin-home-day-surface text-checkin-home-day-text'\n                   )}>\n-                    {completed ? '已签' : today ? '今天' : missing ? '漏签' : ''}\n+                    {completed && !today\n+                      ? <Check className=\"h-[18px] w-[18px] text-[var(--color-checkin-home-accent)]\" strokeWidth={3} aria-hidden />\n+                      : item.day}\n                   </span>\n                 </span>\n               )\n             })}\n           </span>\n \n-          <span className=\"mt-3.5 flex min-h-[70px] items-center gap-2.5 rounded-[13px] bg-reward-subtle px-2.5 py-3\">\n-            <span className=\"flex h-[30px] w-[30px] flex-none items-center justify-center text-reward-strong\" aria-hidden>\n-              <Gift className=\"h-6 w-6\" />\n+          <span className=\"mt-3.5 flex min-h-[68px] items-center gap-2.5 rounded-[13px] bg-[var(--color-checkin-home-reward-surface)] px-[11px] py-3 max-[350px]:gap-1.5 max-[350px]:px-2\">\n+            <span className=\"flex h-[34px] w-[26px] flex-none items-center justify-center text-[var(--color-checkin-home-accent)] max-[350px]:w-[22px]\" aria-hidden>\n+              <Gift className=\"h-6 w-6 max-[350px]:h-[21px] max-[350px]:w-[21px]\" />\n             </span>\n             <span className=\"min-w-0 flex-1\">\n-              <span className=\"block text-sm font-semibold leading-5 text-text-primary\">每日签到得泡泡值</span>\n-              <span className=\"mt-0.5 block text-xs leading-[18px] text-text-tertiary\">\n-                {weeklyCompletedDays === null ? '签到记录加载后显示进度' : '本周累计已签 ' + weeklyCompletedDays + ' 天'}\n+              <span className=\"flex items-baseline gap-1 whitespace-nowrap text-[13px] font-bold leading-[19px] text-text-primary max-[350px]:gap-[3px] max-[350px]:text-[11px]\">\n+                每日签到 · 领取泡泡值\n+                {signStatus && Number.isFinite(signStatus.points) && signStatus.points > 0 && (\n+                  <span className=\"tabular-nums text-[var(--color-checkin-home-accent-strong)]\">+{signStatus.points}</span>\n+                )}\n+              </span>\n+              <span className=\"mt-[3px] block text-[11px] leading-4 text-text-tertiary max-[350px]:text-[10px]\">\n+                {weeklyCompletedDays === null\n+                  ? weekRecordsState === 'error' ? '签到记录暂不可用' : '签到记录加载中'\n+                  : '本周已签到 ' + weeklyCompletedDays + ' 天'}\n               </span>\n             </span>\n-            <span className=\"flex min-h-11 flex-none items-center gap-0.5 whitespace-nowrap text-xs font-semibold text-reward-text\">\n-              查看月历 <ChevronRight className=\"h-4 w-4\" aria-hidden />\n+            <span className=\"flex min-h-[34px] flex-none items-center gap-0.5 whitespace-nowrap text-xs font-semibold text-[var(--color-checkin-home-accent-strong)] max-[350px]:text-[10px]\">\n+              查看月历\n+              <ChevronRight className=\"h-3.5 w-3.5\" aria-hidden />\n             </span>\n           </span>\n \n-          <span className=\"flex min-h-11 items-center justify-between gap-2 px-0.5 text-xs text-text-tertiary\">\n-            <span className=\"min-w-0\">周奖励以后台活动规则为准</span>\n-            <span className=\"flex flex-none items-center gap-0.5 text-reward-text\">签到详情 <ChevronRight className=\"h-3.5 w-3.5\" aria-hidden /></span>\n+          <span className=\"mt-[11px] block px-0.5 text-xs leading-[18px] text-text-tertiary\">\n+            周奖励以后台活动规则为准\n           </span>\n-          {signStatus && (\n-            <span\n-              data-checkin-sign-status={signStatus.signed ? 'signed' : 'unsigned'}\n-              className={'flex items-center gap-1 border-t border-border-subtle pt-2 text-xs leading-5 ' + (\n-                signStatus.signed ? 'text-reward-text' : 'text-text-tertiary'\n-              )}\n-            >\n-              {signStatus.signed && <Check className=\"h-3 w-3\" strokeWidth={3} aria-hidden />}\n-              {buildSignStatusHint(signStatus)}\n-            </span>\n-          )}\n         </button>\n       ) : (\n         <section className=\"mx-4 mt-4 rounded-feature bg-surface px-4 pb-4 pt-4 shadow-bubble\" aria-label={`${calendar.monthLabel}签到日历`}>\n@@ -646,19 +628,6 @@ function DailyMissionSkeleton() {\n   )\n }\n \n-/**\n- * 首页签到状态提示文案。\n- * 未签到且 points=0 时不写「+0 泡泡值」，优先展示 reward_desc（2026-09-28 首页联调文档要求）。\n- */\n-function buildSignStatusHint(status: HomeSignStatusView): string {\n-  if (status.signed) return `今日已签到 · 连续签到 ${status.consecutiveDays} 天`\n-\n-  const parts: string[] = []\n-  if (status.rewardDesc) parts.push(status.rewardDesc)\n-  if (status.points > 0) parts.push(`今日签到 +${status.points} 泡泡值`)\n-  return parts.length > 0 ? parts.join(' · ') : '今日还未签到'\n-}\n-\n function CalendarCell({\n   item,\n   onMakeup,\ndiff --git a/src/styles/card-brand.css b/src/styles/card-brand.css\nindex 6a7256c..bb98a66 100644\n--- a/src/styles/card-brand.css\n+++ b/src/styles/card-brand.css\n@@ -125,8 +125,17 @@\n   --color-checkin-home-day-surface: var(--warm-100);\n   --color-checkin-home-day-text: var(--ink-600);\n   --color-checkin-home-muted: var(--ink-500);\n-  --color-checkin-home-today: var(--premium-600);\n-  --color-checkin-home-today-text: var(--color-text-inverse);\n+  /* V8 approved 2026-10-14: orange check-in card palette, scoped to home only. */\n+  --color-checkin-home-accent: #F77C25;\n+  --color-checkin-home-accent-strong: #D96613;\n+  --color-checkin-home-icon-surface: #FFF0E4;\n+  --color-checkin-home-tile: #F8F7F5;\n+  --color-checkin-home-reward-surface: #FFF4EB;\n+  --color-checkin-home-today-chip: #FFF5EC;\n+  --color-checkin-home-today-date: #8B3700; /* AA 7.38:1 on #FFF5EC */\n+  --color-checkin-home-today: var(--color-checkin-home-accent);\n+  --color-checkin-home-today-text: #432719; /* AA 5.1:1 on #F77C25 */\n+  --shadow-checkin-home-today: 0 3px 9px rgba(247, 124, 37, 0.15);\n   /* 首页「每日任务」卡（用户 2026-09-29 参考图确认）：橙调图标底 /\n    * 奖励文案走 premium-500；进度条仍走 checkin-success 绿；\n    * 骨架占位底沿用 warm-100，只做无位移脉冲。 */",
      "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/ececd194234fbb416aa8493340572a09808b8acd",
            "commitHash": "ececd194234fbb416aa8493340572a09808b8acd",
            "prHref": "https://github.com/sanchuang-dev/dr-card-web/pull/229",
            "prTitle": "release(test): 晋级 V8 紧凑橙色自然周签到卡",
            "prBaseHash": "00a3763bba4e0a9e2e70f21b74a1748120c5c9ea",
            "buildHref": "https://github.com/sanchuang-dev/dr-card-web/actions/runs/38534536530"
          },
          "gitCommit": {
            "shortHash": "ececd19",
            "hash": "ececd194234fbb416aa8493340572a09808b8acd",
            "subject": "Merge fb494f05b44010c519fb3d98aa9e2a9da41d8ac3 into 00a3763bba4e0a9e2e70f21b74a1748120c5c9ea",
            "body": "Merge fb494f05b44010c519fb3d98aa9e2a9da41d8ac3 into 00a3763bba4e0a9e2e70f21b74a1748120c5c9ea\n",
            "author": {
              "name": "Tomz Dang",
              "email": "dangjingtao@163.com",
              "time": 1791966088000
            },
            "committer": {
              "name": "GitHub",
              "email": "noreply@github.com",
              "time": 1791966088000
            },
            "branch": "HEAD"
          },
          "gitDiff": "diff --git a/src/pages/checkin/components/CheckinBoard.test.tsx b/src/pages/checkin/components/CheckinBoard.test.tsx\nindex 36031cf..e0aa588 100644\n--- a/src/pages/checkin/components/CheckinBoard.test.tsx\n+++ b/src/pages/checkin/components/CheckinBoard.test.tsx\n@@ -96,7 +96,7 @@ describe('Issue #220: homepage natural week entry', () => {\n     expect(entry.textContent).toContain('周奖励以后台活动规则为准')\n   })\n \n-  it('distinguishes completed-today and signed-day chip from their card backgrounds', () => {\n+  it('renders V8 short day tiles, dates only for today, signed check for earlier dates, and API-driven points', () => {\n     vi.useFakeTimers()\n     vi.setSystemTime(new Date(2026, 9, 14, 12))\n     render(\n@@ -106,20 +106,61 @@ describe('Issue #220: homepage natural week entry', () => {\n           weekRecordsState=\"success\"\n           records={[\n             { id: 1, user_id: 3, points: 10, consecutive_days: 1, status: 10, year: '2026', month: '10', day: '12' },\n-            { id: 2, user_id: 3, points: 10, consecutive_days: 3, status: 10, year: '2026', month: '10', day: '14' },\n+            { id: 2, user_id: 3, points: 30, consecutive_days: 3, status: 10, year: '2026', month: '10', day: '14' },\n           ]}\n-          signStatus={{ signed: true, consecutiveDays: 3, points: 10, rewardDesc: '' }}\n+          signStatus={{ signed: true, consecutiveDays: 3, points: 30, rewardDesc: '' }}\n         />\n       </MemoryRouter>,\n     )\n \n     const today = document.querySelector('[data-checkin-week-day=\"2026-10-14\"]')\n     const monday = document.querySelector('[data-checkin-week-day=\"2026-10-12\"]')\n-    expect(today?.textContent).toContain('已签')\n-    expect(today?.querySelector('svg')).not.toBeNull()\n-    expect(monday?.querySelector(':scope > span:nth-child(2)')?.className).toContain('bg-[var(--premium-100)]')\n-    expect(screen.getByText('签到详情')).toBeTruthy()\n+    expect(today?.textContent).toContain('14')\n+    expect(today?.textContent).not.toContain('今天')\n+    expect(today?.textContent).not.toContain('已签')\n+    expect(today?.querySelector('svg')).toBeNull()\n+    expect(today?.className).toContain('min-h-[65px]')\n+    expect(monday?.querySelector('svg')).not.toBeNull()\n+    expect(screen.getByText('+30')).toBeTruthy()\n+    expect(screen.getByText('查看月历')).toBeTruthy()\n+    expect(screen.queryByText('签到详情')).toBeNull()\n     expect(screen.queryByText('签到规则')).toBeNull()\n   })\n \n+  it('never fills missing daily points with a guessed +10', () => {\n+    vi.useFakeTimers()\n+    vi.setSystemTime(new Date(2026, 9, 14, 12))\n+    render(\n+      <MemoryRouter>\n+        <CheckinBoard mode=\"home\" weekRecordsState=\"error\" records={null} signStatus={null} />\n+      </MemoryRouter>,\n+    )\n+    const entry = screen.getByRole('button', { name: '查看本周签到，进入本月签到日历' })\n+    expect(entry.textContent).toContain('—/7')\n+    expect(entry.textContent).toContain('签到记录暂不可用')\n+    expect(entry.textContent).toContain('每日签到 · 领取泡泡值')\n+    expect(entry.textContent).not.toContain('+10')\n+  })\n+\n+  it('keeps loading distinct from failure and hides confirmed zero points', () => {\n+    vi.useFakeTimers()\n+    vi.setSystemTime(new Date(2026, 9, 14, 12))\n+    render(\n+      <MemoryRouter>\n+        <CheckinBoard\n+          mode=\"home\"\n+          weekRecordsState=\"loading\"\n+          records={null}\n+          signStatus={{ signed: false, consecutiveDays: 0, points: 0, rewardDesc: '' }}\n+        />\n+      </MemoryRouter>,\n+    )\n+\n+    const entry = screen.getByRole('button', { name: '查看本周签到，进入本月签到日历' })\n+    expect(entry.textContent).toContain('—/7')\n+    expect(entry.textContent).toContain('签到记录加载中')\n+    expect(entry.textContent).not.toContain('签到记录暂不可用')\n+    expect(entry.textContent).not.toContain('+0')\n+  })\n+\n })\ndiff --git a/src/pages/checkin/components/CheckinBoard.tsx b/src/pages/checkin/components/CheckinBoard.tsx\nindex 836034b..04074c7 100644\n--- a/src/pages/checkin/components/CheckinBoard.tsx\n+++ b/src/pages/checkin/components/CheckinBoard.tsx\n@@ -380,98 +380,80 @@ export default function CheckinBoard({\n           aria-label={weeklyCompletedDays === null\n             ? '查看本周签到，进入本月签到日历'\n             : '查看本周签到，已签到 ' + weeklyCompletedDays + ' / 7 天，进入本月签到日历'}\n-          className=\"mx-4 block w-[calc(100%-2rem)] rounded-[21px] border border-border-subtle bg-checkin-home-surface px-[15px] pb-3.5 pt-4 text-left shadow-bubble transition active:scale-[0.995] active:bg-surface-pressed max-[350px]:px-2.5\"\n+          className=\"mx-4 block w-[calc(100%-2rem)] rounded-[22px] border border-border-subtle bg-checkin-home-surface px-3.5 pb-3 pt-4 text-left shadow-bubble transition active:bg-surface-pressed max-[350px]:px-2.5\"\n         >\n-          {/* UIUX-1014：将已验收的 375px 七日视觉移植到 #220 的真实自然周签到数据。 */}\n-          <span className=\"flex flex-wrap items-center justify-between gap-x-2 gap-y-2\">\n-            <span className=\"flex min-w-0 items-center gap-2\">\n-              <span className=\"flex h-[34px] w-[34px] flex-none items-center justify-center rounded-[10px] bg-reward-subtle text-reward-strong\" aria-hidden>\n-                <CalendarDays className=\"h-[19px] w-[19px]\" />\n-              </span>\n-              <span className=\"whitespace-nowrap text-[18px] font-bold tracking-tight text-text-primary max-[350px]:text-[16px]\">本周签到</span>\n-              <span className=\"whitespace-nowrap text-[17px] font-bold tabular-nums text-reward-text\">\n-                {weeklyCompletedDays === null ? '—/7' : weeklyCompletedDays + '/7'}\n-              </span>\n+          {/* 用户确认的 V8：紧凑 65px 自然周日期卡，仅突出当天；数据仍来自真实签到接口。 */}\n+          <span className=\"flex items-center gap-2\">\n+            <span className=\"flex h-8 w-8 flex-none items-center justify-center rounded-[10px] bg-[var(--color-checkin-home-icon-surface)] text-[var(--color-checkin-home-accent)]\" aria-hidden>\n+              <CalendarDays className=\"h-5 w-5\" />\n             </span>\n-            <span className=\"flex min-h-11 flex-none items-center gap-0.5 rounded-full bg-surface-subtle px-2.5 text-xs font-medium text-text-secondary max-[350px]:px-2\">\n-              {weeklyCompletedDays === null\n-                ? weekRecordsState === 'error' ? '记录暂不可用' : '记录加载中'\n-                : weeklyCompletedDays === 7 ? '本周已满勤' : '已签到 ' + weeklyCompletedDays + ' 天'}\n-              <ChevronRight className=\"h-4 w-4\" aria-hidden />\n+            <span className=\"whitespace-nowrap text-base font-bold tracking-tight text-text-primary\">本周签到</span>\n+            <span className=\"whitespace-nowrap text-base font-bold tabular-nums text-[var(--color-checkin-home-accent-strong)]\">\n+              {weeklyCompletedDays === null ? '—/7' : weeklyCompletedDays + '/7'}\n             </span>\n           </span>\n \n-          <span className=\"mt-1 block text-xs leading-[18px] text-text-tertiary\">\n+          <span className=\"mt-2 block text-xs leading-[17px] text-text-tertiary\">\n             周一至周日 · {weekLabel}\n           </span>\n \n-          <span className=\"mt-[19px] grid grid-cols-7 gap-[3px] max-[350px]:gap-0.5\" aria-hidden>\n+          <span className=\"mt-[13px] grid grid-cols-7 gap-1 max-[350px]:gap-[3px]\" aria-hidden>\n             {cycleDays.map((item, index) => {\n               const completed = weekRecordsReady && item.signed\n               const today = item.state === 'today'\n-              const missing = weekRecordsReady && item.state === 'makeup' && !completed\n               return (\n                 <span\n                   key={item.dateKey}\n                   data-checkin-week-day={item.dateKey}\n-                  className={'flex min-h-[106px] min-w-0 flex-col items-center rounded-[13px] px-0 py-[9px] text-center max-[350px]:rounded-[10px] ' + (\n-                    today ? 'bg-checkin-home-today'\n-                      : completed ? 'bg-reward-subtle'\n-                        : 'bg-surface-subtle'\n+                  className={'flex min-h-[65px] min-w-0 flex-col items-center rounded-[11px] px-px pb-1.5 pt-[7px] max-[350px]:min-h-[63px] max-[350px]:rounded-[9px] ' + (\n+                    today ? 'bg-checkin-home-today shadow-[var(--shadow-checkin-home-today)]'\n+                      : 'bg-[var(--color-checkin-home-tile)]'\n                   )}\n                 >\n-                  <span className={'text-xs font-medium leading-4 ' + (\n-                    today ? 'text-checkin-home-today-text' : completed ? 'text-reward-text' : 'text-checkin-home-muted'\n+                  <span className={'text-[11px] font-medium leading-[14px] ' + (\n+                    today ? 'text-checkin-home-today-text' : 'text-checkin-home-muted'\n                   )}>\n                     {CHECKIN_WEEK_LABELS[index]}\n                   </span>\n-                  <span className={'mt-2.5 flex h-[34px] w-[34px] items-center justify-center rounded-full text-[15px] font-semibold tabular-nums max-[350px]:h-[30px] max-[350px]:w-[30px] ' + (\n-                    today ? 'bg-reward-subtle text-reward-text'\n-                      : completed ? 'bg-[var(--premium-100)] text-reward-text'\n-                        : 'bg-checkin-home-day-surface text-checkin-home-day-text'\n-                  )}>\n-                    {completed ? <Check className=\"h-[21px] w-[21px]\" strokeWidth={3} /> : item.day}\n-                  </span>\n-                  <span className={'mt-2.5 min-h-[15px] text-[11px] leading-[15px] ' + (\n-                    today ? 'font-semibold text-checkin-home-today-text' : completed ? 'text-reward-text' : 'text-text-tertiary'\n+                  <span className={'mt-1.5 flex h-7 w-7 flex-none items-center justify-center rounded-full text-[15px] font-semibold tabular-nums max-[350px]:h-[27px] max-[350px]:w-[27px] ' + (\n+                    today ? 'bg-[var(--color-checkin-home-today-chip)] text-[var(--color-checkin-home-today-date)]'\n+                      : 'bg-checkin-home-day-surface text-checkin-home-day-text'\n                   )}>\n-                    {completed ? '已签' : today ? '今天' : missing ? '漏签' : ''}\n+                    {completed && !today\n+                      ? <Check className=\"h-[18px] w-[18px] text-[var(--color-checkin-home-accent)]\" strokeWidth={3} aria-hidden />\n+                      : item.day}\n                   </span>\n                 </span>\n               )\n             })}\n           </span>\n \n-          <span className=\"mt-3.5 flex min-h-[70px] items-center gap-2.5 rounded-[13px] bg-reward-subtle px-2.5 py-3\">\n-            <span className=\"flex h-[30px] w-[30px] flex-none items-center justify-center text-reward-strong\" aria-hidden>\n-              <Gift className=\"h-6 w-6\" />\n+          <span className=\"mt-3.5 flex min-h-[68px] items-center gap-2.5 rounded-[13px] bg-[var(--color-checkin-home-reward-surface)] px-[11px] py-3 max-[350px]:gap-1.5 max-[350px]:px-2\">\n+            <span className=\"flex h-[34px] w-[26px] flex-none items-center justify-center text-[var(--color-checkin-home-accent)] max-[350px]:w-[22px]\" aria-hidden>\n+              <Gift className=\"h-6 w-6 max-[350px]:h-[21px] max-[350px]:w-[21px]\" />\n             </span>\n             <span className=\"min-w-0 flex-1\">\n-              <span className=\"block text-sm font-semibold leading-5 text-text-primary\">每日签到得泡泡值</span>\n-              <span className=\"mt-0.5 block text-xs leading-[18px] text-text-tertiary\">\n-                {weeklyCompletedDays === null ? '签到记录加载后显示进度' : '本周累计已签 ' + weeklyCompletedDays + ' 天'}\n+              <span className=\"flex items-baseline gap-1 whitespace-nowrap text-[13px] font-bold leading-[19px] text-text-primary max-[350px]:gap-[3px] max-[350px]:text-[11px]\">\n+                每日签到 · 领取泡泡值\n+                {signStatus && Number.isFinite(signStatus.points) && signStatus.points > 0 && (\n+                  <span className=\"tabular-nums text-[var(--color-checkin-home-accent-strong)]\">+{signStatus.points}</span>\n+                )}\n+              </span>\n+              <span className=\"mt-[3px] block text-[11px] leading-4 text-text-tertiary max-[350px]:text-[10px]\">\n+                {weeklyCompletedDays === null\n+                  ? weekRecordsState === 'error' ? '签到记录暂不可用' : '签到记录加载中'\n+                  : '本周已签到 ' + weeklyCompletedDays + ' 天'}\n               </span>\n             </span>\n-            <span className=\"flex min-h-11 flex-none items-center gap-0.5 whitespace-nowrap text-xs font-semibold text-reward-text\">\n-              查看月历 <ChevronRight className=\"h-4 w-4\" aria-hidden />\n+            <span className=\"flex min-h-[34px] flex-none items-center gap-0.5 whitespace-nowrap text-xs font-semibold text-[var(--color-checkin-home-accent-strong)] max-[350px]:text-[10px]\">\n+              查看月历\n+              <ChevronRight className=\"h-3.5 w-3.5\" aria-hidden />\n             </span>\n           </span>\n \n-          <span className=\"flex min-h-11 items-center justify-between gap-2 px-0.5 text-xs text-text-tertiary\">\n-            <span className=\"min-w-0\">周奖励以后台活动规则为准</span>\n-            <span className=\"flex flex-none items-center gap-0.5 text-reward-text\">签到详情 <ChevronRight className=\"h-3.5 w-3.5\" aria-hidden /></span>\n+          <span className=\"mt-[11px] block px-0.5 text-xs leading-[18px] text-text-tertiary\">\n+            周奖励以后台活动规则为准\n           </span>\n-          {signStatus && (\n-            <span\n-              data-checkin-sign-status={signStatus.signed ? 'signed' : 'unsigned'}\n-              className={'flex items-center gap-1 border-t border-border-subtle pt-2 text-xs leading-5 ' + (\n-                signStatus.signed ? 'text-reward-text' : 'text-text-tertiary'\n-              )}\n-            >\n-              {signStatus.signed && <Check className=\"h-3 w-3\" strokeWidth={3} aria-hidden />}\n-              {buildSignStatusHint(signStatus)}\n-            </span>\n-          )}\n         </button>\n       ) : (\n         <section className=\"mx-4 mt-4 rounded-feature bg-surface px-4 pb-4 pt-4 shadow-bubble\" aria-label={`${calendar.monthLabel}签到日历`}>\n@@ -646,19 +628,6 @@ function DailyMissionSkeleton() {\n   )\n }\n \n-/**\n- * 首页签到状态提示文案。\n- * 未签到且 points=0 时不写「+0 泡泡值」，优先展示 reward_desc（2026-09-28 首页联调文档要求）。\n- */\n-function buildSignStatusHint(status: HomeSignStatusView): string {\n-  if (status.signed) return `今日已签到 · 连续签到 ${status.consecutiveDays} 天`\n-\n-  const parts: string[] = []\n-  if (status.rewardDesc) parts.push(status.rewardDesc)\n-  if (status.points > 0) parts.push(`今日签到 +${status.points} 泡泡值`)\n-  return parts.length > 0 ? parts.join(' · ') : '今日还未签到'\n-}\n-\n function CalendarCell({\n   item,\n   onMakeup,\ndiff --git a/src/styles/card-brand.css b/src/styles/card-brand.css\nindex 6a7256c..bb98a66 100644\n--- a/src/styles/card-brand.css\n+++ b/src/styles/card-brand.css\n@@ -125,8 +125,17 @@\n   --color-checkin-home-day-surface: var(--warm-100);\n   --color-checkin-home-day-text: var(--ink-600);\n   --color-checkin-home-muted: var(--ink-500);\n-  --color-checkin-home-today: var(--premium-600);\n-  --color-checkin-home-today-text: var(--color-text-inverse);\n+  /* V8 approved 2026-10-14: orange check-in card palette, scoped to home only. */\n+  --color-checkin-home-accent: #F77C25;\n+  --color-checkin-home-accent-strong: #D96613;\n+  --color-checkin-home-icon-surface: #FFF0E4;\n+  --color-checkin-home-tile: #F8F7F5;\n+  --color-checkin-home-reward-surface: #FFF4EB;\n+  --color-checkin-home-today-chip: #FFF5EC;\n+  --color-checkin-home-today-date: #8B3700; /* AA 7.38:1 on #FFF5EC */\n+  --color-checkin-home-today: var(--color-checkin-home-accent);\n+  --color-checkin-home-today-text: #432719; /* AA 5.1:1 on #F77C25 */\n+  --shadow-checkin-home-today: 0 3px 9px rgba(247, 124, 37, 0.15);\n   /* 首页「每日任务」卡（用户 2026-09-29 参考图确认）：橙调图标底 /\n    * 奖励文案走 premium-500；进度条仍走 checkin-success 绿；\n    * 骨架占位底沿用 warm-100，只做无位移脉冲。 */",
          "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": 62,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-10-14T08:22:42.302Z",
                  "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": 1198,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-10-14T08:22:42.309Z",
                  "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": 1280,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-10-14T08:22:42.435Z",
                  "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": 1161,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-10-14T08:22:44.714Z",
                  "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": 1115,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-10-14T08:22:44.796Z",
                  "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": 1091,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-10-14T08:22:45.891Z",
                  "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": 1100,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-10-14T08:22:45.927Z",
                  "annotations": [],
                  "attachments": []
                }
              ],
              "status": "expected"
            }
          ],
          "id": "37c772ca39f4c8e5dd7a-8caf237c4d42513fff2f",
          "file": "test-gate.spec.ts",
          "line": 80,
          "column": 1
        }
      ]
    }
  ],
  "errors": [],
  "stats": {
    "startTime": "2026-10-14T08:22:41.209Z",
    "duration": 5869.119000000001,
    "expected": 7,
    "skipped": 0,
    "unexpected": 0,
    "flaky": 0
  }
}