docs(debt): 补记之十五 —— 修法形状**定稿**:必改点三处→**四处**,③ 的键必须是**三键**(我补了 pi 没列的场景,结论反转)

① ★★ pi 场景C 复现成立: 同 agent + 同 platform_id + 两个 workspace(改完 PK 的未来态)
     ① 只按 **agent** ⇒ **2 行** ⇒ QueryRow 仍取第一行 ⇒ 照"按 agent"改会**踩新歧义** ✓

② ★★★★ 我构造了 pi 没列的**场景D**(**两个 agent 共用同一 workspace**),结论反转:
     ② 只按 **workspace** ⇒ ★ **2 行** ⇒ **也不够**
     ③ agent + workspace 两把 ⇒ **1 行** ✓
   ⇒ ★★ 场景D **不是假想**: 生产 `sessions` 里现成就有 ——
        `ba9c194b` from_agent=[pi]  ws=/home/program/agentmail
        `9742de96` from_agent=[dsh] ws=/home/program/agentmail   ★ 同一 workspace、两个 agent
   ⇒ ⇒ **三键 (platform_id, agent_name, workspace) 是唯一在 A/B/C/D 全场景恒为 1 行的键** ✓
     pi 的结论(两把一起)**成立且是必需的**; 我补的是"为什么不能只留一把"

③ ★★ `sessions.workspace` 口径要写全: pi 的「9/9 非空」✓ 成立,但那是
     **有 platform_id 的 9 行**这个子集; 全表是 **51/79**(那 28 条空的**全都没有 platform_id**)
   ⇒ 对**要改的那条 JOIN** 而言 workspace **总是可用** ✓,且**不需新加数据/迁移** ✓
   ⇒ ★ 教训: 同一句"非空率"不写**分母**时 9/9 与 51/79 都能自称"非空"
     ⇒ 报比例**必须带分母定义**(与 ⑫′ 同源)

④ ★★ 补验上一版标的 unknown: 有 platform_id 的 9 行 `from_agent` **9/9 非空** ✓
   (与 workspace 同为"有 platform_id ⇒ 必非空")⇒ ③ 的两个键**都有数据支撑**,不需新增列

⑤ ⇒ ★★★★★ **必改点定稿(四处,必须同批)**:
     ① PK → `(agent_name, workspace, platform_id)`
     ② DELETE(`:63`) 按 workspace 限定
     ③ JOIN(`:473-474`) **三键**: `ON aps.platform_id = s.platform_id
        AND aps.agent_name = s.from_agent AND aps.workspace = s.workspace`
     ④ 迁移重建表(`BeginTx` 内 DROP+RENAME+**RENAME 后**重建 `idx_platform_sessions_ws`)
   ⇒ ⚠️ ③ **必须**与 ① 同批: 单独改 ① 会把 ③ 的歧义**放大**(场景C 实测)
   ⇒ 顺带记: `pid=mail-xxxx` 那类 platform_id 与 workspace 1:1 的行看着够用,但**不能依赖**(上两行即反例)

校验: go test ./internal/repo/ -run Debt -count=1 ⇒ ok; /tmp/sc 已清; 未改产品代码
This commit is contained in:
2026-09-28 04:09:09 +08:00
parent af4190d145
commit 201644749a

File diff suppressed because one or more lines are too long