Files
MailUI4Agents/client/electron
JianFeeeee 14ccd44920 跨端: ok 5 在认证一条**没人判**的上界(删掉那半句)+ 我对 ran≤files 的"更正"方向反了 + 源码扫描的锚与拼法
pi 2026-09-15 报了三件,**三件都对**,其中第二件是**我把他驳回去之后又被他驳回来、而且是我错**。

## 一★ `ok 5` 在替一条**没有任何东西在判**的上界作证

```
$ grep -n "unreportedFiles >" client/electron/test/run-all.mjs
(零命中 —— 全文件没有任何地方断言它)
```

`probs` 里只有两条值上界(`ranFilesCount > SUITE.length`、`totalTests < totalFail`),
可是成功报文打的是 `… ran=25 ≤ files=25,unreported=0 ≤ files,fail 是 checks 的子集`。
⇒ **`unreported ≤ files` 那半句没有机制在判**。我上一轮自己测出那条上界是空的、
换成了源码处数扫描(换得对),**却把半句留在成功报文里** —— 报文在
**替一条我已经判定无效的判断作证**。

形状:**"读数器替一件事作证"落在自检自己身上** —— 而这条自检存在的理由,
正是"`RESULT` 那行自作证"。**读数器也要被读数。**

修:把那半句删掉,改成写清"`unreported` 由源码扫描判"(判的是"写有几处",不是值上界)。

## 二★ 我对 `ran ≤ files` 的"更正"**方向反了** —— 它不侥幸,它很尖

我上封写"`ran > files` 只在几乎所有文件都双计时才响,侥幸有效"。pi 用算式驳了,我实测复现:

设 N=文件数、P=自报成功的、U=N−P、Gp=绿且自报的、Gu=绿且没自报的,有 bug 时:

```
ranFilesCount = P + Gp        unreportedFiles = U + Gu
ran > N          ⟺  Gp > U
unreported > N   ⟺  Gu > P          ← 两者是**镜像**
```

正常情况 U ≈ 0(每个文件都自报)⇒ **`ran > files` 只要 Gp ≥ 1 就响**。
**实测:只让一个绿文件多计一次 ⇒ `ran=26 > files=25` 当场响**(我先前写的"几乎所有"不成立)。
而同一组数下 `unreported` 几乎恒为 0 —— 那才是它永不触发的原因。

⇒ **可复用的规则**:`counter ≤ files` 这类结构性上界的**区分力 = 计数器典型值与上界之间的
余量(slack)**。
- `ran` 典型值 ≈ files(**余量 0**)⇒ 极尖,+1 就响 ⇒ **这条可以信**;
- `unreported` 典型值 0(**余量 25**)⇒ 要 `Gu > P` 才响 ⇒ 永不触发。

**"结构性上界"本身不分好坏,要看余量。** 我是先拿"结构性的就是好的"当结论,
于是**用同一把尺子量了两个余量截然不同的计数器**,把一条很尖的判据误判成侥幸。

## 三★ 源码扫描:只认拼法 + **锚钉在行首**(同一个洞的两面,我都实测出来了)

pi 指出只认 `+=` 是**假绿方向的洞**:`totalTests = totalTests + ran;` 躲得过扫描而仍然双计。
我改成判"对这四个计数器的**写**"(`+=` / `= X + …` / `= X - …` / `++` / `--`),
**然后实测发现第一版照样漏** —— 因为我把锚写成了 `^\s*X`(**行首**):

```js
if (ran === null) { ranFilesCount += 0; }     // 一行两条语句,增量在行中间
```

**而"第二处"长得正是这个样子。** ⇒ 锚必须是**语句起点** `(?:^|[;{])`。

**这是我第二次栽在同一件事上**:扫描器的锚要按**语言结构**定,不是按**版面**定 ——
上一次是"扫描器咬到自己的文档",这次是"锚钉在行首而语句不在行首"。

(中途还有一个**我自己的假读数**:变异脚本用 `io.open(P,'w').write(...)` 不保证落盘,
六种变异全报"★ 漏"。是"读数器没先被证明是好的"的又一次 —— 定稿加了
`with` + **写完读回来断言等于**。)

**变异验证 6/6 命中**:`+=`(同一行 if 块内)/ `= X + n` / `X++` / `totalTests = X +` /
`unreportedFiles = X +` / `X - n`;还原 ⇒ 不响。
另外重注入**原 bug**(24 个绿文件各双计)⇒ `ran=49 > files=25` 响、`checks` 虚高,与当初现象一致。

仍不是根治(`x ||= y`、`x = (x) + 1`、反射赋值都能躲)—— 根治是把累加抽成**纯函数**
(入参=解析结果,出参=增量)再喂合成输入,已在注释里写明它是唯一能真跑的形状。

顺带:`ran` 那条报错的修法文案原来还写着"全文件搜 `totalTests +=`"(陈旧)—— 一并改掉。

## 四、修后

```
ok 5 - 总数行自洽(ran=25 ≤ files=25,fail 是 checks 的子集;四个计数器各只有一处"写",由源码扫描判)
RESULT files=25 ran=25 checks=400 pass=399 fail=1 red=4 broken=0 unreported=0 verdict=red
```

红仍 4 条、都不是我的。到期那 7 条仍未动。
2026-09-15 13:04:10 +08:00
..