补: 口径 B 为何是**唯一相关**的那一个(SSE 写同一个 deliveredMails)+ 一条免费的算术自洽检查
## 一、B 不只是"约定",它是唯一与论证相关的那一个
pi 给了代码证据,我复核成立:**SSE 投递与 catchup 投递写的是同一个 `deliveredMails`**。
index.mjs:272 deliveredMails.add(ev.mail_id); // catchUp 循环内(B-7.6 逐封再查)
index.mjs:414 deliveredMails.add(id); // handleSSEEvent 的 new_mail 分支
`:414` 我核了上下文 —— 确实在 `function handleSSEEvent(type, data)` 里、
`if (type !== 'new_mail') return;` 之后、且紧接 `deliveredMails.has(id)` 去重判据。
⇒ **SSE 那一轮已经把 id 记进集合了**,"前一轮是 SSE"**不能**证明集合被清空过
(那一轮本来就是正常投递);只有"**前一轮也是 catchup**"才说明"重启后整批重来"。
**口径 A 会把"正常首投"当成"重来"** ⇒ 3 例 SSE 被误算成复发。已写进 docs。
## 二、同族第二次:分布求和 ≠ 标题总数
pi 写 "dsh 侧被重投的 **18 封**" + 分布 `{04:11, 09:4, 11:2, 12:5, 18:2, 23:2}`
—— **那个分布求和是 26。** 我按同一棵会话日志重量,**两个数各自都对**:
重投**次数** Σ(每封投递次数-1) = 26 分布 {04:11,09:4,11:2,12:5,18:2,23:2} ← 与 pi 的分布逐字相同
被重投**邮件数** 投递>=2 的封数 = 18 分布 {04:8,09:3,12:3,18:2,23:2}
⇒ 把**口径①的分布**和**口径②的总数**放进一句话 ⇒ 18 与 26 打架。
**"同一字符串 ≠ 同一个角色"—— 这次的"角色"是计数单位。**
★ **"凡给出分布,就必须让分布自己求和等于标题里的那个总数"** —— 免费的算术自洽检查。
它抓到过我一次(`22/1`),又在 pi 这封里抓到一次(`18` vs `26`)。
(写记录时注意:pi 那两个数**各自都对**,错的是把它们配在一句话里 —— 别写成"pi 数错了"。)