Files
MailUI4Agents/client
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
..