docs: BUG-991/992 收口,补真机走查清单
门禁 run 2837 全绿、d2cec179 已部署、retire 迁移已应用。 五条只有真人能验的写成 docs/testing 清单。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0199rbQDTsUbCVw84wc8BTFe
This commit is contained in:
co-authored by
Claude Opus 5
parent
d2cec17995
commit
c954fb8e67
+6
-6
@@ -13122,7 +13122,7 @@
|
||||
|
||||
## BUG-991 | 会话归档后没有任何入口能看回来或恢复
|
||||
|
||||
- 状态:investigating
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-21
|
||||
- 最近更新:2026-09-21
|
||||
- 影响面:会话行菜单「归档 / 恢复」、`GET /api/sessions?archived=1`、`archived_at` 存量
|
||||
@@ -13130,11 +13130,11 @@
|
||||
- 触发条件:在会话行菜单点「归档」。
|
||||
- 根因:`92558ee6`(2026-08-22)删掉了分组页眉上的归档切换按钮,但保留了整条数据链路。产品 2026-09-21 拍板整体下线,不装回入口。
|
||||
- 修复:删行菜单归档/恢复、删 `archived=1` 查询与 PATCH 写 `archived_at`(旧 bundle 仍发送则 2xx 忽略)、迁移把存量 `archived_at` 清空且不 bump `updated_at`。删除会话能力不动。`archived_at` 列本轮不删。
|
||||
- 验证:`sidebar-contract.test.ts` 行菜单恰好是重命名/收藏/分享/删除;`local-postgres-not.test.ts` 原样保留;`database-session-list-visibility.test.ts` 仍断言 `archived_at` 非空不入列,并测迁移清空。**门禁该 Postgres 测试转绿前不得标 resolved。**
|
||||
- 验证:Gitea 门禁 run **2837** 全绿(3656 条 / 3656 过 / 0 红 / 0 skip)。真实 Postgres 测试 `ok 1240 - retire archive migration clears archived_at without bumping updated_at`:执行从迁移文件切出的 `update` 后 `archived_at` 归零,同一行的 `pinned` / `messages` / `updated_at` 与执行前逐字节相同,重跑仍 0 行;`ok 1239` 断言 `archived_at` 非空的行仍不入列;`ok 3444` 锁定行菜单只剩重命名/收藏/转发/删除;`ok 788` 断言 PATCH 收到 `archived_at` 回 2xx 不落库。`local-postgres-not.test.ts` 原样保留。`migrate-staging-database` run 1435 与 `deploy-staging` run 1436 成功,`/api/health` 的 `deployment.gitCommit` = `d2cec179`、`database.latestMigration` = `20260921010000_retire_chat_session_archive.sql`、八项 check 全 ok。验收方独立变异测试:把「归档」菜单项注回 `sidebar-session-row.tsx` 后,Python 合同与 `sidebar-contract.test.ts` 同时转红。真机走查(归档项消失、旧归档会话回列表且时间未变、删除仍可用)见 `docs/testing/`,仍欠。
|
||||
- 防复发:删除某个视图的唯一入口时必须同轮下线其数据链路,或留一条断言入口存在的测试。
|
||||
- 相关记录:BUG-990、BUG-553
|
||||
- 相关记录:BUG-990、BUG-992、BUG-553
|
||||
- 复发自:无
|
||||
- 修复版本:待本修复合入 staging 且门禁转绿
|
||||
- 修复版本:`5a4b8738` + `d2cec179`(staging 已部署)
|
||||
|
||||
## BUG-992 | 归档下线后门禁 Python 合同仍要求归档入口存在
|
||||
|
||||
@@ -13146,8 +13146,8 @@
|
||||
- 触发条件:向 staging 推送删掉归档入口的前端改动。
|
||||
- 根因:Python 合同对前端源码做字符串断言,要求 `toggleArchivedSession` 等必须出现。前序单 grep 只扫 `frontend/`,扫不到 `tests/`。同类第四次。
|
||||
- 修复:那五个 token 从「必须出现」翻成「必须不出现」,且只对 `sidebar-session-row.tsx` 与 `use-session-management.ts` 做反向断言。归档测试重写,保住 `writeChatSession` 的 POST/PATCH 合同,并把「归档不走 DELETE」改成「删除仍走 DELETE」。`frontend/AGENTS.md` 要求删符号前 `git grep -- tests/ frontend/`。
|
||||
- 验证:`python -m pytest tests/test_session_management_entrypoints.py`;门禁以合入后的 run 为准。
|
||||
- 验证:`python -m pytest tests/test_session_management_entrypoints.py` 3 条全绿(验收方独立复跑);门禁 run **2837** 全绿、`publish` 不再跳过。变异测试:把「归档」注回行菜单后该合同转红。
|
||||
- 防复发:删除或重命名任何前端符号、类名、可见文案之前,必须 `git grep -n "<符号>" -- tests/ frontend/`,不得只 grep `frontend/`。
|
||||
- 相关记录:BUG-933、BUG-934、BUG-939、BUG-991
|
||||
- 复发自:BUG-939(Python 合同盯着已搬走的前端源码)
|
||||
- 修复版本:待本修复合入 staging
|
||||
- 修复版本:`d2cec179`(staging 已部署)
|
||||
|
||||
@@ -154,8 +154,8 @@
|
||||
| — | `PROGRESS-starter-greeting-20260917.md` | 首页开场语改成 claude.ai 式单行问候:`starter-greeting.ts` 的「称呼 + 追问句」五时段十五条收成三个池子(时段 / 星期 / 回访,按 `variantSelection` 确定性取一条),副标题行与 `.starter-salutation` 下线,h1 降到 `clamp(24px, 2.8vw, 30px)`;追问移到输入框占位符「想聊什么都可以」。产品直接拍板,非 Bug,不占 BUG 号 | 待验收 | `codex/starter-greeting-20260917` |
|
||||
| `TASK-session-list-rebuild-20260921.md` | `PROGRESS-session-list-rebuild-20260921.md` | **P0 会话列表重建(`e4e73f56` 的返工)**:服务端 `GET /api/sessions` 用 `messages <> '[]'` 排除空咨询,但校正会话的 `messages` 永远是 `[]`(建行写死空数组、创建合同只收空数组、PATCH 忽略、`touch_chat_session_from_rectification_case` 只 bump `updated_at`)→ **全部生时校正会话从侧栏消失**,而客户端 `isListedSidebarSession` 明确放行校正会话,两层规则相反且无跨层对断(BUG-987);同一提交把副标题换成 `created_at`,排序/分组/游标仍是 `updated_at`,列表可见时间不单调(9/18→9/17→9/7→9/16)(BUG-988);BUG-928 让步下来的「复用空会话」不 bump 时间,点新建变成跳回 9/17 的旧草稿(BUG-989)。**产品 09-21 拍板**:D1 副标题改最后活动时间(推翻 BUG-929 该条,其余保留)、D2 收掉 `BLOCKED.md:120` 的让步,第一问前不落库、删复用与 `draft`。T1 不得让步,T3 可拆轮。BUG 段 987 起 | **已验收**(经修复单) | `e71e4f92`(Claude 验收:T1/T2/T3 实现均正确;tsc 0 / lint 0 error 119 warning 与基线同 / `npm test` 本机 3640 条 34 红与 `f8d65e48` 逐条一致、净增 5 绿 / `next build --webpack` 通过、`/` Static、首屏 gzip 643,115 较基线 −0.027% / page.tsx 1826→1791。**P1:门禁 run 2832 红、staging 未部署**——新加的真实 Postgres 测试在有 Docker 的门禁机上跑出 `unsupported not filter`,兼容层 `not()` 不支持 `is` 算子,归档分支炸。修复单 `TASK-session-list-rebuild-fix-20260921.md` 已验收通过,`df329fa9` 已部署) |
|
||||
| `TASK-session-list-rebuild-fix-20260921.md` | `PROGRESS-session-list-rebuild-fix-20260921.md` | **验收修复单(挡着三条修复上线)**:本地 PG 兼容层 `LocalPostgresQueryBuilder.not()` 只认 `eq` / `cs` 两个算子,`not("archived_at","is",null)` 直接 throw → `GET /api/sessions?archived=1` 落外层 catch 回 500,**侧栏「归档记录」自 `a1956deb`(09-06,BUG-553)起一直打不开**,两周无人发现是因为只有源码正则合同看着它;本轮新加的真实 Postgres 测试第一次真跑到这条路径,把它照出来,于是门禁 run 2832 红、`e71e4f92` 没部署。**决策**:在兼容层补 `is not null / is not true / is not false`,不得反过来改调用方绕开,不得删改测试断言让门禁变绿。与 BUG-926 的 `order()` 缺口同类。BUG 段 990 起 | **已验收通过** | `df329fa9`(Claude 验收:`not()` 增 `isNot` kind,统一走新的 `compileUnaryIsClause` 编译 `is [not] null/true/false`,非法取值仍 throw;`filterClause` 是唯一消费者、已覆盖,未落进兜底分支。**门禁 run 2833 全绿:3653 条 / 3653 过 / 0 红 / 0 skip**,`ok 1238` 即那条真实 Postgres 归档测试;migrate 2834、deploy 2835 成功,`/api/health` 的 `deployment.gitCommit` = `df329fa9`。本机复跑:tsc 0 / lint 0 error 119 warning 未增 / `npm test` 用例名逐条 diff 较 `e71e4f92` **恰好 +2 无删除**、失败清单完全一致 / `next build --webpack` 通过、`/` Static、首屏 gzip 643,116(+1 B)。**顺带查出 BUG-991**:归档视图的 UI 入口在 `92558ee6`(08-22)就被删了,`onToggleArchivedView` 全仓无调用点 → BUG-990 原描述「用户点归档记录后 500」不成立(接口层 500 属实,用户碰不到),已在 Bug 历史更正;归档后看不回来也恢复不了是真问题,待产品决策) |
|
||||
| `TASK-archive-retire-20260921.md` | `PROGRESS-archive-retire-20260921.md` | **归档能力整体下线(BUG-991)**:行菜单能「归档」,归档后没有任何界面能列出或恢复它——切换按钮 `session-nav-toggle`(「归档 N」/「返回」)在 `92558ee6`(2026-08-22)被删,但 `onToggleArchivedView` / `archivedCount` / `showingArchived` / `toggleArchivedView()` / `GET /api/sessions?archived=1` / `applyArchiveFilter` 整条链路留着,全仓无渲染调用点;行菜单的「恢复」同样不可达(归档行永远不进 `visibleSessions`)。接口自 `a1956deb`(09-06)起就是 500(BUG-990),一个月没人发现正因为点不到。**产品 09-21 拍板整个下线**(口径:多余入口宁可删除也不修),不装回入口。D2 本轮不删 `archived_at` 列(§7.6 拆两轮),只清空存量;D3 不得回退 BUG-990 的兼容层修复;D4 存量归档会话一律放回列表。**迁移禁止 bump `updated_at`**,否则全部历史会话跳顶、毁掉刚修好的 BUG-988。让步顺序里 T3 必须先于 T1/T2。删除能力不动 | **验收未通过(1 条 P1)** | `5a4b8738`(Claude 验收:**业务三层全部正确**——迁移只清 `archived_at`、无任何 `updated_at` 赋值、`schema_owner` 守卫、幂等;接口删 `?archived=1` 且 PATCH 收到 `archived_at` 回 2xx 不落库;界面行菜单只剩 收藏/重命名/转发/删除,`applyLegacySessionControls` 只删 archived 半边、留 pinned 半边;`local-postgres-not.test.ts` 与删除链路一字未动;`sidebar-contract.test.ts` 新增菜单项锁定断言。tsc 0 / lint 0 error 119 warning / `npm test` 3644 条用例名 diff **+3 无删除**、失败清单与 `df329fa9` 逐条一致 / `/` Static / 首屏 gzip 642,382(−0.11%)。**P1:门禁 run 2836 红在 Python**——`tests/test_session_management_entrypoints.py` 两条源码合同仍要求归档入口存在,本机复现恰好这两条。前序单的自查口径只写了 grep `frontend/src`,扫不到 `tests/` 下的 Python 合同。**同类第四次**(BUG-933/934/939)。修复单 `TASK-archive-retire-fix-20260921.md`) |
|
||||
| `TASK-archive-retire-fix-20260921.md` | `PROGRESS-archive-retire-fix-20260921.md` | **验收修复单(挡着归档下线上线)**:`tests/test_session_management_entrypoints.py` 的 `test_chat_history_management_actions_are_exposed` 断言 `toggleArchivedSession` / `showArchivedSessions` / 「已归档,可在左侧归档中恢复。」/「归档」/「恢复」必须出现;`test_archiving_never_calls_the_delete_endpoint` 用 `source.index("function toggleArchivedSession")` 切片,函数没了直接 `ValueError`。**决策**:翻成反向断言而非删文件(反向断言只对 `sidebar-session-row.tsx` 与 `use-session-management.ts` 做,整份 `_home_surface()` 上做「恢复」会误伤);重写的测试必须保住与归档无关的 `method: mode === "create" ? "POST" : "PATCH"` 合同,并把「归档不走 DELETE」翻成「删除仍走 DELETE」。**F2 防复发**:`frontend/AGENTS.md` 加一条——删改前端符号/类名/可见文案前必须 `git grep -- tests/ frontend/` 而不是只扫 `frontend/`。BUG 段 992 起 | 待验收 | `codex/archive-retire-fix-20260921` |
|
||||
| `TASK-archive-retire-20260921.md` | `PROGRESS-archive-retire-20260921.md` | **归档能力整体下线(BUG-991)**:行菜单能「归档」,归档后没有任何界面能列出或恢复它——切换按钮 `session-nav-toggle`(「归档 N」/「返回」)在 `92558ee6`(2026-08-22)被删,但 `onToggleArchivedView` / `archivedCount` / `showingArchived` / `toggleArchivedView()` / `GET /api/sessions?archived=1` / `applyArchiveFilter` 整条链路留着,全仓无渲染调用点;行菜单的「恢复」同样不可达(归档行永远不进 `visibleSessions`)。接口自 `a1956deb`(09-06)起就是 500(BUG-990),一个月没人发现正因为点不到。**产品 09-21 拍板整个下线**(口径:多余入口宁可删除也不修),不装回入口。D2 本轮不删 `archived_at` 列(§7.6 拆两轮),只清空存量;D3 不得回退 BUG-990 的兼容层修复;D4 存量归档会话一律放回列表。**迁移禁止 bump `updated_at`**,否则全部历史会话跳顶、毁掉刚修好的 BUG-988。让步顺序里 T3 必须先于 T1/T2。删除能力不动 | **已验收**(经修复单) | `5a4b8738`(Claude 验收:**业务三层全部正确**——迁移只清 `archived_at`、无任何 `updated_at` 赋值、`schema_owner` 守卫、幂等;接口删 `?archived=1` 且 PATCH 收到 `archived_at` 回 2xx 不落库;界面行菜单只剩 收藏/重命名/转发/删除,`applyLegacySessionControls` 只删 archived 半边、留 pinned 半边;`local-postgres-not.test.ts` 与删除链路一字未动;`sidebar-contract.test.ts` 新增菜单项锁定断言。tsc 0 / lint 0 error 119 warning / `npm test` 3644 条用例名 diff **+3 无删除**、失败清单与 `df329fa9` 逐条一致 / `/` Static / 首屏 gzip 642,382(−0.11%)。**P1:门禁 run 2836 红在 Python**——`tests/test_session_management_entrypoints.py` 两条源码合同仍要求归档入口存在,本机复现恰好这两条。前序单的自查口径只写了 grep `frontend/src`,扫不到 `tests/` 下的 Python 合同。**同类第四次**(BUG-933/934/939)。修复单 `TASK-archive-retire-fix-20260921.md` 已验收通过,`d2cec179` 已部署) |
|
||||
| `TASK-archive-retire-fix-20260921.md` | `PROGRESS-archive-retire-fix-20260921.md` | **验收修复单(挡着归档下线上线)**:`tests/test_session_management_entrypoints.py` 的 `test_chat_history_management_actions_are_exposed` 断言 `toggleArchivedSession` / `showArchivedSessions` / 「已归档,可在左侧归档中恢复。」/「归档」/「恢复」必须出现;`test_archiving_never_calls_the_delete_endpoint` 用 `source.index("function toggleArchivedSession")` 切片,函数没了直接 `ValueError`。**决策**:翻成反向断言而非删文件(反向断言只对 `sidebar-session-row.tsx` 与 `use-session-management.ts` 做,整份 `_home_surface()` 上做「恢复」会误伤);重写的测试必须保住与归档无关的 `method: mode === "create" ? "POST" : "PATCH"` 合同,并把「归档不走 DELETE」翻成「删除仍走 DELETE」。**F2 防复发**:`frontend/AGENTS.md` 加一条——删改前端符号/类名/可见文案前必须 `git grep -- tests/ frontend/` 而不是只扫 `frontend/`。BUG 段 992 起 | **已验收通过** | `d2cec179`(Claude 验收:四个点名的坑全避开——`writeChatSession` 的 POST/PATCH 合同搬进改名后的测试;反向断言只打 `sidebar-session-row.tsx` 与 `use-session-management.ts`,没对整份 `_home_surface()` 禁「恢复」;删除切片改断言 `method: "DELETE"`、删除那条测试一字未动;P3 也顺手做了,迁移测试改为从文件切出 `update` 再执行。**门禁 run 2837 全绿:3656 条 / 3656 过 / 0 红 / 0 skip**,`ok 1240` 是带 Docker 的迁移测试(`archived_at` 归零、`pinned`/`messages`/`updated_at` 逐字节不变、重跑幂等);migrate 1435 + deploy 1436 成功,`/api/health` 的 `gitCommit` = `d2cec179`、`latestMigration` = `20260921010000_retire_chat_session_archive.sql`。本机:pytest 3 条全绿 / tsc 0 / lint 0 error 119 warning / `npm test` 失败清单与 `5a4b8738` 逐条一致;diff 无 `frontend/src` 改动故未重测构建。**独立变异测试**:把「归档」注回行菜单,Python 合同与 `sidebar-contract.test.ts` 同时转红。观察项:`consultation-smalltalk.test.ts` 三条用例在全量并发下偶发漏报(单跑稳定 30/30、失败数不变),`# tests` 总数因此会 ±3 抖,验收改比用例名列表) |
|
||||
|
||||
### 个人报告
|
||||
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
# 真机走查:会话列表重建 + 归档下线(2026-09-21)
|
||||
|
||||
对应 `TASK-session-list-rebuild-20260921` / `-fix` 与 `TASK-archive-retire-20260921` / `-fix`,
|
||||
覆盖 BUG-987、988、989、990、991、992。
|
||||
|
||||
- 环境:`https://staging.jyotisha.chat`,登录你自己的账号
|
||||
- 已部署 SHA:`d2cec179`(`/api/health` 的 `deployment.gitCommit`)
|
||||
- 迁移:`20260921010000_retire_chat_session_archive.sql` 已应用
|
||||
- 自动化已覆盖的不在这里重复;下面五条是**只有真人能看的**
|
||||
|
||||
---
|
||||
|
||||
## 1. 生时校正会话回到侧栏(BUG-987)
|
||||
|
||||
1. 打开首页,看侧栏「最近」列表。
|
||||
|
||||
- ✅ 能看到 9 月 8 日以来做过的**生时校正**会话(标题形如「生时校正 · M月D日」)。
|
||||
- ❌ 一条校正会话都没有 → BUG-987 未真正修复,回报。
|
||||
|
||||
## 2. 时间从上到下单调递减(BUG-988)
|
||||
|
||||
1. 沿着侧栏从上往下读每行下面的时间。
|
||||
|
||||
- ✅ 时间严格递减,不出现 9/18 → 9/17 → 9/7 → 9/16 这种跳。
|
||||
- ✅ 分组(今天 / 昨天 / 最近 7 天 / 最近 30 天 / 更早)与行上显示的时间对得上。
|
||||
- ✅ 事故截图里那条「9月16日 · 今日节奏」现在显示 **9月16日**(它 9/7 创建、9/16 最后使用),不再显示 9月7日。
|
||||
|
||||
## 3. 新建对话开口前不落库(BUG-989)
|
||||
|
||||
1. 连续点五次「新建对话」。
|
||||
|
||||
- ✅ 侧栏**不出现**任何空的「新对话」行,也不会跳到某条旧的「新对话」上。
|
||||
- ✅ 主区是空的新会话,可以打字。
|
||||
|
||||
2. 发出第一句话。
|
||||
|
||||
- ✅ 侧栏出现一行,时间是**今天**,标题是模型总结出来的。
|
||||
- ✅ 只出现一行,不是两行。
|
||||
|
||||
## 4. 第一句话发送失败时草稿不丢(BUG-989)
|
||||
|
||||
1. 点「新建对话」,打一句话但**先断网**(或开飞行模式),再点发送。
|
||||
|
||||
- ✅ 报错提示出现。
|
||||
- ✅ **输入框里的字还在**,没有被清空。
|
||||
- ✅ 恢复网络后重新发送,能正常建会话,不会建出两条。
|
||||
|
||||
## 5. 归档已下线,旧归档会话回到列表(BUG-991)
|
||||
|
||||
1. 任选一条会话,点行尾「…」。
|
||||
|
||||
- ✅ 菜单只有:收藏(或取消收藏)、重命名、转发、删除。**没有「归档」,也没有「恢复」。**
|
||||
|
||||
2. 如果你以前归档过会话:
|
||||
|
||||
- ✅ 它们重新出现在侧栏。
|
||||
- ✅ 它们的时间**是当初最后一次使用的时间,不是今天**——如果它们全部挤在列表顶端显示今天,说明迁移动了 `updated_at`,立刻回报(这会毁掉第 2 条)。
|
||||
|
||||
3. 点「删除」。
|
||||
|
||||
- ✅ 确认框照常弹出,确认后会话消失。
|
||||
- ✅ 取消则什么都不发生。
|
||||
|
||||
---
|
||||
|
||||
## 回报格式
|
||||
|
||||
每条写 ✅ / ❌,❌ 的附一句现象描述和截图。第 5 条第 2 点若你从没归档过任何会话,写「无归档历史,跳过」。
|
||||
Reference in New Issue
Block a user