docs(debt): 补记之十七(续)—— 忠实模拟(线上真 schema 副本)+ 严重性升档: **不自愈、永久失败**
① 用 `sqlite3 "file:/opt/agentmail/data/agentmail.db?mode=ro" ".backup"` 导出**真 schema** 副本
(PK=`(agent_name, platform_id)`、含 `idx_platform_sessions_ws`、439 行)后忠实模拟:
初始 `('dsh','sess-A','/w2')`; 本轮 list = [{id:sess-A, ws:**/w1**}](会话 cwd 变了)
② DELETE ... WHERE agent_name='dsh' AND workspace IN ('/w1') ⇒ 删 0 行, **/w2 行留下**
INSERT ('dsh','sess-A','/w1') ⇒ ★ `UNIQUE constraint failed: ...agent_name, ...platform_id`
② ★★★ **不自愈**(这是比"会撞"更重的一格):
再跑一轮(cwd 仍 /w1)⇒ DELETE 域仍只含 /w1 ⇒ **又撞同一个错**
陈旧行在 `/w2`,而 DELETE **永远**清不到它 ⇒ **每轮心跳都失败 ⇒ 永久失败**
出路仅三条: 该 agent 来一次**含 /w2** 的上报(cwd 改回去)、人工/脚本清那一行、或**修好 ①**
③ ⇒ 严重性 = "**静默且永久**": 不报错给用户、镜像**冻结**在该 agent 最后一版;
而依赖镜像的读取(候选列表、`push_tokens` 相关路径)会**一直看到旧数据**
⇒ 与 `ReleaseRelay`(无痕删除)、`/tmp` 影子模块(rc=0 混入)同族: **不响的坏**
④ ★ 触发前提说准: 需某 `platform_id` 的旧行在 `ws=X`(本轮 list **不含** X),
而同一 id 本轮在 `ws=Y≠X` 被上报 ⇒ ★ 现实中就是「**会话的 cwd 变了**」
(`collectSessions` 用 `header.cwd` 作 workspace)
⇒ "改工作目录/重开会话/迁移项目目录"是**常见操作**、非异常路径
⇒ 生产实测当前 0 例 ⇒ 尚未发生,但**门槛只是一个 cwd 变更**
校验: go test ./internal/repo/ -run Debt -count=1 ⇒ ok; /tmp/real 已清
This commit is contained in:
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user