Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
56 lines
4.8 KiB
Markdown
56 lines
4.8 KiB
Markdown
# TASK · 从星盘档案页点「新建对话」落回上一次的生时校正(2026-09-26)
|
||
|
||
## 基线
|
||
|
||
- `origin/staging` 当前 head(线上 `e84d6eb8`)。分支 `codex/new-chat-from-people-20260926`。
|
||
- 与即将出的"档案页样式 / 星历可读性"单不交叉(本单不改 CSS 与星历)。
|
||
|
||
## 事故实证(产品 09-26 真机,iPhone Safari,staging)
|
||
|
||
1. 进入 `/people`(星盘档案页),点侧栏「新建对话」。
|
||
2. 回到首页后:标题栏显示上一次的会话标题「生时校正 · 04:45–05:15」,输入框占位写「正在打开生时校正…」且发送按钮禁用;页面中间却是新对话的开场问候「早上好,岳辰」和两个入口按钮。**期望是一个干净的新对话。**
|
||
|
||
代码现状(`origin/staging` e84d6eb8):
|
||
|
||
- 侧栏只读模式的「新建对话」:`frontend/src/components/app-sidebar.tsx` `SidebarMenuLink … href={newChatHref()}` → `/?new=1`(`frontend/src/lib/chat-session-url.ts` `newChatHref` / `parseNewChatIntent`,BUG-1015)。
|
||
- 首页启动:`frontend/src/lib/home-bootstrap-run.ts` `resolveLanding` 对 `urlAction === "new-chat"` 新建本地空咨询并 `writeSessionUrl(null, "replace")`、`setActiveSessionId(landingSessionId)`;`reservedConsultation` 恢复后再次改回新建落点。这一段逻辑仍在。
|
||
- **第二套新建入口**:`frontend/src/components/people-home-links.tsx` `NewChatDeepLink` 解析 `?newChat=1`(`/people`「和 TA 对话」使用),在 `page.tsx` 中挂载(`<NewChatDeepLink ready={…} startNewChat={startNewChat} />`)。这违反 BUG-1015 红线 3「解析与生成新建意图只在 `chat-session-url.ts` 一处」。
|
||
- 标题与占位来自生时校正面的打开状态(`use-rectification-surface` / 外壳注册 `openingSessionId`、`EMPTY_RECTIFICATION_SHELL`),说明回到首页时仍保留或重新激活了上一次的校正会话打开态。
|
||
|
||
## 根因(待复现确认)
|
||
|
||
静态阅读能确定的只有"有两套新建入口"。截图同时出现"新对话开场"和"校正会话标题 + 正在打开"两种状态,说明新建落点生效了,但**某个跨页面存活的状态**(候选:外壳注册里残留的 `openingSessionId` / 校正面的模块级缓存 / `current-subject` 绑定时的会话订阅 emit 触发 `activateFallbackSession` / `shouldAutoOpenRectificationSession`)把上一条校正会话重新推成了活动会话或打开态。**执行方必须先复现再定根因,不得凭猜测改。**
|
||
|
||
## 决策记录
|
||
|
||
- D1 新建意图只保留一套:`/people`「和 TA 对话」改用 `newChatHref()`(必要时扩展为 `newChatHref({ subjectId })` 带人物,解析仍在 `chat-session-url.ts`),删除 `NewChatDeepLink` 与 `?newChat` 参数。
|
||
- D2 从任何次级页(`/chart`、`/ephemeris`、`/reports`、`/people`)点「新建对话」,结果必须等同首页点「新建对话」:活动会话是新的空咨询,标题栏显示新对话,输入框可用,不出现「正在打开生时校正…」,不打开任何历史会话(含校正会话)。
|
||
- D3 定位到的残留状态必须在"新建意图"路径上显式清掉(或改为按会话 id 作用域),并写明是哪一个。
|
||
|
||
## 硬红线
|
||
|
||
1. 先写一条**会失败**的回归测试复现问题(真实 React 生命周期:先打开一条校正会话 → 客户端导航到 `/people` → 导航回 `/?new=1`),修复后转绿;只有静态源码断言不算。
|
||
2. 在真实浏览器里验证(本机有 Chrome;用受控测试账号或本地 dev + 预览数据),截图写进 PROGRESS。没有受控账号时写进 BLOCKED,并交给产品真机复测,不得写成通过。
|
||
3. 不改 BUG-989 口径(首问前不落库、不写 `?c=`);首页保持 `○ Static`;`page.tsx` 不新增 hook。
|
||
4. 全量测试 Node 22 + Linux 与基线逐条一致、新增 0;改动断言写三栏(写在测试文件里)。
|
||
|
||
## 任务分解
|
||
|
||
- T1 复现 + 失败测试。
|
||
- T2 定根因并修(D3),合并两套新建入口(D1)。
|
||
- T3 覆盖四个次级页 + 移动抽屉的新建路径测试;「和 TA 对话」进入的新对话标题旁是 TA 的名字。
|
||
- T4 记录:BUG-1038(复发自 BUG-1015 的"新建意图"链路,写明为何当时的测试没覆盖客户端导航回首页 + 残留校正态);PROGRESS;更新 `docs/testing/secondary-new-chat-20260923.md` 增加"先开一条校正会话再从档案页新建"。
|
||
|
||
## 开工前置命令
|
||
|
||
```bash
|
||
git fetch origin --prune
|
||
node -v # 22.x
|
||
git worktree add -b codex/new-chat-from-people-20260926 .worktrees/new-chat-from-people-20260926 origin/staging
|
||
cd .worktrees/new-chat-from-people-20260926/frontend && npx tsx --test tests/chat-session-url.test.ts tests/new-chat-recovery.test.ts tests/home-bootstrap-run.test.ts
|
||
```
|
||
|
||
## BUG 编号
|
||
|
||
写单时最大 BUG-1037;本单 **BUG-1038**,开工时核对。
|