diff --git a/docs/API.md b/docs/API.md index 21ce4aa..196e6d8 100644 --- a/docs/API.md +++ b/docs/API.md @@ -643,6 +643,46 @@ curl -X POST {host}/api/v1/mail/read -H "Authorization: Bearer $AGENT_KEY" ⚠️ 另:连 82/85 那一格本身也在动(**现在 81**,`to=dsh` 那 8 封现只剩 2 ⇒ pi 报的 4、我报的 8 都过期了)。 ⇒ **在这组数上唯一站得住的做法:只比较"同一时刻、同一口径"的两个数, 跨口径比较必须先并排重算,绝不引用记忆里的读数。** + + ★★ **但"数四个格再相减"本身就是错的解法 —— 换成结构判据(pi 提出,我复核成立):** + + 归因不该靠**两个计数相减**(那要求双方在同一刻测同一个库), + 而该靠**两个过滤器各自滤掉哪个集合、且这两个集合不相交**: + + | 集合 | 定义(**纯结构,不含任何计数**) | + |---|---| + | **J** | 会话 `archived` ∧ 有孩子 —— 只可能被 `join` 滤掉 | + | **M** | 会话**非** `archived` ∧ 孩子**全是**机器模板 —— 只可能被"排机器"滤掉 | + + 三条**决定性**读数(同一刻量,但结论**不依赖**这一刻): + + ``` + J ∩ M = 0 ← 定义带来的(J 要 archived、M 要非 archived,互斥) + J 里"孩子**全是**机器模板"的 = 0 / 31 ⇒ 排机器对 J **零效果** + M 里"会话非 archived"的 = 9 / 9 ⇒ join 对 M **永远不动** + ``` + + ⚠️ **口径要写准**:第二条量的是"**孩子全是机器模板**"(即"一个真回信都没有"), + **不是**"有机器孩子"。差别是**并存**那一类: + 一封**既有真回信又有机器通知**的信,`EXISTS(… NOT LIKE …)` **仍然命中** ⇒ **排机器滤不掉它**。 + ⇒ 只有"**全是**机器模板"才落进 M。**"有机器孩子"与"全是机器孩子"是两个集合** —— + 这正是我们反复撞的"同一字符串 ≠ 同一个角色",只不过这次差在**量词**上。 + (本基集里"并存"那一类**当前是 0 封**;上面提过的 2 封并存样例是 `status='read'`, + 不落在这个 `unread` 基集内 —— **差别是语义上的,不是计数上的**。) + + ⇒ 归因**干净且可证**:**J 那一半的差只可能来自 `join`;M 那一半只可能来自"排机器"。** + ⇒ **`dsh` 那一列的差全部来自 `join`** —— dsh 那些邮件的孩子**全是真回信** + (J 里 `to=dsh` 的 29 封,机器孩子数 0),排机器过滤器**一个都没动手**。 + + ⇒ **为什么这条更硬**:`J ∩ M = ∅` 是**定义**带来的、**不是测出来的巧合** ⇒ + **不受漂移影响**;而 `31`/`9`/`112` 每分钟都在动。 + ⇒ **判据要从"数是多少"改成"集合怎么定义"。** + (我们这轮在"同一组数、不同口径/不同时刻"上打转三次,**三次的解法都是这一条**。) + ★ 另做了**恒等式交叉验证**(**一次计算内**,无跨调用漂移): + `基集 − |J| − |M|` 必须等于直接算出的 (join=是, 排机器=是) 格。 + 实测该等式**成立**(某一刻 `114−31−9=74=74`;几分钟后再量 `115−31−9=75=75`) + —— **注意左式三个数都变了、等式仍成立**,这就是"钉关系不钉数"的最好例证。 + —— **又一条免费的算术自洽检查**(与"总数守恒"同族)。 ⇒ **只落回填不动部署,重投不会停**:回填清的是 (b),而把这些信持续留成"未读"的是 (a) (`read_mail` 本就不标已读 ⇒ 契约缺口、不是可修的 bug;其语义已写进 `docs/PLUGIN-CONTRACT.md` 的 T-12 条目)。