fix(web): retire session archive UI and API, restore archived rows
Remove archive/restore from the session menu and drop archived=1 listing. PATCH still accepts archived_at from old bundles then ignores it. A forward migration clears archived_at without bumping updated_at. Delete stays unchanged.
This commit is contained in:
+6
-6
@@ -13125,13 +13125,13 @@
|
||||
- 状态:investigating
|
||||
- 首次发现:2026-09-21
|
||||
- 最近更新:2026-09-21
|
||||
- 影响面:`app-sidebar.tsx` 会话分组页眉、`SidebarSessionControls.onToggleArchivedView` / `archivedCount`、`toggleArchivedView`
|
||||
- 影响面:会话行菜单「归档 / 恢复」、`GET /api/sessions?archived=1`、`archived_at` 存量
|
||||
- 用户现象:会话行菜单里可以「归档」,归档后它从侧栏消失;此后没有任何界面能列出归档记录,行菜单里的「恢复」也跟着不可达。除非记得 `?c=<uuid>` 深链,归档等于单向丢失。
|
||||
- 触发条件:在会话行菜单点「归档」。
|
||||
- 根因:`92558ee6`(2026-08-22,`fix(web): stack mobile audit tables and restore sidebar hierarchy`)删掉了分组页眉上的 `session-nav-toggle` 按钮(原文案「归档 N」/「返回」),但保留了它背后的整条链路:`onToggleArchivedView`、`archivedCount`、`showingArchived`、`toggleArchivedView()` 与 `GET /api/sessions?archived=1` 全部还在,只是没有调用者。`app-sidebar.tsx` 里两处 `showingArchived ? "归档记录" : …` 的三元条件因此恒取后者。全仓唯一提到 `onToggleArchivedView` 的非类型声明位置是 `use-home-shell-registration.ts` 里提供它的那一行。
|
||||
- 修复:待产品决策——恢复入口,或把归档能力整体下线(用户偏好:多余入口宁可删除也不修)。本轮只记录事实。
|
||||
- 验证:`grep -rn "ToggleArchivedView" frontend/src` 只有声明与提供方,无渲染调用点;`grep -rn "归档" frontend/src --include=*.tsx` 只剩行菜单文案与分组 aria-label。
|
||||
- 防复发:删除某个视图的唯一入口时,必须同时下线其数据链路,或留一条断言入口存在的测试;不得留下"接口活着、界面没有"的半截功能。
|
||||
- 根因:`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。**
|
||||
- 防复发:删除某个视图的唯一入口时必须同轮下线其数据链路,或留一条断言入口存在的测试。
|
||||
- 相关记录:BUG-990、BUG-553
|
||||
- 复发自:无
|
||||
- 修复版本:未修复
|
||||
- 修复版本:待本修复合入 staging 且门禁转绿
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
# PROGRESS · 归档能力整体下线(2026-09-21)
|
||||
|
||||
工作树:`.worktrees/archive-retire-20260921`
|
||||
分支:`codex/archive-retire-20260921`
|
||||
基线:`origin/staging` @ `f8cb1dcd`(任务书;最近门禁提交 `df329fa9`)
|
||||
|
||||
## 任务状态
|
||||
|
||||
| 任务 | 状态 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| T1 前端下线 | 完成 | 行菜单、控件、hook、legacy localStorage 写库都去掉;删除路径不动 |
|
||||
| T2 服务端下线 | 完成 | 列表恒 `archived_at is null`;PATCH 忽略 `archived_at` |
|
||||
| T3 存量放回 | 完成 | 迁移清空 `archived_at`,不写 `updated_at` |
|
||||
| T4 记录 | 完成 | BUG-991 investigating,等门禁 Postgres 转绿再 resolved |
|
||||
|
||||
## 改断言三栏
|
||||
|
||||
| 测试 | 原值 | 新值 | 原因 |
|
||||
| --- | --- | --- | --- |
|
||||
| `database-session-list-visibility` 归档视图半边 | `applyArchiveFilter(..., true)` 返回 `[archivedRectification]` | 删除该半边 | 归档视图已下线 |
|
||||
| 同上「非空 archived_at 不入列」 | 有 | 保留 | 列还在,守卫仍需测 |
|
||||
| `session-list-filter` 跨层组合 | 六组含 `archivedView` | 四组,无归档视图 | 同上 |
|
||||
| `chat-session-write` metadata schema | 接受 `archived_at` | schema 拒绝;extract 读后忽略 | 旧 bundle 不得 400 |
|
||||
| `chat-session-authority` 列表 GET | `isArchivedSessionQuery` | `.is("archived_at", null)` | 不再有归档查询参数 |
|
||||
| `chat-session-url` `toggleArchivedSession` | 归档也走 fallback URL | 函数删除,删除路径仍走 fallback | 归档下线 |
|
||||
|
||||
## 测试
|
||||
|
||||
| 项 | 结果 |
|
||||
| --- | --- |
|
||||
| `tsc --noEmit` | 0 错 |
|
||||
| `npm run lint` | 0 error / **119 warning**(未增) |
|
||||
| 定向 | sidebar-contract / chat-session-authority / write / url / session-list-filter / lifecycle / chart-library / local-postgres-not / home-shell-growth **102 过** |
|
||||
| `npm test` | **3603** 条,**3514** 过 / **89** 红。较本机 `df329fa9` 全量(3600 / 3512 / 88)净增 2 绿(行菜单合同、PATCH 忽略 `archived_at`)+ 1 红(新的迁移 Postgres 测试,Docker 网段耗尽)。其余失败清单仍是本机 Windows 旧项。 |
|
||||
| `grep 归档 frontend/src` | 无命中 |
|
||||
| `grep ToggleArchivedView frontend/src` | 无命中 |
|
||||
| `npm run test:db` | Docker 网段耗尽,未跑通。BUG-991 保持 investigating。 |
|
||||
| `next build` | 本轮未跑(Windows symlink EPERM 已知缺口) |
|
||||
|
||||
`local-postgres-not.test.ts` 一字未改,定向仍绿。
|
||||
@@ -154,7 +154,7 @@
|
||||
| — | `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` | — | **归档能力整体下线(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。删除能力不动 | 待领取 | — |
|
||||
| `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。删除能力不动 | 待验收 | `codex/archive-retire-20260921` |
|
||||
|
||||
### 个人报告
|
||||
|
||||
|
||||
@@ -98,14 +98,16 @@
|
||||
- ✅ 连点两次不会重复插入同一批会话。
|
||||
- ❌ 加载更多后列表顺序乱了,或出现重复标题。
|
||||
|
||||
### C2. 归档视图
|
||||
### ~~C2. 归档视图~~
|
||||
|
||||
1. 点侧栏「查看已归档」,再点回来。
|
||||
归档能力已于 2026-09-21 下线(BUG-991)。
|
||||
|
||||
- ✅ 两个视图的会话集合互不重叠:归档视图只显示已归档,正常视图只显示未归档。
|
||||
- ✅ 当前正在看的会话即使被过滤条件排除,也仍然留在列表里(原有规则)。
|
||||
- ✅ 切换视图时**会话菜单自动收起**。
|
||||
- ✅ 归档数量角标与实际归档条数一致。
|
||||
1. ~~点侧栏「查看已归档」,再点回来。~~
|
||||
|
||||
- ~~✅ 两个视图的会话集合互不重叠:归档视图只显示已归档,正常视图只显示未归档。~~
|
||||
- ~~✅ 当前正在看的会话即使被过滤条件排除,也仍然留在列表里(原有规则)。~~
|
||||
- ~~✅ 切换视图时**会话菜单自动收起**。~~
|
||||
- ~~✅ 归档数量角标与实际归档条数一致。~~
|
||||
|
||||
### C3. 会话菜单
|
||||
|
||||
@@ -114,9 +116,9 @@
|
||||
- ✅ 同一时刻只有一个菜单展开;点另一条会自动关掉前一个。
|
||||
- ✅ 生成回答中(有进行中的咨询)时菜单项按原规则禁用。
|
||||
|
||||
### C4. 重命名 / 置顶 / 归档 / 分享
|
||||
### C4. 重命名 / 置顶 / 分享
|
||||
|
||||
逐个操作一遍。
|
||||
逐个操作一遍。归档能力已于 2026-09-21 下线(BUG-991)。
|
||||
|
||||
- ✅ 每项的提示文案、成功后的列表位置变化与改前一致。
|
||||
- ✅ 置顶后该会话上移到置顶区;取消置顶后回到时间序。
|
||||
|
||||
@@ -60,11 +60,11 @@
|
||||
|
||||
账号历史明显超过 40 条时:
|
||||
|
||||
1. 打开未归档历史。
|
||||
1. 打开历史。
|
||||
2. 滚到列表底部,再往下一点。
|
||||
3. 切到归档视图,同样滚到底。
|
||||
3. ~~切到归档视图,同样滚到底。~~ 归档能力已于 2026-09-21 下线(BUG-991)。
|
||||
|
||||
- ✅ 预期:首屏大约是最近 40 条非置顶,加上全部收藏。滚到底没有「加载更多」或「没有更多」文案,新行直接接上。归档视图同样分页。
|
||||
- ✅ 预期:首屏大约是最近 40 条非置顶,加上全部收藏。滚到底没有「加载更多」或「没有更多」文案,新行直接接上。
|
||||
- ❌ 失败:一次画出全部历史;或底部出现加载/没有更多字样;或收藏不在第一屏。
|
||||
|
||||
## 7. 他人资料副标题(P1)
|
||||
|
||||
Reference in New Issue
Block a user