Files
MailUI4Agents/docs
JianFeeeee 02643f2b42 docs(debt): 补记之廿一 —— pi 的"三种语义"分类对但②够不着;★ 文档(agents.go:40-41)说 [] **清空镜像** 而实现+测试是**什么都不删**(决定性探针实证);顺带查出死字段 heartbeatRequest.Workspace(标"必需"却从未被读)+ 一处自相矛盾注释
① ★★★★★ pi 提"要分开 ①本目录无会话 / ②本agent无会话 / ③我看不到"——分类对,但形态与它设想**不同**:
     · ② 今天**根本无法表达**(DELETE 域 = 本次 list 出现的 ws 集合 ⇒ 清整个 agent 须枚举全部 ws)
       ⇒ 它"没有任何上报者该有权说 ②"**已成立**(既成事实,非待定项)
     · ①/③ 的区分**确是真空白**,但方向**相反**:
       `agents.go:40-41` 文档明说"**空数组 = 平台侧确实一条会话都没有(清空镜像)**"
       而 `platform_sessions.go:129` 的 `if len(wsOrder) > 0` 守卫 ⇒ **空数组什么都不删**
       ⇒ ★★★ **文档说"清空"、实现是"什么都不删",二者相反**
   ★★★ 决定性实测(临时探针,跑完已删): 前置 /A /B 各 1 行 → 上报 `[]` 后 `map[/A:1 /B:1]`
     ⇒ **未被清空** ⇒ 与文档不一致
   ★★★★ 且**已有测试专门钉住**(`db640e2` 随 ② 加):
     `TestReplacePlatformSessionsWithNoWorkspaceKeepsEverything`(`platform_sessions_test.go:449`)
     断言"不带 workspace 时必须什么都不删" ⇒ **实现与自己的新测试一致、与心跳端点文档矛盾**

② ★★★★ 「必须先定的语义」据实测改写:
     今天 `[]` 实际语义 = "本次上报没给我 workspace 信息 ⇒ 无从判断该清谁 ⇒ 什么都不动"
     ⇒ 安全侧(不误删),但代价是"**该目录会话全没了**"**永远无法表达**
     ⇒ 平台侧某目录会话全删后,镜像旧行**永不清除**(除 `DeleteAgent` 破坏性路径)
   ★ 现网陈旧行实测: opencode 100 行 + homeagent 49 行逐 id 回查 ⇒ **已消失 = 0**
     ⇒ 该空洞**未被观测到触发**
   ⇒ 建议(供人类裁): 心跳加**显式**"本次覆盖的 workspace 清单",把"覆盖了哪些目录"与
     "这些目录里有几条会话"**分成两个字段** ⇒ `covered=[/w1], sessions=[]` 唯一表达
     「/w1 确实空了」,且**不需**枚举整个 agent

③ ★★★★ 顺带两个独立发现:
     · **死字段**: `heartbeatRequest.Workspace`(`agents.go:32`)注释写"**必需**",
       但 `grep -rn "req\.Workspace" server/` ⇒ 心跳 handler **一次都没读**
       (唯一命中的 `mail.go:823` 是**另一个** struct)
     · **自相矛盾注释**: `:30` 称"pending_mails **按它[Workspace]算**",
       而 `:179` 称"pending_mails 是**全局**未读数(跨工作区)" ⇒ 代码实际用全局
       (`UnreadWorkspaces(ctx, agentName)`)⇒ `:30` 那句是**陈的**
     ⚠️ 边界: 我**未**核历史上是否读过 ⇒ 只标"当前未读",不标"从未读"

④ ★ pi 其余各条:
     · "11/12 次候选=0 比你测的更重" ⇒ 与我今天实测(恒 100 行/ws=1)**不符**,但它观测(09-26)在
       ② 部署(09-28)**之前** ⇒ 不冲突、是不同前置条件 ⇒ 我只认领"**② 之前**的形态",不认领"更重"
     · "频次极不均匀 ⇒ 危害由频率决定" ⇒ ★ **对且重要**(我此前只报"轮换"未量化频率)
     · "am-mcp-probe 高频可能被我们自己的调试拉高" ⇒ ⚠️ **好的自我怀疑**,无历史快照 ⇒ 保持未知
     · "project 表 13 行 / 10 个有会话" ⇒ ★ **实测完全吻合**(13 行;worktree 去重 11;有会话 10)
     · "FullReplace 测试钉着整表替换是有意设计" ⇒ ★ **对**,已复核

⑤ ★ 我本轮 3 处引用失误(同一模式第 3 次,且都在"正在记录'要核行号'"的补记里)
     · `agents.go:43-45` → 实为 **`:40-41`**
     · 写"含会话的 project 数**见附表**"而**本轮没有附任何表** ⇒ 指涉凭空
     · 写"worktree 去重 **12** 个" ⇒ 实为 **11**
   ⇒ 处置: (a) 行号/数字**只在当场回显/算过之后**才写进文档;
     (b) **不写"见附表"**除非同一条内确有该表
   ⇒ 本轮 8 处引用已逐一 `sed -n Np | grep -c` 核过(`:43-45` 即由此发现)

校验: go test ./internal/repo/ -run Debt -count=1 ⇒ ok; 临时探针已删除; 未改产品代码
2026-09-29 04:35:20 +08:00
..