fix(deploy): recount 脚本的两个标签**漏写了 mail_id is not null** —— 标签与它打印的数不是同一个谓词

## 这个错的形状(本脚本最不该有的一类)
```
行210 标签: 类: kind<>'failure'(空真)=557;真判据(permission OR key NOT LIKE %failure%) = 459
行80 NAIVE: ... where mail_id is not null and kind<>'failure'
行81 REAL : ... where mail_id is not null and (kind='permission' or relay_key not like '%failure%')
⇒ 标签**省掉了 `mail_id is not null`** ⇒ 按标签字面算得 **558 / 460**,脚本却打 **557 / 459**
   (差的正是那 1 行未绑定 —— 两个标签口径都收它,而两个变量都不收)
★ 本脚本存在的全部理由就是"把口径写下来"(见文件头「口径声明」节),
  而标签省掉限定符 ⇒ 读的人拿这个数去对话里对账**必然对不上** ⇒ 已实际发生过一轮。
```
## 实测证据: 同一个数字 459 在两天指称不同集合
```
09-25 讨论: 459 = **loose**(pi 82c0f5a9: 349+69+25+15=458 已绑定 + 1 未绑定 = 459)
09-26 脚本: 459 = **bound**(REAL 带 mail_id is not null)
⇒ 各 +1(09-25 09:26 新增一行真实投递 723493b7)后**恰好撞上同一个数**
⇒ 所以"脚本打 459"与"讨论里说 459"看起来一致,实为两个集合 ⇒ 是对账分叉的温床
```
## 修法(含一处我自己先写错又改回的地方)
```
① 标签写进限定符: `已绑定 ∧ kind<>'failure'` / `已绑定 ∧ 真判据(...)`
② **同时打印 loose 口径**(新查两个变量 NAIVE_LOOSE / REAL_LOOSE),
   让"这个数是 bound、那个是 loose"在**输出里看得见**,不靠读源码才知道
★ 我第一版图省事写成 `loose = bound + 占位` —— **撤回**: 那等式只在"占位行恰好都满足该谓词"
  时成立(今天占位行 kind='permission' 所以成立),而那是**当下数据的性质、不是不变量**;
  占位行将来若是 failure 形状,`+占位` 就会算错。本文件 24-27 行记的正是这一类错
  ("把瞬时量当断言")⇒ 改为各查一次,不搞代数捷径。
```
## 边界与验证
```
· 输出改动仅两处(标签 + 新增一行说明); rc 修前=1、修后=1(既有 FAIL 来自"占位行年龄",非本次引入)
· 标签字面现可复现: 已绑定∧空真=557、已绑定∧真判据=459、loose∧空真=558、loose∧真判据=460 ✓
· bash -n 通过; **未改任何断言/阈值/判据语义** —— 只修"标签与数不一致"
```
This commit is contained in:
2026-09-26 03:43:47 +08:00
parent b95240883c
commit b39359d2e0

View File

@ -79,6 +79,12 @@ KFAIL=$(q "select count(*) from relayed_mails where kind='failure';")
KIND_BAD=$(q "select count(*) from relayed_mails where kind not in ('permission','summary');")
NAIVE=$(q "select count(*) from relayed_mails where mail_id is not null and kind<>'failure';")
REAL=$(q "select count(*) from relayed_mails where mail_id is not null and (kind='permission' or relay_key not like '%failure%');")
# ★ 2026-09-26: 这两个是上面两条的 **loose 口径**(去掉 `mail_id is not null`)。
# 为什么要单独查: 会话里对账时用的"459"/"557"是 loose,而上面两条是 bound ——
# 同一个数字在两天里指称不同集合(09-25 的 loose 459 与 09-26 的 bound 459 是巧合撞上)。
# 把两个口径**同时打进输出**,这一类"数字撞车"才在默认路径上看得见。
NAIVE_LOOSE=$(q "select count(*) from relayed_mails where kind<>'failure';")
REAL_LOOSE=$(q "select count(*) from relayed_mails where kind='permission' or relay_key not like '%failure%';")
SUBSTR_N=$(q "select count(*) from relayed_mails where mail_id is not null and relay_key like '%failure%';")
PREFIX_N=$(q "select count(*) from relayed_mails where mail_id is not null and (relay_key like 'model-failure%' or relay_key like 'service-failure%' or relay_key like 'zcode-failure%');")
HOMEAGENT=$(q "select count(*) from relayed_mails where mail_id is not null and relay_key like 'homeagent:failure:%';")
@ -207,8 +213,21 @@ printf ' ── 当下读数 ──\n'
printf ' total=%s 已绑定=%s 占位=%s\n' "$TOTAL" "$BOUND" "$PLACE"
printf ' distinct kind = [%s];kind 非 permission/summary = %s;kind="failure" = %s\n' \
"$KINDS" "$KIND_BAD" "$KFAIL"
printf ' 类: kind<>'"'"'failure'"'"'(**空真**)=%s;真判据(permission OR key NOT LIKE %%failure%%) = %s\n' \
# ★★ 2026-09-26 修: 下面两个标签原先**省掉了 `mail_id is not null`**,于是标签与它打印的
# 数不是同一个谓词 —— 按标签字面算得 558/460,脚本却打 557/459(差的就是那 1 行未绑定)。
# 这是本脚本**最不该有的**一类错: 它存在的全部理由就是"把口径写下来",
# 而标签省掉限定符 ⇒ 读的人拿这个数去对话里对账,**必然对不上**(实测已发生过一轮)。
# ⇒ 现在把限定符写进标签本身(`已绑定 ∧ …`),并**顺带打印去掉限定的那个口径**,
# 让"这个数是 bound 口径、那个是 loose 口径"在输出里**看得见**,
# 而不是靠读脚本源码才知道。
# ⚠️ loose 值**必须各查一次**,不能写 `bound + 占位` —— 那等式只在"占位行恰好都满足该谓词"
# 时成立(占位行今天 kind='permission' 所以两条都成立,但那是**当下数据的性质**,
# 不是不变量;占位行将来若是 failure 形状,`+占位` 就会算错)。本文件第 24-27 行
# 记的正是"把当下性质当不变量"这一类错。
printf ' 类: 已绑定 ∧ kind<>'"'"'failure'"'"'(**空真**)=%s;已绑定 ∧ 真判据(permission OR key NOT LIKE %%failure%%) = %s\n' \
"$NAIVE" "$REAL"
printf ' ★ 上面两数都是**已绑定**口径;**去掉该限定**则分别为 %s / %s(差 %s = 那批占位行里满足该谓词者)\n' \
"$NAIVE_LOOSE" "$REAL_LOOSE" "$((REAL_LOOSE - REAL))"
printf ' failure 边界: %%failure%% 子串=%s;三前缀(无 homeagent)=%s;homeagent:failure: =%s(差 %s)\n' \
"$SUBSTR_N" "$PREFIX_N" "$HOMEAGENT" "$((SUBSTR_N - PREFIX_N))"
printf ' 测试残留=%s(其中未绑定=%s)\n' "$RESIDUE" "$RESIDUE_UNBOUND"