docs: page.tsx split brief, forbid stricter line-count red lines, accept 824647f2

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
This commit is contained in:
Jesse_Chen
2026-09-25 00:58:28 +08:00
co-authored by Claude Opus 5.5
parent 824647f2a2
commit 514951d708
4 changed files with 68 additions and 7 deletions
+2 -2
View File
@@ -65,7 +65,7 @@
- 或 `git worktree add` 一个一次性工作树,在那里检出基线 commit 去量;
- 或 `git diff > /tmp/x.patch` 后手工恢复。
已经误弹了:立刻 `git fsck --unreachable | grep commit` 找回对方的 stash commit,用 `git stash store <sha> -m "RECOVERED …"` 原样放回栈上并告知对方 sha,不要自行替对方 apply。
6. 两个同时改 `frontend/src/app/page.tsx` 或同一组件的轮次必须串行,任务书里写明先后。
6. 两个同时改 `frontend/src/app/(app)/page.tsx` 或同一组件的轮次必须串行,任务书里写明先后。
## 4. 记录文件放哪
@@ -102,7 +102,7 @@
行数是耦合的影子:盯行数时,`Home()` 的状态数和 `JyotishAPIHandler` 的类方法数仍在涨。主门换成耦合指标,行数只作粗护栏。
- `scripts/jyotish_api_server.py` must not grow. New endpoints and features go in dedicated modules under `scripts/` and are thinly registered from the main file. Do not add new handler bodies, workflows, or feature branches to this file. The live gate is `tests/test_api_server_growth_contract.py`:**类方法数不得增长、`JyotishAPIHandler.__new__` 伪造点不得增长**;行数是粗护栏(开工实测基线 + 300)。
- `frontend/src/app/page.tsx`:`Home()` 的 `useState` / `useRef` 数不得增长。新逻辑进 `frontend/src/hooks/`、`frontend/src/lib/` 或组件;抽出去的 hook 与子组件应当持有自己的状态,`page.tsx` 只做装配。行数是粗护栏(开工实测基线 + 150),由 `frontend/tests/home-shell-growth-contract.test.ts` 执行。
- `frontend/src/app/(app)/page.tsx`:`Home()` 的 `useState` / `useRef` 数不得增长。新逻辑进 `frontend/src/hooks/`、`frontend/src/lib/` 或组件;抽出去的 hook 与子组件应当持有自己的状态,`page.tsx` 只做装配。行数是粗护栏(开工实测基线 + 150),由 `frontend/tests/home-shell-growth-contract.test.ts` 执行。**任务书不得另加「净增 0 行」之类比测试更严的行数红线**;不得用合并多条语句到一行、删注释等改格式的方式凑行数(2026-09-25 产品决定,起因:`824647f2` 把多条 import 挤成一行凑数)。
- 不得再手写第二个聊天输入框(一律 `ChatComposer`,自有草稿走 `value`)、第二套滚动跟随(一律 `useConversationScrollAnchor` + `JumpToLatestButton`)、第二套加载动画(揭幕后不得出现 spinner / 骨架 / "正在加载",流式生成中除外;星盘页盘位骨架盘除外,限 BUG-1016 决策)。
## 7. 前端红线
+3 -3
View File
@@ -13564,7 +13564,7 @@
## BUG-1021 | 慢网首页半揭幕,模型与账户状态脱节
- 状态:investigating(Claude 2026-09-24 验收 `f125fae0`:实现逻辑符合任务书,但引入 5 条源码合同测试失败致门禁红、未部署,另 page.tsx +9 行违反增长红线;修复单 `TASK-staging-gate-fix-20260924.md`。执行方先前写的 resolved 撤回:未与基线逐条比对、无部署证据)
- 状态:investigating(代码已验收:Claude 2026-09-25 于 `824647f2` 全量失败名单与基线逐条一致、门禁 run 2877 绿;deploy run 2879 因 ACR 授权连接重置失败,待同 SHA 重跑后核对 health 再改 resolved)
- 首次发现 / 最近更新:2026-09-24。
- 影响面:首页账户、会话、模型目录、咨询状态 bootstrap 与重试。
- 现象 / 触发:Slow 3G 强刷首页,原 8 秒串行预算先显示云端超时;SessionListProvider 后到仍写账户/会话,页面可能揭幕为模型不可用、发送禁用并重新询问称呼的半成品。
@@ -13578,7 +13578,7 @@
## BUG-1022 | 账户与点数首次打开慢且离线预取会误触发刷新
- 状态:investigating(同 BUG-1021 修复单;另支付成功后订阅订单不刷新余额 P2;本轮已改为 paid 无条件广播,尚无可运行回归与部署 health 证据)
- 状态:investigating(同 BUG-1021:代码已验收,待部署核对)
- 首次发现 / 最近更新:2026-09-24。
- 影响面:账户菜单、BillingPanel 动态分包、套餐接口与支付/兑换余额同步。
- 现象 / 触发:首次打开账户与点数需等待懒加载 chunk 和套餐请求;面板挂载还会重复请求完整 `/api/account`;指针悬停离线时动态 import reject 可能被全局 stale-client recovery 当作 ChunkLoadError 并整页刷新。
@@ -13592,7 +13592,7 @@
## BUG-1020 | CRLF 普通报告下载保留图盘 JSON 围栏
- 状态:investigating(Claude 2026-09-24 验收:CRLF 正则与 LF 冻结锁、CRLF 仅差围栏的测试均通过,代码合格;因同批 `0e4dd0f4` 门禁红尚未部署,部署 health 核对后改 resolved)
- 状态:investigating(代码已验收,待 `824647f2` 部署核对)
- 首次发现 / 最近更新:2026-09-24。
- 影响面:旧普通Markdown下载与新分块导出的正文组。
- 现象 / 触发:真实引擎虚构golden仅将LF换成CRLF,正文下载残留22段图盘JSON;新分盘组仍可提取22盘。
+3 -2
View File
@@ -117,9 +117,10 @@
| 任务书 | 进度 | 主题 | 状态 | 落点 |
| --- | --- | --- | --- | --- |
| `TASK-staging-gate-fix-20260924.md` | — | **修复单(阻塞 staging 部署)**:慢网首页 `0e4dd0f4` 起 5 条源码合同测试未跟上(硬跳转计数、重试 reload 正则、两处按已删语句切片)→ 门禁红,`0e4dd0f4..f125fae0` 全部未部署;另 page.tsx +9 行、订阅支付不刷新余额、原始附录三文件残留。只修测试与收尾,不改已验收行为;失败名单须与 `edc9c22c` 逐条一致 | 待领取(**最优先**) | — |
| `TASK-home-page-split-20260925.md` | — | **首页 page.tsx 拆分(只搬不改)**:启动流程约 285 行抽成 lib 纯函数 `runHomeBootstrap`、恢复轮询约 100 行抽出、错误 / 引导屏抽组件,目标 ≤1300 行并下调增长合同基线;两个按源码切片的测试改为直接调用函数;还原 824647f2 的 import 挤行。排在 chart-ephemeris 之后、people-archive P1 之前 | 待领取 | — |
| `TASK-staging-gate-fix-20260924.md` | — | **修复单(阻塞 staging 部署)**:慢网首页 `0e4dd0f4` 起 5 条源码合同测试未跟上(硬跳转计数、重试 reload 正则、两处按已删语句切片)→ 门禁红,`0e4dd0f4..f125fae0` 全部未部署;另 page.tsx +9 行、订阅支付不刷新余额、原始附录三文件残留。只修测试与收尾,不改已验收行为;失败名单须与 `edc9c22c` 逐条一致 | 已验收(Claude 09-25:5 条转绿、失败名单与 edc9c22c 逐条一致 56/56、门禁 run 2877 绿;import 挤行凑数为 P3,由 home-page-split D5 还原;原始附录三文件仍未删) | `651c75e7`/`7a001456`/`824647f2`;deploy run 2879 因 ACR 网络失败,待同 SHA 重跑 |
| `TASK-people-archive-p1-20260924.md` | — | **星盘档案(多人物)P1**:每个档案 = 一个人(含本人),最多 5 人、无关系字段;标题旁人名 = 全局切换器(对话 / 星盘 / 星历 / 报告 / 档案页同一组件),星盘、星历、报告、今日星语、新建对话都跟当前人物走(推翻 BUG-1000 新对话固定本人);历史只显示当前人物;档案管理改侧栏 `/people` 页、设置删星盘资料;删人连带删对话与报告;取消「设为默认」/`activeChartId`(BUG-1030 错人)。他人资料改类型化列 + 与户主同级守卫,统一 `resolveSubjectBirth`;户主暂留 `profiles`。生时校正跟人与任意两人合盘留 P2。**同日四单全部合入后开工**,需 Docker 跑 test:db | 待领取 | — |
| `TASK-home-slow-network-20260924.md` | — | **慢网首页半揭幕 + 账户与点数打开慢(BUG-1021/1022)**:8 秒硬超时包住多跳串行请求、超时不补拉,独立的会话列表 provider 晚到 → 正常首页+报错条、模型「暂不可用」、新建对话灰、重问称呼。产品 09-24 拍板:推翻 8 秒硬超时,等齐再揭幕,20 秒才出错误屏且重试为局部重请求(不整页刷新);账单面板删无用 `/api/account`、预取 chunk、套餐缓存。先于 chart-ephemeris T3 合入 | 验收未通过(Claude 09-24:逻辑符合,但 5 条合同测试红致门禁红未部署 + page.tsx +9;修复单 staging-gate-fix) | `0e4dd0f4`/`2f53fa01`/`25e32fe6`(未部署) |
| `TASK-home-slow-network-20260924.md` | — | **慢网首页半揭幕 + 账户与点数打开慢(BUG-1021/1022)**:8 秒硬超时包住多跳串行请求、超时不补拉,独立的会话列表 provider 晚到 → 正常首页+报错条、模型「暂不可用」、新建对话灰、重问称呼。产品 09-24 拍板:推翻 8 秒硬超时,等齐再揭幕,20 秒才出错误屏且重试为局部重请求(不整页刷新);账单面板删无用 `/api/account`、预取 chunk、套餐缓存。先于 chart-ephemeris T3 合入 | 已验收(经修复单,Claude 09-25);待部署核对 | `0e4dd0f4`…`824647f2` |
| `TASK-secondary-new-chat-intent-20260923.md` | `PROGRESS-secondary-new-chat-intent-20260923.md` | **次级页「新建对话」落到最近一次对话**:`/chart` `/ephemeris` `/reports` 的侧栏没有 `controls`,「新建对话」只是 `href="/"` 的回首页链接;首页无参启动的落点是 `nextSessions[0]`(最近更新那条),只有最近一条是校正会话才改落空咨询。BUG-745 修过同一入口的「慢」,没修「回到哪」。产品 09-23 拍板:链接改 `/?new=1`,首页看到 `new` 就本地建空咨询并 `replaceState` 抹掉参数;`new` 胜过 `c` 与登录返回存根;沿用 BUG-989 不落库不写 `?c=`;页脚与品牌行的 `/` 不改;刷新无参 `/` 仍落最近对话属既有设计。红线:`/` 保持 Static、不得用 `useSearchParams`;解析与生成只在 `chat-session-url.ts` 一处。BUG-1015;执行中追加 D7:保留旧任务恢复但不抢新建落点。 | 已验收(Claude 09-24:tsc/lint/95 定向/全量失败名单同基线/Static/gzip 同基线;BUG-1015 resolved) | `8902e484`,含于已部署 `1420471a`;真机清单欠 |
| `TASK-chat-message-authority-20260901.md` | — | 消息服务端权威化 | 已验收 | `b6989c3e`(BUG-464) |
| `TASK-session-url-20260901.md` | — | 会话 URL 化 | 已验收 | `924f4202` |
@@ -0,0 +1,60 @@
# 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。
## 开工前置命令
```bash
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 的命令)
```