JianFeeeee
8614903bc9
修复: --verdict-selftest 第⑤条"口径一致性"**没读上游** —— 注释说"不写死",实现恰恰写死了一份码名单;两个方向都失真
pi 2026-09-18 报的。**成立**,我按它给的两个构造各复现一次,两个方向都坏。
## 一、缺陷本体:注释与实现相反
注释(原话):
> 这条把 `summary.py` 的退出码分类与 `run-all` 的表**绑在一起**验(**不在一边写死另一边的值**)。
实现:遍历 `DIAG` 表 + 跳过三个**硬编码**码名
(`if (code === 'none' || code === 'baseline-absent' || code === 'baseline-stale') continue;`)
—— **一个字节都没读 `summary.py`**。
⇒ 它实际断言的只是"**除了我手列的这三个,其它码都必须 `blocksGreen: true`**"。
**注释说"不写死",实现恰恰就是写死了一份名单。** 它是"按字面量裁射程"的又一例,
只不过这次长在**自检里的一条断言**上,而报文写着"两侧口径漂移",
读的人不会怀疑它其实没查上游。
## 二、两个方向都实测失真(都已复现)
· **假红**:加一个**上游退 0 的提示码**(与 `baseline-stale` 同类、完全合法)
⇒ 报 `上游退非零,下游却不红 ⇒ 两侧口径漂移`、rc=1。
**那个码的上游根本不存在**(`summary.py` 永远不会打出它)——
⑤ 在这里**编造了一个上游事实**并据此判红。
· **假绿**:加一个 `blocksGreen: true` 的新码 ⇒ **rc=0,一条 RED 都没有**。
同一句"上游退非零"也是编的 ⇒ 漂移从这个方向**完全看不见**。
## 三、修法:把 `(diag, rc)` 抽成唯一权威,链条每一跳都有判据
新增 `UPSTREAM_RC`(码 → 退出码),然后:
1. **`--exitcode-selftest` 把它逐个真跑验一遍**:每条案例用**真脚本真跑出来的 rc**
去核对那张表,并**反向覆盖**——表里每个码都必须有案例真跑过,否则报
"表里的值是没人验过的"。(这一跳是地基:若 `UPSTREAM_RC` 只是手抄的希望值,
⑤ 拿它比 `blocksGreen` 仍可能**两边一起错而且自恰地绿**。)
2. **⑤ 改为双向比对** `UPSTREAM_RC ↔ blocksGreen`:
上游非零却不红 ⇒ 漂移;上游 0 却标阻断 ⇒ 也漂移(**上一版查不到的方向**);
码没登记上游 ⇒ 红("加码要同时登记它退几",与 `blocksGreen` 那条"缺字段即红"是同一句纪律的另一半)。
**白名单随之消失**(数据说话)。
★ 链条现在是 **真脚本 → `UPSTREAM_RC` → `DIAG.blocksGreen`**,两个方向真绑上了。
## 四、我写第一版时又犯的两处(都当场红)
1. **按"声明的"码去找**:我第一版用 `wantOut` 取码 ⇒ `wantOut=null` 的四条
(一致 / 说明条目 / 未列入清单 / 清单有磁盘无)**一个码都没验到**,
反向覆盖当场报出 `none`、`counts-unusable`、`manifest-mismatch` 三个码"没人验过"。
而这三个码真跑出来是 0 / 2 / 1(我单独量过,**表里是对的**)⇒ **是验法漏了,不是值错了**。
⇒ 改成从**脚本真打出来的 stdout** 里取 `diag=` —— "验的是它真说的",而不是"我以为它会说的"。
2. **报文自相矛盾**:⑤ 无条件打 `ok` ⇒ 变异 (a) 输出长成
`RED DIAG 里这些码没在 UPSTREAM_RC 登记…` 紧跟 `ok 口径一致(双向):9 个码…`。
**与结构锚点那次是同一个错,我又犯了一遍** ⇒ 改成"这一格没红才打 ok"。
## 五、变异验证(都已还原)
| 变异 | 期望 | 结果 |
|---|---|---|
| **(a)** 加一个上游退 0 的提示码 | 红 | **红**,报文说"**没登记上游退出码**"(不再编造"上游退非零") |
| **(b)** `baseline-stale` 标成 `blocksGreen: true` | 红 | **红**:`两侧口径漂移:baseline-stale(上游 rc=0,却 blocksGreen=true)` —— **上一版完全看不见的方向** |
| **(c)** `UPSTREAM_RC['baseline-residue']` 改成 0(与真脚本不符) | 红 | **红**:`UPSTREAM_RC=0 与真跑出来的 rc=1 不符` |
| **(d)** `UPSTREAM_RC` 里塞一个 `DIAG` 没有的码 | 红 | **红**:`两张表漂移` |
## 六、验证与状态
· 五个自检全 exit 0。`--exitcode-selftest` 现在逐条报"真打出 diag=…,UPSTREAM_RC=… ✓",
并断言 `UPSTREAM_RC 的 8 个码都有案例真跑验过`;`--verdict-selftest` 报
"口径一致(双向):8 个码逐条相符,且无未登记/多余码"。
· 全套件 `checks=459 pass=455 fail=4 skip=0 red=9 broken=0 unreported=0 verdict=red`、
`mutants=48 ran=47 skipped=1 on_new_criteria=35 diag=none baseline=7/7✓` —— 与 pi 读数一致。
· 残留全清;`git status` 仅本文件;`HEAD=d07494e`。
2026-09-18 06:30:35 +08:00
..
2026-09-14 15:41:52 +08:00
2026-09-15 12:09:37 +08:00
2026-09-18 05:05:38 +08:00
2026-09-15 07:46:54 +08:00
2026-09-18 06:00:02 +08:00
2026-09-14 16:21:27 +08:00
2026-09-15 11:17:23 +08:00
2026-09-17 19:00:11 +08:00
2026-09-14 16:59:16 +08:00
2026-09-17 22:32:25 +08:00
2026-09-14 17:33:05 +08:00
2026-09-15 12:55:25 +08:00
2026-09-18 04:54:59 +08:00
2026-09-14 17:36:02 +08:00
2026-09-16 08:06:36 +08:00
2026-09-15 12:22:23 +08:00
2026-09-17 17:43:03 +08:00
2026-09-17 18:43:00 +08:00
2026-09-17 18:44:36 +08:00
2026-09-15 12:06:15 +08:00
2026-09-15 13:46:56 +08:00
2026-09-15 12:10:49 +08:00
2026-09-15 12:06:15 +08:00
2026-09-17 18:44:36 +08:00
2026-09-18 05:05:38 +08:00
2026-09-15 12:06:15 +08:00
2026-09-16 08:29:24 +08:00
2026-09-17 19:38:15 +08:00
2026-09-17 18:43:00 +08:00
2026-09-14 16:21:27 +08:00
2026-09-17 18:44:36 +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-18 06:30:35 +08:00
2026-09-18 01:08:04 +08:00