Files
Jyotisha/docs/tasks/TASK-home-page-split-20260925.md
T

5.4 KiB
Raw Blame History

TASK · 首页 page.tsx 拆分:启动流程、恢复轮询、错误 / 引导屏移出(2026-09-25)

基线

  • 开工时 origin/staging(写单时 824647f2 代码 + 文档)。分支 codex/home-page-split-20260925。
  • 串行:排在 TASK-chart-ephemeris-fixes-20260924.md 合入之后(其 T3 碰设置深链与首页打开设置的入口);排在 TASK-people-archive-p1-20260924.md 之前(P1 要在首页加当前人物,拆完后改动落在 hook 里)。与 TASK-chart-dasha-western-redesign 文件不交叉,可并行。

事故实证(origin/staging 824647f2)

  • frontend/src/app/(app)/page.tsx 1849 行:68 行 import、16 个 useState、17 个 useRef、22 个 useEffect,JSX 从 return ( 约第 1597 行才开始。
  • 启动流程约 285 行:useEffect 内 async function loadCloudData()(约第 851–1125 行),一次性负责 provider 等待、模型列表、pending 恢复、会话 lookup / 详情、落点、set* 一串、错误与超时。09-24 慢网 bug(BUG-1021)和随后 5 条红测试都出在这一块;测试只能靠按源码字符串切片(new-chat-recovery.test.ts、consultation-recovery.test.ts)来测它。
  • 咨询恢复轮询约 100 行:约第 1143–1240 行的 useEffect(consultationStatusMissingCount 计数、404 重放、4 次放弃)。
  • 错误屏(「暂时无法进入 Jyotisha」)、引导(onboarding)分支的 JSX 内联在 Home()。
  • 824647f2 为满足任务书"不得净增行"把多条 import 挤在同一行(第 7–9 行),属格式凑数,需还原。AGENTS §6 已于 09-25 明确禁止此类做法。

根因

Home() 仍承担装配之外的业务流程(启动编排、恢复轮询),只能以源码切片测试,每次改动都牵连合同测试。

决策记录(产品 2026-09-25)

  • D1 本单只搬代码、不改行为:落点规则、20 秒错误屏、局部重试、pending 优先级、恢复轮询次数与文案全部不变。
  • D2 遵守既定模式「参数式 hook / lib 函数内部 0 个 React hook」:启动流程抽成 frontend/src/lib/home-bootstrap-run.ts 的纯异步函数 runHomeBootstrap(deps, signal)(deps 注入 fetch 函数、provider 读取、storage、setter),Home() 里只保留一个 useEffect 调用它;恢复轮询抽成 frontend/src/lib/consultation-recovery-poll.ts 同样方式。
  • D3 错误屏、引导屏 JSX 抽成 frontend/src/components/home-bootstrap-error.tsx、home-onboarding-shell.tsx(或按现有组件命名习惯),Home() 只传 props。
  • D4 目标 page.tsx ≤ 1300 行;达成后把 home-shell-growth-contract.test.ts 的 PAGE_LINE_COUNT_BASELINE 下调到新实测值(余量仍 +150),HOME_USE_STATE_CAP / HOME_USE_REF_CAP 若减少同步下调——锁住拆分成果。
  • D5 还原 824647f2 挤在一行的 import(每行一条语句)。
  • D6 两个源码切片测试改为直接调用 runHomeBootstrap / 恢复轮询函数(注入假依赖),删除对 page.tsx 源码字符串的切片;这是"原值 / 新值 / 原因"类改写,不是弱化——断言的行为必须等价或更强。

硬红线

  1. 行为零变化:全量测试失败名单与开工基线逐条一致、新增 0(Linux 跑;进度记录附对比命令与结果);next build 后 / 仍 ○ Static,首屏 gzip ±2%。
  2. Home() 的 useState / useRef 不得增加;新文件内不得调用 React hook(D2)。
  3. 不得用合并语句、删注释等改格式方式减行(AGENTS §6)。
  4. 不改接口、数据库、workflow;不顺手修 warning;不升级依赖。
  5. 既有断言改动写三栏;测试总数不低于基线。

任务分解

  • T1 runHomeBootstrap 抽出。验收:新测试 home-bootstrap-run.test.ts 直接调用,覆盖——全部成功一次性回填、模型失败 → 错误态(不半揭幕)、pending 优先于全局状态、new-chat 落点与 reserved 恢复共存、超时 abort;new-chat-recovery.test.ts 与 consultation-recovery.test.ts 改为调用函数,不再切 page.tsx。
  • T2 恢复轮询抽出。验收:假计时器测试覆盖 404 第 1 次重放、第 4 次放弃、成功清零。
  • T3 错误屏 / 引导屏组件抽出。验收:渲染测试文案与按钮不变;「重试」仍走 retryHomeBootstrap。
  • T4 还原 import 格式;下调增长合同基线。验收:page.tsx ≤ 1300;grep -nE "^import .*; import " "frontend/src/app/(app)/page.tsx" = 0。
  • T5 记录:DESIGN 不变(无 UI 变化);CHANGELOG 一条"首页内部重构,无用户可见变化";PROGRESS;不新开 BUG 号。

让步顺序

  1. 若 1300 行达不到,允许先到 ≤ 1450,写明剩余大块与下一步。
  2. 若注入依赖过多(> 15 个),允许按阶段拆成 runAccountPhase / resolveLanding 两个函数。
  3. 不得让步:红线 1、2、3。

开工前置命令

git fetch origin --prune
git worktree add -b codex/home-page-split-20260925 .worktrees/home-page-split-20260925 origin/staging
git worktree add --detach .worktrees/split-baseline-20260925 origin/staging
cd .worktrees/split-baseline-20260925/frontend && npm test > /tmp/split-base.log 2>&1
cd ../../home-page-split-20260925/frontend && ./node_modules/.bin/tsc --noEmit && npm run lint
# 完成后:npm test > /tmp/split-head.log 并与基线逐条 diff(见 TASK-staging-gate-fix 的命令)