Files
MailUI4Agents/client/electron/test
JianFeeeee 271e0a8ee4 文档: **光进默认路径不够 —— 结论必须到得了"决定颜色的那一格"**(§16.1,同一条缝的三个落点)
pi 顺第一/二例的线实测出**第三例**,与我在 `4b841e0`/`6ee9902` 修的那两例
**是同一句话的第三次出现**,而 `CRITERIA.md` 里**一个字都没有** ——
修复在代码里、形状没进规范 ⇒ 下一个人只会修好其中一例。本节补上。

## 缝的形状(三次都一样)

> `summary.py` 把结论说对了、退出码也说对了,**但没有一条通道把它送到
> "决定 `verdict` 的那一格"** ⇒ 读者看到的是一个**看着完全正常**的读数。

## 三个落点(每次位置都不同,所以必须分开记)

| # | 落点 | 现象 | 修法 |
|---|---|---|---|
| 1 | **正则匹配就走不到 `status`** | 盲读时照样打 `RESULT mutants=0 …`(匹配)⇒ `status=2` 从没被读;`sp.stdout` 全文件只一处引用 ⇒ 三行 `✗✗` 一个字都到不了读者 | 盲读改打 `NO-READING` + **先判 `status`** |
| 2 | **部分可读**(`chmod 000` 单个 job) | `blind` 为假、数字是真算的 ⇒ 那行**匹配正则且看着正常** ⇒ 修法①**对它无效** | 只有**先判 `status`** 兜得住 ⇒ 两层**各治一例**,不是叠保险 |
| 3 | **`unlisted`/`ghosts` 退 0** | 警告已算出,却被 `whyLines: status !== 0 ? whyLines : []` **丢掉** ⇒ 磁盘 13 个 job、套件报 48、"未列入清单"在套件输出 grep **0** 次 | 退出码按**性质**分:`unlisted`/`ghosts`⇒**1**(清单该改=数据)、`blind`/`unreadable`⇒**2**(权限=环境);转印放宽成 `(note \|\| status !== 0)` |

★ **第 3 例的尖处**:`unlisted`/`ghosts` **不是**环境问题,是**清单该改**。
按 `env-defaults.sh:25`"失败要说清是环境问题…不要让它冒充代码缺陷" —— **反向也成立**:
**别让"清单没跟上"冒充环境**。故归 **1** 不归 **2**。

## ★★ 为什么会连着踩三次

三例的**上游判别都做对了**(`unlisted` 算出来了、`blind` 判出来了、`unreadable` 分出来了),
错的全在**最后一跳到 `verdict`**。⇒ 通用规则:

> **每加一条"发现问题就报告"的逻辑,都要问一句:
> 它的结论最终喂给了哪一个决定颜色的变量?**
> 只 `print` 不算到达;落到 `reds`/`brokens`/`dueFailed`/`selfCheckFailed` 之一,
> 或让退出码变成下一层会读的那个值,才算。

## 验证

· **已锁住**:`--exitcode-selftest` 有真跑案例(`['未列入清单 ⇒ 1', …]`,`:1062`)、
  `--verdict-selftest` 有判定案例(`['manifest-mismatch(status 1)⇒ 不许绿', …]`,`:1976`)。
· **变异验证**:把 `unlisted or ghosts` 从 `return 1` 改回 `return 0`
  ⇒ `--only-selftest=exitcode-selftest` **rc=1、2 条可归因红**
  (`未列入清单 ⇒ 1:rc=0(期望 rc=1 … UPSTREAM_RC[manifest-mismatch]=1 与真跑出来的 rc=0 不符)`)。
  ⇒ 这条缝**有判据守着**,不靠下一个人再读一遍源码。
· **端到端 A/B**(干净 worktree,同刻对照):

  | | A:12 文件(清单一致) | B:13 文件(1 个未列入清单) |
  |---|---|---|
  | `diag=` | `baseline-stale` | **`manifest-mismatch`** |
  | "未列入清单" 在套件输出 | grep **0** | grep **1** |
  | `(summary.py)manifest-mismatch` 红 | **0** | **1** |

· 本提交**只改文档**:`client/electron/test/CRITERIA.md`(新增 §16.1);隔离 worktree 跑全套 `^RED=0`。
2026-09-19 09:45:53 +08:00
..