修我自己的 60d59f9: check-relay-counts.sh **改名为 recount-relay-counts.sh** —— 它让 HEAD 上一条既有判据**变红**
★ 缺陷(我自己引入的,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/,非本次范围)。
This commit is contained in:
@ -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
|
||||
|
||||
Reference in New Issue
Block a user