fix(chat): choose the chart person before the first message

This commit is contained in:
jesse-ux
2026-09-22 12:57:04 +08:00
parent 6d06fca0d8
commit 2a3013f224
22 changed files with 973 additions and 27 deletions
+16
View File
@@ -13263,3 +13263,19 @@
- 相关记录:BUG-011、BUG-058、BUG-188
- 复发自:无
- 修复版本:本分支 `fix(report): project ordinary reports onto public prose only`(未推送,未部署)
## BUG-1000 | 普通聊天顶栏不能在开口前选择人物
- 状态:resolved
- 首次发现:2026-09-22
- 最近更新:2026-09-22
- 影响面:普通聊天顶栏的人物入口;空会话的待发送绑定;已有消息会话的换人路径
- 用户现象:服务端已经能按会话绑定人物,但顶栏仍是一段不能点的名字。新对话沿用账户里上次选中的星盘,开口前看不见、也换不了人。开口之后没有「新建会话并使用此人物」这条路。
- 触发条件:打开普通聊天,想在第一条消息前换成另一位本人名下的人物;或在已经说过话的会话里点另一个人。
- 根因:BUG-997 只补了服务端真值。`startNewChat` 仍把 `activeChartId` 抄进新会话,顶栏 `.chat-header-chart` 仍是静态 `span`,没有选择器。历史会话打开时还会把该人物写回账户级 `activeChartId`
- 修复:普通咨询顶栏改为「当前星盘」按钮。本人是看得见的默认。空会话选择只更新该会话的绑定,已落库的空会话 PATCH 只提交 id 和角色,姓名由服务端填写。已有消息的会话不改绑,只提供新建会话。人物列表失败、未读完或不完整时不写入绑定。资料已删除的旧会话仍可阅读,发送阻断,不退回本人。报告、每日星语和生时校正不挂这个选择器。
- 验证:见 `docs/tasks/PROGRESS-chat-subject-picker-20260922.md`。没有登录态,浏览器点击未验收,见 `docs/testing/chat-subject-picker-20260922.md`
- 防复发:新普通会话的人物 id 固定为本人,不读 `activeChartId`。打开历史会话不得改写该会话绑定,也不得把绑定抄回 `activeChartId`。有消息的会话不得 PATCH 人物。列表未就绪时不得创建绑定。
- 相关记录:BUG-997
- 复发自:无
- 修复版本:本分支 `fix(chat): choose the chart person before the first message`(未推送,未部署)
@@ -0,0 +1,34 @@
# 进度 · 开始聊天选择人物(2026-09-22
基线:`6d06fca0d878403dc1fab646a20c5b8ef7447fd5`(开工时 `origin/staging`)。分支 `codex/chat-subject-picker-20260922`。未推送,未部署。
## 做了什么
- 普通咨询顶栏的静态人名改成 `ChatProfilePicker`。读屏名称是「当前星盘:人物名」,看见的字只有当前人物名。
- 新对话默认本人,不读 `activeChartId`。空会话里点另一个人,只改这一段还没开口的绑定。还没落库的空会话把 id 留在本地,第一条消息的 `POST /api/sessions` 带上它,姓名和角色由服务端填写。已经落库、仍没有消息的空会话只 `PATCH` id 和角色,不提交客户端姓名,再读回服务端姓名。
- 已经有消息的会话不改绑。点另一个人只有「新建会话并使用此人物」。回答还在进行时这个动作不执行。
- 打开历史会话不再把该人物写回账户级 `activeChartId`。深链和刷新仍只用库里的绑定。
- 人物列表加载中或失败时不创建绑定,也不把缺列表说成「资料已删除」。资料确认已删除后,旧会话还能看,发送被挡住,不退回本人。资料改名后,选择器显示资料里的现名,不改写已锁定会话的快照。
- 报告、每日星语入口和生时校正不挂这个选择器。校正顶栏仍是原来的静态 chip。
## 断言变更
没有改既有断言的期望值,也没有删测试名。`chart-library-session``session-open-preserves-identity``chat-session-write``chat-session-authority` 各加了一条,原断言仍在。
| 测试 | 原值 | 新值 | 原因 |
| --- | --- | --- | --- |
| 无 | — | — | 本轮只加断言,没有把旧期望改松 |
## 验证
- `tsc --noEmit`:通过。
- `npm run lint`0 error。既有 warning 未改。
- `npx tsx --test` 定向:`chat-profile-picker` 10、`chart-library-session` 6、`session-open-preserves-identity` 5、`chat-session-write` 17、`chat-session-authority` 10、`home-shell-growth-contract` 4,加上同批的 `chat-session-url``composer-isolation-contract``consultation-subject-binding`。合计 79 pass / 0 fail;收尾再跑前六个文件 52 pass / 0 fail。
- 未跑全量 `npm test`,未跑 `next build`
- `Home()``useState` 34(上限 36),`useRef` 37(上限 37),都没有新增调用。`page.tsx` 1844 行,低于 1846 + 150 的粗护栏。
- 没有登录态。浏览器点击未验收,见 `docs/testing/chat-subject-picker-20260922.md``BLOCKED.md`
## 没动
- `starter-home.tsx`、starter-entry CSS、`consult/route.ts``docs/tasks/README.md`
- 没有改表,没有改服务端 resolver 的失败即关闭语义。
@@ -0,0 +1,14 @@
# 聊天人物选择:浏览器点击未在本轮验收
本轮只在工作树里跑了类型检查、lint 和定向 node:test。没有登录态,也没有打开浏览器。
下面这些不能写成通过。需要一位已登录的人,用合成人物(不要用真实出生资料)在普通聊天里看:
- [ ] 新对话顶栏能看见本人名字。点开后有本人,也有自己添加的其他人。Enter、Space 和点击都能开合;Esc 和点外面会关上,焦点回到人名。
- [ ] 还没发消息时换成另一个人,再发出去。刷新和把链接换到另一台设备,这段对话仍是那个人,不是账户里上次选的星盘。
- [ ] 已经说过话的会话里点另一个人,只出现「新建会话并使用此人物」。旧会话的历史不变。回答还在生成时,这个动作要等回答结束。
- [ ] 人物列表读不出来时,不换成一个没点过的人。
- [ ] 删掉对方资料后,旧会话还能看,不能再发,也不会变成本人。
- [ ] 报告、每日星语、生时校正上没有这个人物按钮。
示例只用虚构人物。不要把真实姓名、出生时间或邮箱写进记录。