docs(debt): ④ 补齐第四块 —— "正常态"丢数据 ⇒ 加判据 (d) 与治本项(请求级 scope 字段)

pi 48c2c4c9 报的缺口我独立复核成立,并把它查到**结构层**:

① 缺口: 空列表上报时 `$2`(workspace) 无定义
   `ReplacePlatformSessions(ctx, agentName, list)` 签名里**没有** workspace 参数
   workspace 逐行来自 ps.Workspace(:81 INSERT 的 $3)⇒ `list=[]` 时**无从反推**
   而 `heartbeatRequest`(agents.go:13-46) 实测**无请求级 workspace 字段**
   ⇒ "这次上报替哪个目录报的"在**协议上不存在** ⇒ 不是"加个参数"能修的,是协议缺字段
   三种取法全不成立: '' ⇒ 清不掉(残留); 全部 ⇒ 退化成今天的 agent 级全擦; 上一次的值 ⇒ 引入状态且多实例互相覆盖

② 深度: `[]` 三语义里 ②"这个 agent 没会话"今天无人有权说;缺的是服务端**第二次区分**
   桥已区分(index.js:1144-1156 成功空⇒[] / 异常⇒省略字段);服务端拿到 [] 不知属于哪个 workspace
   ⇒ 语义① 落地时缺**主语** ⇒ 治本项 = 请求级 scope 字段(DELETE 域 == 上报域)

③ 复核 pi 支撑数据: opencode project 13 行 / 11 不重复 worktree
   逐行 0 会话 = 3 行;按 worktree 汇总 0 会话 = **2 个** ⇒ pi "2 个合法空目录报 []" 成立 ✓
   镜像表 90 个不同 (agent,workspace) ⇒ 多目录上报是常态 ⇒ 空目录报 [] 今天就发生
   教训: 聚合口径变了答案就变(行=3/worktree=2)⇒ 报数必须带**聚合键**

④ 判据从三条加到四条,且 (d) 按"与治本项同一前提到期"登记(避免造出永久红判据)
   (a) 迁移路径 PK 断言 (b) 索引存在 (c) 无 _new 残留
   (d) 空列表上报不得丢数据: 同时断言「该 workspace 被清空」**且**「其他 workspace 行数不变」
       —— 只断一半必漏(只断前者漏误擦=本 bug;只断后者漏残留)

校验: go test ./internal/repo/ -run Debt -count=1 ⇒ ok
This commit is contained in:
2026-09-26 03:26:45 +08:00
parent 1a4915dbbb
commit 92cee22271

File diff suppressed because one or more lines are too long