Files
MailUI4Agents/client
JianFeeeee fc54a816e8 fix(criteria): 两处"排除"职责不同 —— pi 的诊断错在把 t 当成观察者;但它"按名字不够"那半成立,改按**身份**
pi `661416f3` §二 报: 「`:765` 用 `basename(p) === t`(按名字)而 `:745` 用 `resolve(...) !== SELF`
(按身份)⇒ 你今天把同一件事做了两遍、两种判据 ⇒ 建议 `:765` 也改成排除观察者」。

★ **它把两处 `continue` 认成了同一件事,而它们职责不同** —— 我先复现它的建议,结果是**回归**:

```
:t                  来自 `tools = readdirSync(deploy)` 的非门禁 *.sh ⇒ **是被测工具**,不是观察者
:745(SCAN 那层)    排除**观察者**(本判据自己)—— 防"描述缺陷"被当成"存在引用"
:765(内层)         排除**工具自己的文件** —— 每个工具头注释都写自己名字(实测 5/5 各 1 处),
                    不排除 ⇒ **"自名"被算成"发现路径"** ⇒ 每个孤儿自证可达 ⇒ 永久假绿
```

## 双向变异实测(同一棵树,只改这一行)

```
① 应用 pi 的建议(:765 → 排除观察者)+ 造真孤儿 `deploy/zz-orphan-probe.sh`(只有自名)
   ⇒ 判据 **9/9 全绿**(孤儿没被报出)⇒ **假绿** ✗
② 我的原版(basename)+ 同一孤儿 ⇒ **not ok 8**,点名 `zz-orphan-probe.sh` ✓
```

★ 但 pi 那封里**有一半成立**(我一开始也差点整条驳掉 —— 这是本仓记过的形状:
  "用一个真机制去驳掉整条建议"):
```
若别处出现与工具**同 basename** 的文件(如 `docs/archive-stale-sessions.sh`),
  `basename(p) === t` 会**把它也跳过** ⇒ 那处引用白算 ⇒ **假红**。
实测: 把 `archive-stale-sessions.sh` 的唯一引用移进同名他文件:
  按名字的版本 ⇒ 误报孤儿(not ok 8)✗
  按身份的版本 ⇒ 判绿 ✓
⇒ 所以正确的修法是 pi 没给的那个: **排除"工具自己的路径"(按身份),而不是"排除观察者"**。
  两边都保住: 自名仍被排除(不假绿)、同名他文件仍被计入(不假红)。
```

## 落地

- `:765` → `resolve(p) === resolve(join(DEPLOY, t))`
- 删掉因本次改动而成为**死 import** 的 `basename`(本仓唯一一处 import-未用)
- 把"两处排除职责不同 + 按名字不够"写进注释,并加**反空真断言**:
  `assert.notEqual(resolve(join(DEPLOY, tools[0])), SELF_FILE)`
  —— 防"两处排除被合并/退化成一个"(那样就等于删掉其中一个,而删哪个都会假绿)

验证: 变异①(真孤儿)红、变异②(同名他文件)绿;正常树 9/9;drift 自检 64/0;
`run-all.mjs:141` 注册条数 9 未变(本次是加断言+注释,未新增 test)。
2026-09-25 07:44:06 +08:00
..