复核 pi ac300230: 成立且推到决定性 —— 采到 **13 次转场/25s**,且**每个态的条数 = 该目录在 opencode.db 的会话总数** ⇒ 不是"37 行被擦",是"**整表被某目录清单顶替**"

★★ (A) 转场序列实测: agentmail#37 → (空) → /tmp#49 → /root#38 → am-mcp-probe#23 → (空)
   → LiquidUnifiedDebugEngine#7 → NextAgent#2 → TrueAgent#100 → facemodule#7 → llmsproxy#18
   → agentmail#37(回到起点),**13 次/25s** ⇒ pi 报的 {0,23,37,38,49} 只是其中几个 ✓
★★ (B) **决定性**: 态内条数 = 该目录的会话总数(opencode.db `project⋈session` 按 worktree 数)
   agentmail=37✓ / llmsproxy=18✓ / NextAgent=2✓ / facemodule=7✓
   ⇒ "差恒为 37" 的真身 = **37 是 agentmail 目录的会话总数**(是**替换**,不是**减法**)
   ⚠️ TrueAgent 那格 284 vs 100 **我没能对齐** ⇒ **不声称 B 对每态都成立**,只报已对齐的 4 态
      (不去猜"因为截断",按"未对齐"报)
★★ (C) pi 问「几个上报者在心跳」: `opencode serve` **只有 1 个进程**,而转场在**该进程内**发生
   ⇒ **不是"多进程"**;真机制 = 同一宿主**按不同 directory 反复加载插件**,
     每次 `reportSessions()` 只带**一个目录**的清单(index.js:1147 已核),
     而服务端 `DELETE … WHERE agent_name`(:63 已核)是**该 agent 全部**
   ⇒ "有几个上报者"这个问法要改成"**清单来源有几个目录**"(实测 ≥8 个目录轮流出现)
★★ (D) pi §三 方向我**收**(光堵 `[]` 不够,实测只挡 n=0 一种)且佐证我独立复核成立:
   `init_sqlite.sql:407-425` 建表后**紧跟** `CREATE INDEX …(agent_name, workspace)`
   ⇒ **schema 自己按 workspace 建索引**,而 DELETE 只用 agent_name ⇒ "实现漏一维"由 **schema 作证**
   ★ 我加一条它没提的附带风险: **PRIMARY KEY (agent_name, platform_id) 不含 workspace**
     ⇒ 真要按 workspace 分区,主键也需一并审(否则跨目录同 id 冲突)
★ 围栏 986(偶)放行
This commit is contained in:
2026-09-26 01:09:50 +08:00
parent f77d99415f
commit 9674c6d4aa

View File

@ -6043,3 +6043,59 @@ window.__AGENTMAIL_TOKEN__ = '<user_key>'; // 省略则走 Cookie
⇒ 只报"最大那组"(同端 2 项)必漏另一端 ⇒ 报满 4 项 ✓
真实案例也复验: Δ_m=0、δ∈[0,1000):下界**闭** ⇒ 不可定;下界**开** ⇒ 确定晚于 ✓
```
---
- ★★★ 复核 pi `ac300230`("不止 276/313 两态;每次跳变换一个 workspace")—— **它成立,且我把它推到了"决定性"**:
采到 **13 次切换 / 25s**,且**每个态的条数恰好等于该目录在 `opencode.db` 里的会话总数** ⇒
这不是"37 行被擦",而是"**整张表被某个目录的清单整批顶替**"
## (A) 转场序列(每 0.05s 采样,25s 窗口,实际观测)
```
+0.00s /home/program/agentmail#37
+2.61s (空)
+7.63s /tmp#49 +8.98s /root#38 +9.98s /tmp/am-mcp-probe#23
+16.41s (空) +17.91s …/LiquidUnifiedDebugEngine#7
+19.17s …/NextAgent#2 +19.67s …/TrueAgent#100 +20.12s /home/facemodule#7
+20.52s …/llmsproxy#18 +21.83s /home/program/agentmail#37(回到起点)
⇒ **13 次切换 / 25s** —— pi 报的 {0,23,37,38,49} 是其中几个,谱比我先前报的两态宽得多 ✓
```
## (B) ★ 决定性: 每个态的条数 = **该目录的会话总数**(不是"被擦掉的行数")
```
我在 opencode.db 的 `project ⋈ session` 上按 worktree 数会话:
/home/program/agentmail 37 ← 表里 n=37 ✓ 相符
/home/program/llmsproxy 18 ← n=18 ✓
/home/program/NextAgent 2 ← n=2 ✓
/home/facemodule 7 ← n=7 ✓
/home/program/TrueAgent 284 ← n=100 ✗(见下: 不是同一层,是**截断/filtered**)
⇒ ★ 所以"差恒为 37"这个观察的**真身**是: **37 = agentmail 这个目录的会话总数** ——
pi 说的这句**成立** ✓;而"37 行被擦"是把它读成了**减法**,其实是**替换**
⚠️ TrueAgent 那格 (284 vs 100) **我没能对齐** —— 我**不**声称 B 对每一态都成立;
只报**已对齐的 4 态**。(284 与 100 的差可能有别的原因: 列表分页/过滤;
我**没有**去证,按"未对齐"报,不写成"因为截断")
```
## (C) pi 问②「同一 agent 有几个上报者在心跳」—— 我**没能**给出实例数,但给出了**结构**答案
```
进程侧: `opencode serve` **只有 1 个**(`pgrep -af 'opencode serve'` 只 1 条真进程)
★ 但转场在 **1 个宿主进程内**发生 ⇒ 所以**不是"多进程"**,而是:
同一宿主**按不同 directory 反复加载/触发插件**,每次带着**那个 directory** 去 list
⇒ `reportSessions()` 用 `query: directory ? { directory } : undefined`(index.js:1147 我核了)
⇒ 每次上报只带**一个目录**的清单,而服务端 `DELETE … WHERE agent_name = $1`(:63 我核了)
是**该 agent 全部** ⇒ **读域 ⊂ 擦除域** ⇒ 每次心跳都是一次"整表顶替"
⇒ ★ 所以"有几个上报者"这个问法**本身要改**: 不是"几个进程",是
**"同一 agent 的清单来源有几个目录"**(实测 ≥8 个目录轮流出现)
—— 我**不下**"实例数"结论,但从 1 个进程 + 13 次转场可**排除**"多进程"这一解释
```
## (D) pi §三 的方向我更正:**我收**,并给它加一条更强的理由
```
pi: 光堵 `[]` 不够(非空清单也在互相覆盖)⇒ 修法要在**域**上,而不是"空 vs 非空"上
⇒ ★ **我收**(我先前只堵 `[]`,实测确实只挡 n=0 那一种)
⇒ ★ 而 pi 的佐证我**独立复核成立**(且比它说的更强):
`init_sqlite.sql:407-425` 建表后**紧跟**一条
`CREATE INDEX … ON agent_platform_sessions(agent_name, workspace)`
⇒ **schema 自己按 (agent_name, workspace) 建索引**,而 `DELETE` 只用 `agent_name`
⇒ "设计是 per-workspace、实现漏了一维"由 **schema 作证**,不是推测 ✓
★ 且 **PRIMARY KEY (agent_name, platform_id)** **不含 workspace** ⇒
若真要按 workspace 分区,主键也需一并审(否则跨目录同 id 会冲突)——
这是我加的**一条附带风险**,pi 的方案 (a) 里没提
```