修复: pi 报的两条 STATIC_ONLY 发现 —— 第 2 列**没有读者** + static= 与"到期"是**两个量**(闸可被静默关闭)
pi 单独发来它答应我的那两条(在**当前 HEAD** 上重测),我逐条复现、修掉,
并在过程中**自己连错两次**(都被变异抓出来,已写进 `CRITERIA.md §16.3`)。
## 一、复现(我跑的,同刻 A/B)
**发现 1**:第 2 列「当初只能静态的原因」**没有任何判据在读** ——
两个解构循环都用 `,` 把它丢掉(`:1295`/`:1306`),唯一读者是**到期点名时打印**
(= 它最不需要被检验的时刻)。把它改成假话 ⇒ `red` 与红清单**零变化**。
**发现 2**:把 6 条探针全改指恒 `false`(`run: () => false`)⇒
**到期点名 1 → 0**,而 **`static=6` 一字不变**。
根因:`:2987` 的 `static=${STATIC_ONLY.length}`(余额)与 `:1605` 的
`if (dueStatic.length > 0)`(到期)是**两个量**,只有后者决定"到期"发不发生。
★ 这条口子**是闸自己邀请的** —— 它的选 (b) 写着"并改换一个更准的到期前提",
换探针是**被鼓励的动作**,而"新探针是否真的适用于这条判据"**没有任何判据在问**。
## 二、修法
1. `static=` 改成 **`static=6(其中已到期 6 条)`** ⇒ 关闸读得出来(Y→0 而 X 仍 6)。
2. **每次运行都全表播报** `STATIC_ONLY`(文件 + 原因 + 是否到期**并排**)⇒ 第 2 列有读者。
3. **自检 4b** 钉住"那一跳真的存在"。
## 三、我自己的两次错修(都被变异抓出)
| 修法 | 变异 | 结果 |
|---|---|---|
| ① 理由必须点到探针的某个标识符 | 拿**现有 6 条真理由**跑 | **红了 5 条** ⇒ 假红是噪音,已撤 |
| ② 断言 `staticDetail` **变量**内容完整 | 只删那句 `console.log` | **4b 仍报 ok**,真实输出播报段 **0 次** |
| ③ 断言源码含 `${staticDetail}` 形状 | 同上 | **仍 ok** —— 锚点写在这段自检**自己的注释**里,`includes` 命中注释 |
| ④ 剥离注释后再数 `+ staticDetail);` | 删 print | **4b 红 ✓** |
## 四、验证
· `AGENTMAIL_PROBE_DEVICE=ok` ⇒ `static=6(其中已到期 6 条)`、⏰ 标记 6 个、4b ok;
`=none` ⇒ `已到期 0 条`。
· 变异 2(改指恒 false):基线 `已到期 6 条`/点名 1 → 变异 `已到期 0 条`/点名 0 ⇒ **关闸可见**。
· 变异 4(删 print):4b **红**,红句"可执行代码里没有任何一处把 `staticDetail` 拼进输出"。
· 全套隔离跑:`^RED=0`、自检 4b 打印 1 次、播报段 1 次。
· 全仓 grep:**没有**任何下游解析 `static=` 的旧形状 ⇒ 格式改动安全。
## 五、文档
`CRITERIA.md` 新增 **§16.3**,含那张"我连错四次"的对照表与三条可复用教训:
① 让字段可证伪 ≠ 给它加一条会红的规则(先拿现有数据试);
② 变量对 ≠ 打出去了;
③ 锚点自匹配要靠**剥注释**治。以及通用规则:
**一个没人读的字段,先问它该被谁读 —— 给它读者;不该被读就删掉。**
★ 文件:`client/electron/test/run-all.mjs`、`CRITERIA.md`。
This commit is contained in:
@ -889,6 +889,53 @@ rc (原返回处):blind/unreadable/baseline-unrunnable|unknown 排第一
|
||||
> 只测**单维**(每次只动一个条件)永远证明不了这件事 ——
|
||||
> **对角线上的绿,对组合态没有发言权。**
|
||||
|
||||
### 16.3 ★★ **"没人读的字段"与"给它评分"之间,还有第三条路:给它一个读者**(pi + dsh 2026-09-18)
|
||||
|
||||
`STATIC_ONLY` 的**第 2 列**「当初只能静态的原因」**没有任何判据在读** ——
|
||||
两个解构循环都用 `,` 把它丢掉(`:1295`/`:1306`),唯一会读它的场合是**到期点名时打印**,
|
||||
而那正是它**最不需要被检验**的时刻。
|
||||
**实测**(dsh 同刻 A/B):把这条理由改成一句假话 ⇒ `red` 与红清单**零变化**。
|
||||
|
||||
**动到期闸的第二条**(pi 同封报的,我复现):`static=` 与"到期"是**两个量** ——
|
||||
`static=${STATIC_ONLY.length}`(余额,永远 6)与 `dueStatic`(会变 0)分开,
|
||||
而**只有后者**决定"到期"这件事发不发生。
|
||||
**实测**(把 6 条探针全改指恒 `false`):**到期点名 1 → 0**,而 `static=6` **一字不变**。
|
||||
★ 这条口子**是闸自己邀请的**:它的报文选 (b) 写着"并改换一个更准的到期前提"
|
||||
⇒ 换探针是**被鼓励的动作**,而"新探针是否真的适用于这条判据"**没有任何判据在问**。
|
||||
|
||||
#### ★★★ 我在这一节里连错两次,两次都是被**变异**抓出来的
|
||||
|
||||
| 我的修法 | 变异 | 结果 |
|
||||
|---|---|---|
|
||||
| ① 给它加规则:理由必须点到探针的某个标识符 | 拿**现有 6 条真理由**跑 | **红了 5 条** ⇒ **假红是噪音**,比不设判据更糟 |
|
||||
| ② 让自检断言 `staticDetail` **变量**内容完整 | 只删掉那句 `console.log` | **4b 照样报 ok**,而真实输出里播报段 **0 次** |
|
||||
| ③ 断言源码里有 `${staticDetail}` 这个形状 | 同上 | **仍报 ok** —— 因为**锚点写在这段自检自己的注释里**,`includes` 命中的是注释 |
|
||||
| ④ 剥注释后再数 `+ staticDetail);` 的命中 | 删 print | **4b 红 ✓**("可执行代码里没有任何一处把 `staticDetail` 拼进输出") |
|
||||
|
||||
★ 三条教训(都可复用):
|
||||
|
||||
1. **"让字段可证伪" ≠ "给它加一条会红的规则"** ——
|
||||
先拿**现有数据**试一遍;**红了就说明规则错了,不是数据错了**。
|
||||
2. **变量对 ≠ 打出去了** —— 自检守的若是"它读的那个值",
|
||||
那么"那个值怎么来的"仍然没人守(§16.1 的同一条缝,换了个位置)。
|
||||
3. **锚点自匹配**(自检 4 早就踩过、我这次又踩):
|
||||
把要找的形状**写进注释**,`includes` 就会命中注释 ⇒
|
||||
**判据空转报 ok**。修法:**剥掉注释再扫** + 在运行时拼锚点。
|
||||
|
||||
#### 落地
|
||||
|
||||
- `static=` 那一格改成 **`static=6(其中已到期 6 条)`** ⇒ "关闸"这件事**读得出来**
|
||||
(Y 变 0 而 X 仍是 6 ⇒ 一眼看得出)。
|
||||
- **每次运行都全表播报** `STATIC_ONLY`(文件 + 原因 + 是否到期**并排**)⇒ 第 2 列有了读者。
|
||||
- **自检 4b** 钉住"那一跳真的存在"(剥注释后数锚点 + 内容完整 + 反空转长度)。
|
||||
|
||||
★ **通用规则**(本节定稿):
|
||||
|
||||
> **一个没人读的字段,不许靠"给它加判据"来救 —— 先问它该被谁读。**
|
||||
> 若它本就该被人看见,**给它一个读者**(并钉住"这一跳存在");
|
||||
> 若它不该被任何人读,**删掉它** —— **余额里读不出来的东西等于不存在**。
|
||||
> 只有在"这个字段本来就有真假"时,才轮得到加判据 —— 而且**必须先拿现有数据验一遍**。
|
||||
|
||||
## 17. 变异只证明「注入的样本被抓」,**不证明完备性**;判据的**标签必须等于断言范围**
|
||||
|
||||
**规则**(pi 2026-09-14):一条判据通过变异验证之后,只能说"我注进去的那一条会被抓"。
|
||||
|
||||
Reference in New Issue
Block a user