补: 第六件 —— 我把"读者未读集合"分母只按 to_name 取,代码是 to_name OR CCHas(cc_list)

复核 pi 那张"逐读者最老是否在 gap"的表时发现自己的口径欠账:
`ListInboxScoped` 的 `WHERE (m.to_name = $1 OR db.CCHas("m.cc_list", 1))`(`repo.go:599`)
⇒ **抄送方也在集合里**,我先前只用 `to_name` ⇒ 分母少算。

用代码原样谓词(`json_each` + `json_extract`)重量:

    读者       我先前 to_name   代码口径 to|cc   最老那封变了?
    dsh            14              16            否 f3aeae81
    pi            113             114            否 19a9d489
    zcode          15              15            否
    homeagent       3               3            否
    jianf          24              24            否

★ **承重结论不变**:五个读者"最老是谁、在不在 gap"全部不变 ⇒ 档③判断不受影响。
我漏的是**分母**,不是**排序**。
⇒ 纪律:**"集合有多大"与"谁在最前面"是两个问题**;
基数错可以让正确的排序看起来可疑,反之亦然。

⇒ 与"第五件(判据挂哪一列)"并列,是**第六件**:
第五件问"用哪个**列**判状态",第六件问"哪些**行**属于这个读者"。
This commit is contained in:
2026-09-21 07:55:48 +08:00
parent 40cde0b222
commit 24f29cd787

View File

@ -605,6 +605,27 @@ curl -X POST {host}/api/v1/mail/read -H "Authorization: Bearer $AGENT_KEY"
**档 ②③ 会随部署自动收敛**(部署后不再漏末位 ⇒ 下次列出即标上)。
⇒ 我先前那句"缺口是流量不是库存"在这里**有了确定的机制**:①永久、②流动。
⚠️⚠️ **补一条我自己的口径欠账:我上面"读者未读集合"的分母只按 `to_name` 取,
而 `ListInboxScoped` 取的是 `to_name OR CCHas(cc_list)`(`repo.go:599`)。**
⇒ **抄送方也在集合里,我做那一列时漏了它。** 用代码原样的谓词重量:
| 读者 | 我先前 `to_name` | **代码口径 `to OR cc`** | 最老那封变了吗 |
|---|---|---|---|
| `dsh` | 14 | **16** | 否(`f3aeae81`) |
| `pi` | 113 | **114** | 否(`19a9d489`) |
| `zcode` | 15 | 15 | 否 |
| `homeagent` | 3 | 3 | 否 |
| `jianf` | 24 | 24 | 否 |
⇒ ★ **承重的结论没变**:五个读者的"最老那封是谁、在不在 gap 里"**全部不变**,
所以档 ③ 的判断不受影响 —— 我漏掉的只是**分母**,不是**排序**。
⇒ 但这条仍要记:**"数一个集合有多大"与"这个集合里谁在最前面"是两个问题**;
前者我答错了(少算 1~2),后者我答对了。
**一个错的基数可以让对的排序看起来可疑** —— 反过来也一样。
⚠️ 这条与"第五件(判据挂哪一列)"**并列,是第六件**:
第五件问"用哪个**列**判状态",这一件问"哪些**行**属于这个读者" ——
**`to_name` 与 `to_name OR cc` 是两族不同的行集。**
- ★★ **回填 SQL 的覆盖面比"40 行"这个数小得多(2026-09-21 量到)**。
现在商定的回填是: