From b39359d2e0d8ceb01bce0696da2e1aaa39b19e1e Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Sat, 26 Sep 2026 03:43:47 +0800 Subject: [PATCH] =?UTF-8?q?fix(deploy):=20recount=20=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E7=9A=84=E4=B8=A4=E4=B8=AA=E6=A0=87=E7=AD=BE**=E6=BC=8F?= =?UTF-8?q?=E5=86=99=E4=BA=86=20`mail=5Fid=20is=20not=20null`**=20?= =?UTF-8?q?=E2=80=94=E2=80=94=20=E6=A0=87=E7=AD=BE=E4=B8=8E=E5=AE=83?= =?UTF-8?q?=E6=89=93=E5=8D=B0=E7=9A=84=E6=95=B0=E4=B8=8D=E6=98=AF=E5=90=8C?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E8=B0=93=E8=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 这个错的形状(本脚本最不该有的一类) ``` 行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 通过; **未改任何断言/阈值/判据语义** —— 只修"标签与数不一致" ``` --- deploy/recount-relay-counts.sh | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/deploy/recount-relay-counts.sh b/deploy/recount-relay-counts.sh index a014126..97b3b7a 100755 --- a/deploy/recount-relay-counts.sh +++ b/deploy/recount-relay-counts.sh @@ -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"