JianFeeeee
6d772803f3
★★★ 收 pi 30ee8ff2: ⑧b **不只是"规格错",它有真实假绿** —— 调用者判定依赖 strip ⇒ source 行里的 ${VAR#…} 被当注释截断 ⇒ **调用者身份丢失** ⇒ 该文件的裸赋值连查都不查(实测 rc=0、调用者数仍 3、三条不变量全过);已改用**词首注释规则**修掉,并把 ⑧b 拆出 **⑧c(可闭,已闭)**
★★ (A) pi 报的假绿(我复现,逐字一致):
`deploy/redeploy-nc.sh`:
. "${REPO#/home}/deploy/lib/env-defaults.sh"
AGENTMAIL_REQUIRE="z" ← 真违规
⇒ 真 strip(`s/#.*$//`)把它截成 `. "${REPO` ⇒ **不再提及 env-defaults.sh**
⇒ 该文件**静默退出调用者集合** ⇒ 裸赋值**不被查** ⇒ rc=**0**,
仍报"3 个调用者,裸赋值 0 处"(z 被漏)
现实形态同样命中(pi 报、我复现): `. "$(dirname "${BASH_SOURCE[0]#/x}")/lib/env-defaults.sh"` ⇒ rc=0
★ 而**三条不变量全过**(首尾探针 / 行号算术 / 逐行局部不变量):
删的首字符**确实**是 `#`、stripped 也**确实**是 raw 的前缀 ⇒ ⑧a 那套形状检查**看不见它**
★ 触发形态本仓已在用(`${VAR#…}`/`${VAR##…}`/`${VAR%…}`):
prune-deploy-artifacts.sh:66、recount-relay-counts.sh:161-165、install.sh:768 等
★ (B) 修法: ① 调用者判定改用**词首注释规则** `sed 's/\(^\|[[:space:]]\)#.*$//'`
—— shell 的真实规则(`#` 只在**词首**才是注释)⇒ 参数展开/引号内的 `#` **不再**被截断
★ 我先试过"用 raw 原文",**它引入假红**(实测):
`. other.sh # 注释里提到 env-defaults.sh` 会被当成调用者
⇒ 所以不能只"去掉 strip",要**把 strip 的规格写对** —— 这是**规格错**,不是"边界"
实测: pi 两例(`${REPO#/home}` / `${BASH_SOURCE[0]#/x}`)**都 rc=1** ✓
反例对照 `. other.sh # 提到 env-defaults.sh` **仍不算调用者**(rc=0、调用者数 3)✓
三个真实调用者全认出、判据自己不误入集合 ✓
★ (C) ⑧b 拆两半(本轮第三格记法):
⑧c **调用者判定**(判"哪一行是 source 行"只用到**行首形态**,与注释后缀无关)⇒ **可闭,已闭**
⑧b **注释语义本身**(strip 对**行内** `${V#x}`/引号内 `#` 的截断会不会让**违规行自己**
不再匹配 `AM_SCAN_RE`)⇒ **真边界**。残余实测: `AGENTMAIL_REQUIRE#="z"` ⇒ strip 成
`AGENTMAIL_REQUIRE` ⇒ 不再匹配 ⇒ rc=0(但该行**本就不是合法赋值**,落在射程边缘);
合法形态 `AGENTMAIL_REQUIRE="${V#x}"` ⇒ 截断后仍匹配 ⇒ rc=1 ✓ 不漏
⇒ ★★★ 记法: **"耦合"本身会被误报成"边界"** —— 我原说"⑧b 是语义边界",
其实里面**掺着一处没必要的耦合**(调用者判定顺手复用了 strip)。
判法: 申报边界前问 **"这个信息真的只能由被检对象给出吗,还是我顺手复用了它?"**
⇒ ⑧a 是"换错观察对象"、⑧c 是"**多余的依赖**" —— 两次都把可闭的说成了边界
★ 回归: 12 向变异矩阵全 rc=1;干净基线 rc=0;criteria-hygiene **10/10** 绿
2026-09-25 08:28:04 +08:00
..
2026-09-25 06:51:25 +08:00
2026-09-14 08:38:33 +08:00
2026-09-13 11:06:01 +08:00
2026-09-15 07:00:35 +08:00
2026-09-25 07:01:36 +08:00
2026-09-24 04:15:30 +08:00
2026-09-18 04:07:26 +08:00
2026-09-12 11:36:25 +08:00
2026-09-25 08:28:04 +08:00
2026-09-14 23:33:11 +08:00
2026-09-14 20:35:01 +08:00
2026-09-25 06:51:25 +08:00
2026-09-21 07:14:41 +08:00
2026-09-14 15:51:40 +08:00
2026-09-15 11:21:00 +08:00
2026-09-25 06:27:09 +08:00
2026-09-25 06:51:25 +08:00
2026-09-25 06:51:25 +08:00
2026-09-06 15:18:06 +08:00
2026-09-02 20:05:51 +08:00
2026-09-13 11:06:01 +08:00
2026-09-13 11:06:01 +08:00
2026-09-14 08:38:33 +08:00