fix(web): keep rectification sessions listed and persist chats on first send
Independent Staging Quality Gate / validate (push) Failing after 16m52s
Independent Staging Quality Gate / publish (push) Skipped

Empty-consultation filtering is now session_type scoped so birth-time rows stay in the sidebar. Subtitles use updatedAt with sort/group/cursor. New chats stay local until the first send.
This commit is contained in:
jesse-ux
2026-09-21 16:39:32 +08:00
parent f8d65e484d
commit e71e4f9200
21 changed files with 461 additions and 186 deletions
+48
View File
@@ -13055,3 +13055,51 @@
- 相关记录:BUG-142
- 复发自:BUG-142(publish 超时预算;本次是缓存被过早丢掉后的冷构建)
- 修复版本:待本修复合入 staging 的门禁 run
## BUG-987 | 列表用 messages=[] 过滤,生时校正会话全部从侧栏消失
- 状态:resolved
- 首次发现:2026-09-21
- 最近更新:2026-09-21
- 影响面:`GET /api/sessions`、`excludeEmptyConsultations`、侧栏历史
- 用户现象:staging 侧栏一条生时校正都没有;深链 `?c=` 仍能打开同一会话。
- 触发条件:打开 `/` 或次级页拉会话列表。校正会话的 `chat_sessions.messages` 永远是 `[]`。
- 根因:`e4e73f56` 用全表 `messages <> '[]'` 当「有没有内容」。该判据只对咨询成立。客户端 `isListedSidebarSession` 放行校正,服务端先把行拿走。源码正则 `not("messages", "eq", [])` 从未拿真实行验证。
- 修复:过滤收窄为 `session_type.neq.consultation,messages.neq.[]`。归档视图同一条规则。校正内容在 case 表,不在 `messages` 列。
- 验证:`database-session-list-visibility.test.ts`(真实 Postgres,无 Docker 时 skip)、`session-list-filter.test.ts` 跨层对断、`chat-session-authority.test.ts`。
- 防复发:不得用「某列为空」推断会话有没有内容。列表过滤必须带 `session_type` 限定。不得用源码正则代替真实行测试。
- 相关记录:BUG-928、BUG-704
- 复发自:BUG-928(空咨询过滤写成全表 `messages <> '[]'`)
- 修复版本:待本修复合入 staging
## BUG-988 | 侧栏副标题用创建时间,排序用最后活动时间,列表读起来是乱的
- 状态:resolved
- 首次发现:2026-09-21
- 最近更新:2026-09-21
- 影响面:`sessionSidebarSubtitle`、`SESSION_LIST_COLUMNS`
- 用户现象:侧栏时间不单调(9/18 → 9/17 → 9/7 → 9/16),9/7 创建、9/16 仍在用的会话落在「最近 7 天」却显示 9/7。
- 触发条件:会话创建后隔天继续使用。
- 根因:`e4e73f56` 把 `created_at` 加进列表列,副标题读创建时间;排序、分组、游标仍用 `updated_at`。产品 2026-09-21 推翻 BUG-929 的「副标题为创建时间」。
- 修复:副标题改 `updatedAt`。列表列去掉 `created_at`。详情接口仍返回 `created_at`。
- 验证:`session-groups.test.ts`(早创建晚活动:位置按活动时间,副标题显示活动时间)、`chat-session-authority.test.ts` 列合同。
- 防复发:显示、排序、分组、游标必须用同一个时间字段(`updated_at`)。`SESSION_LIST_COLUMNS` 不得再含 `created_at`。
- 相关记录:BUG-929、BUG-553
- 复发自:BUG-929(副标题改创建时间后与排序键分叉)
- 修复版本:待本修复合入 staging
## BUG-989 | 点「新建对话」复用旧空会话,第一问之前就落库
- 状态:resolved
- 首次发现:2026-09-21
- 最近更新:2026-09-21
- 影响面:`startNewChat`、`send()`、`GET /api/sessions` 的 `draft`、首页启动
- 用户现象:点新建落到 9/17 的旧「新对话」;连点不会开新的。空咨询在开口前就已经在库里。
- 触发条件:点「新建对话」,或启动时并入 `draft`。
- 根因:BUG-928 让步成「复用空咨询 + 服务端 draft」。复用既不 bump 时间也不改创建时间。产品 2026-09-21 收掉该让步。
- 修复:`startNewChat` 只在本地创建,不 `POST`、不写 `?c=`。第一问 `send()` 先 `POST /api/sessions` 再走既有 append。落库失败撤销本地会话并保留输入框草稿。删除 `draft` 字段、`draftRow`、`findReusableEmptyConsultation`。
- 验证:`session-list-filter.test.ts` 源码合同(新建无 POST / 无 URL,send 时 create,失败不 `setDraft`)、`chat-session-url.test.ts`、`session-list-lifecycle.test.tsx` 仍覆盖无 draft 的列表响应。
- 防复发:第一问之前不得 `POST /api/sessions`。未落库会话不得写入 `?c=`。列表响应不得再带 `draft`。
- 相关记录:BUG-928、BUG-987
- 复发自:BUG-928(延迟落库让步未收口)
- 修复版本:待本修复合入 staging