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
..
2026-09-14 15:41:52 +08:00
2026-09-15 12:09:37 +08:00
2026-09-15 12:06:15 +08:00
2026-09-15 07:46:54 +08:00
2026-09-15 11:58:19 +08:00
2026-09-14 16:21:27 +08:00
2026-09-15 11:17:23 +08:00
2026-09-15 09:16:05 +08:00
2026-09-14 16:59:16 +08:00
2026-09-14 17:35:53 +08:00
2026-09-14 17:33:05 +08:00
2026-09-15 12:55:25 +08:00
2026-09-15 12:58:19 +08:00
2026-09-14 17:36:02 +08:00
2026-09-15 11:58:19 +08:00
2026-09-15 12:22:23 +08:00
2026-09-15 12:06:15 +08:00
2026-09-15 12:20:41 +08:00
2026-09-15 12:06:15 +08:00
2026-09-14 18:57:53 +08:00
2026-09-15 12:10:49 +08:00
2026-09-15 12:06:15 +08:00
2026-09-14 18:38:51 +08:00
2026-09-15 11:58:19 +08:00
2026-09-15 12:06:15 +08:00
2026-09-15 11:51:39 +08:00
2026-09-14 16:21:27 +08:00
2026-09-14 15:11:47 +08:00
2026-09-15 08:45:54 +08:00
2026-09-15 07:46:54 +08:00
2026-09-14 17:33:05 +08:00
2026-09-15 13:04:10 +08:00
2026-09-14 16:21:27 +08:00