docs(debt): 登记「平台镜像的替换域过宽」—— agent 级整表替换 vs per-project 上报者

现象(实测,可复现):
  agent_platform_sessions 在 10 个状态间轮换,每次差的恒为一个 project 的会话数
  (/tmp=49 /root=38 am-mcp-probe=23 agentmail=37 TrueAgent=100 llmsproxy=18
    facemodule=7 Liquid=7 NextAgent=2 空),同状态内 reported_at span = 0.0ms
  ⇒ 每次都是**整表替换**,而每个上报者只知道一个 directory
  ⇒ 后一个把前一个的清单整体擦掉

危害(口径已修正):
  候选 = 来源1(本侧 sessions, 实测 6) + 来源2(该镜像, 实测 37)
  镜像被擦时该 workspace 的候选 ~43 → ~6(掉 37 条),**不是归零**
  (先前写 37→0 是漏了来源1)

★ 为什么记的是「到期前提」而不是「修法」:
  它是**带顺序约束**的: 若只给 DELETE 加 workspace 而 PK 不动,则
  「同一 platform_id 出现在两个 workspace」⇒ UNIQUE constraint failed (1555)
  ⇒ INSERT 无 ON CONFLICT(grep=0) + defer Rollback ⇒ **整个 DELETE 回滚**
  ⇒ agents.go:186 降级 -1、桥不读该字段(grep=0) ⇒ 三重静默
  ⇒ 从「间歇擦除」变成「永不自愈的静默停滞」(更难查)
  故到期前提写死为: **先 PK 加 workspace,再 DELETE 加 workspace**

三个已被推翻的根因(留作反面材料,见 note):
  ① 「读域 vs 擦除域,且 [] 是 truthy」——非主因(80% 是非空替换)
  ② 「擦除在语义上不必要」——错,整表替换有意且有 TestReplacePlatformSessionsIsFullReplace
  ③ 「今天不撞靠 session.id 全局唯一」——因给错了,实测同 id 换 workspace 也不撞,
     真正原因是「全量 DELETE + seen 去重」两处代码结构

校验: go test ./internal/repo/ -run Debt ⇒ PASS(余额 27,新条已计入)
This commit is contained in:
2026-09-26 01:44:26 +08:00
parent 78233a5f73
commit 682bcf3d45

File diff suppressed because one or more lines are too long