JianFeeeee
0c6c506d7a
feat(criteria): 新建「非门禁工具必须有**发现路径**」判据 —— 补上改名制造的盲区(pi a6dd501c)
pi 指出、我复现的一个**盲区**:`check-*.sh` 族靠命名约定被 `readdirSync` 强制接线
(上一条判据管的就是"判据在但走不到")。★ 而这条约定的**代价**是:
**为了躲开它而改名之后,没有任何判据管"改名后还找不找得到"**。
```
实测(我独立复现):
recount-relay-counts.sh 非自身引用 = 1(只有 docs/DEBTS.json)
archive-stale-sessions.sh 非自身引用 = **0**(全仓只命中它自己)
对照: prune-deploy-artifacts.sh 在 docs/DEV-TOOLING.md:71 有**专节** ⇒ 那才是它被找到的原因
⇒ 两个机制不同、都要有:
check-* 族: 「判据在但**走不到**」(**执行**路径)—— readdirSync 强制
按需工具 : 「工具在但**没人知道它存在**」(**发现**路径)—— 本判据
改名正好绕开前者 ⇒ 后者必须独立存在
```
## 判据
`criteria-hygiene` 新增:每个非门禁 `deploy/*.sh` 至少要有**一处非自身引用**
(扫 docs/deploy/test/.githooks/scripts 的 .md/.mjs/.sh/.json,用 `prose()` —— 判的是散文)。
含反空真护栏(工具数 <2 报红)。
固定 7 → **8**,已同步 `run-all.mjs` 的登记数。
## ★★★ 建这条判据时我自己先假绿了一次(已修,值得记)
第一版判绿了,而 `archive-stale-sessions.sh` **明明是零引用**。原因:
```
我的判据注释里写着「archive-stale-sessions.sh —— 非自身引用 = **0**」
⇒ 判据扫"文件里有没有出现这个名字" ⇒ **它自己那句描述**被数成 1 个引用
⇒ 一个零引用的孤儿**因为被描述成孤儿**而看起来有引用 ⇒ 判绿
```
修法:扫描时**排除观察者自身**(`resolve(p) !== resolve(fileURLToPath(import.meta.url))`)。
⚠️ 我第一版排除的是 `SELF`,而本文件里 `SELF` 指的是 `lib/read.mjs`(另一个文件的变量)
⇒ 排错了对象,仍然假绿。**"我知道要排除自己"和"我排除的是自己"是两件事。**
泛化:**任何"扫全仓找引用"的判据都必须排除观察者本身**,
否则"描述缺陷"与"存在引用"不可区分(与 `stripComments` 那条同源)。
## 变异验证(两侧都验,不只验绿)
```
删掉 DEV-TOOLING 的"按需工具"整节 ⇒ 该判据 **红**(报出 archive-stale-sessions.sh)✓
恢复 ⇒ 绿 ✓
```
## 顺带
`docs/DEV-TOOLING.md` 加「按需工具」一节,逐个列出发现路径(5 个工具)+ 两个机制的对照表。
验证: `criteria-hygiene` 8/8;`run-all --test criteria-hygiene` 该文件不在红名单。
(另 4 个红文件为**既有**、与本改动无关: build-stamp 是前端产物未重建(expected 9e05322 /
actual 6c98ac2)、commit-hygiene 是 AGC 配置、cross-client-gesture 需设备、cross-client-theme
单独跑 21/21 绿 —— run-all 里那次红来自环境差异。)
2026-09-25 07:13:04 +08:00
..
2026-09-25 07:13:04 +08:00
2026-09-24 16:34:44 +08:00