From ba5720573e0be0de0e6dd7cf2c17142b4e5cc35d Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Fri, 25 Sep 2026 06:25:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=88=91=E8=87=AA=E5=B7=B1=E7=9A=84?= =?UTF-8?q?=2060d59f9:=20check-relay-counts.sh=20**=E6=94=B9=E5=90=8D?= =?UTF-8?q?=E4=B8=BA=20recount-relay-counts.sh**=20=E2=80=94=E2=80=94=20?= =?UTF-8?q?=E5=AE=83=E8=AE=A9=20HEAD=20=E4=B8=8A=E4=B8=80=E6=9D=A1?= =?UTF-8?q?=E6=97=A2=E6=9C=89=E5=88=A4=E6=8D=AE**=E5=8F=98=E7=BA=A2**?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ★ 缺陷(我自己引入的,pi 127746b5 指出、我复核确认): 我把脚本命名成 `deploy/check-*.sh`,而本仓那条命名族由 `client/electron/test/criteria-hygiene.test.mjs` 用 readdirSync().filter(/^check-.*\.sh$/) **强制接线**:凡 check-*.sh 必须被 install.sh / redeploy-*.sh 在可执行位置调用。 ⇒ 我的脚本 0 调用者 ⇒ **实测该判据由 7/7 绿变 6/7 红**("这些政策门禁写了却没有任何入口脚本调用")。 ⇒ 即: 我一边在信里报"判据在但走不到",一边**自己造了一个走不到的判据**。 ★ 但接线是**错的解** —— 它按性质就不是门禁(只读、依赖生产库、断的是库的不变量): · 接 install.sh ⇒ 读 /opt/agentmail/data/agentmail.db,**新机器没有该库** ⇒ 实测 AGENTMAIL_DB=/nonexistent 时 rc=1 ⇒ **每次全新安装假红** · 接 redeploy-* ⇒ 库是活的、计数会漂 ⇒ 会去**回滚一次正确的部署** ⇒ 正确修法是**改名**,进入"按需工具"族(prune-* / archive-* / reset-* 同族), 并把这条理由写进文件头,免得下一个人再犯。 ★ 顺带暴露那条判据的一格(它的自称 vs 它的机制不是一回事): 自称: 按**性质**分 —— "宣称是政策/门禁的 check-*.sh;不管 check-deploy-drift.mjs 这类按需手动工具" 机制: 按**扩展名**分 —— /^check-.*\.sh$/ ⇒ 两个方向都可观察: 误报(FP): 按需工具 + .sh 后缀 ⇒ 被当门禁(**我这次**) 漏报(FN): 真门禁 + .mjs 后缀 ⇒ **逃过检查**(实测 check-plugin-snapshot.mjs 被 redeploy-plugin.sh:218 真实调用,是真门禁,却因 .mjs 不被该判据覆盖) ⇒ 这是 pi 那条⑬"判据的动作与它被许诺的范围不匹配"的又一实例。判据本身未改(不在本次范围)。 ★ 同时确认别人的修正: 2f0d77a 把我两条 **假红** 断言修对了(我复核成立): · `HOMEAGENT == SUBSTR_N - PREFIX_N` ⇒ ⊆: 注入第五族 `pi-failure:` 时差集 +1 而 homeagent 不变, 旧式**假红**(新增命名是正常演进)✓ · `RESIDUE == 2 && UNBOUND == 1` ⇒ 只打印 + 用"未绑定 ⊆ 占位"承接: 清掉那行化石是**正确维护动作**,旧式把正确动作判成失败 ✓ ⇒ 我的两条确实是把"恰好如此"当成了不变量。**如实记**: 代价是变异④(rename homeagent 族) 从"被抓"变成"存活" —— 那是"过严"与"漏报"的取舍,我取后者(假红会让人不信判据)。 ★ 门禁族数量仍为 3(判据反空真要求 >=3)✓;脚本 rc=0;13 条断言全绿。 ★ 边界: 只读查库;**生产未动**;未改那条既有判据(属 client/electron/,非本次范围)。 --- ...elay-counts.sh => recount-relay-counts.sh} | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) rename deploy/{check-relay-counts.sh => recount-relay-counts.sh} (89%) diff --git a/deploy/check-relay-counts.sh b/deploy/recount-relay-counts.sh similarity index 89% rename from deploy/check-relay-counts.sh rename to deploy/recount-relay-counts.sh index 63d103c..0439e4c 100755 --- a/deploy/check-relay-counts.sh +++ b/deploy/recount-relay-counts.sh @@ -31,8 +31,30 @@ # · `类` 的判据是 `relay_key` 的**形状**,不是 `kind`(kind 里没有 failure) # · 抑制数给**两种口径**(完整 parent 链 / 只沿 failure 链),因为两者差很多 # -# 用法: deploy/check-relay-counts.sh [--json] +# 用法: deploy/recount-relay-counts.sh [--json] # 退出码: 0 = 全部**不变量**成立;1 = 有不变量不成立 +# +# # ★ 为什么叫 `recount-` 而不是 `check-`(这条是我自己踩出来的) +# +# 本仓 `deploy/check-*.sh` 是**部署门禁族**的命名约定,且由 +# `client/electron/test/criteria-hygiene.test.mjs` 用 +# `readdirSync(DEPLOY).filter(/^check-.*\.sh$/)` **强制**:凡叫 check-*.sh 的, +# 必须被 install.sh / redeploy-*.sh 在**可执行位置**调用("判据在但走不到"是它要拦的形状)。 +# +# 我这个脚本**第一版就叫 check-relay-counts.sh** ⇒ 被那条判据收进门禁族 ⇒ **把它弄红了**。 +# 而按性质它**不该被接线**,两条入口接进去都是错的: +# · 接 `install.sh` ⇒ 它读 `/opt/agentmail/data/agentmail.db`,**新机器没有这个库** ⇒ +# 实测 `AGENTMAIL_DB=/nonexistent` 时 rc=1 ⇒ **每次全新安装假红**; +# · 接 `redeploy-*` ⇒ 它断言的是"库的不变量",而**库是活的**, +# 计数一变就红 ⇒ 会去**回滚一次正确的部署**。 +# ⇒ 所以正确修法是**改名**(进入"按需工具"族:`prune-*` / `archive-*` / `reset-*` 同族), +# 而不是改判据、也不是硬接线。 +# +# ★ 顺带暴露了那条判据的一格: 它的**自称**按性质分("宣称是政策/门禁的 check-*.sh; +# 不管 check-deploy-drift.mjs 这类**按需手动工具**"),而**机制**按**扩展名**分。 +# 两者在"按需工具 + .sh 后缀"这个缝里不一致 —— 我的文件正落在缝里。 +# 反方向也有(真门禁 `check-plugin-snapshot.mjs` 因 .mjs **逃过**该判据)。 +# ⇒ 这是 pi 那条⑬"判据的动作与它被许诺的范围不匹配"的又一实例。 set -euo pipefail