Commit Graph

2 Commits

Author SHA1 Message Date
4babc96f8b test(criteria): runner 不再手写 --test(由内容推导)+ 自检 4「这条判据能不能红」;规范补两档
pi 提的三条,第一条落地前先按他的要求**贴真实样本实测**,结论与他的猜测不同(记在代码里)。

## 1 runner 内部那个"配错 flag = 绿" —— 实测后换了个形状

pi 的猜测:给自定义 `check()` 的判据传 `--test`,runner 会报"0 个测试"并以 0 退出。
实测(node v22.22.2,两条真实样本):

- `node --test <自定义 check() 判据>`:**退出码照样传出来**(文件 exit 1 → 命令行 exit 1),
  没有被吞;
- 但 `node --test <什么都不做的文件>` 报 `# tests 1 / # pass 1` ——
  **pass 计数不是"检查跑过"的证据**。

所以"解析 pass 计数、0 就判红"这条路两头不讨好:抓不到空判据(它报 1),
还会在 `narrow-layout` 上误报(它的汇总行是"窄屏布局:全部通过",里面没有数字)——
正是 pi 提醒的"别照抄我的正则,先贴样本"。

换成两条**结构证据**:

- **`--test` 不再手写**:由文件内容推导(源码里 `from 'node:test'` 就走 node:test),
  清单里出现手写 `--test` 直接红 —— 配对错误不再靠记性维护;
- **自检 4**:每条判据文件里必须存在"能红"的路径(`test(` / `check(` / `process.exit(1)`),
  外加"跑完必须有输出"。一个都没有 = 它永远不会红,与"全通过"长得一模一样
  (这是"判据自己不会跑"家族的第 6 个宿主,家族表和六种宿主都写进规范了)。

变异:清单手写 `--test` → 红;加一条"什么都不做、退出 0"的判据 → 红;
静默成功(有能红路径但一行不输出)→ 红。

## 2 规范 §3 补一档:变异红了还要看**红在哪**(pi)

"只报红了不算,要能指名红的是哪几条";**红在解析/加载失败上不算红**(先让变异
"语法正确、语义错");变异作用于被剥掉的注释也不算。

## 3 `CRITERIA.md` 的可见性(pi 提的位置问题)

它管两个客户端的判据,却躺在 electron 的测试目录里。已在
`docs/HARMONY-ALIGN-PLAN.md` §四(验收纪律)加指针,并顺手把 pi 点名过的两条口径写死在那儿:
**"未验"只能用于"步骤做过、结果没看",功能不存在必须写"没做"**;
**"机制上确定不同"要判、不许记成"未验"**(深色档预设那次)。

## 验证

`npm test` 退出码 0(12 个判据文件全绿 + vitest 258/258)。
2026-09-14 15:00:26 +08:00
0ce8b29546 test(criteria): 判据规范 CRITERIA.md(邻接不是结构·第三次露头)+ 废弃 API allow-list 结构化 + 扫描范围自检
pi 的两条增量,都不需要他再确认。

## 1(pi 建议):生成清单 + 空 allow-list 的结构性风险

他的推演:SDK 升版会往清单里加新条目 → 某天早上套件**突然红**,且红在与本次改动无关的
代码上;这时人的第一反应是把名字塞进 allow-list —— 而 allow-list 一旦这么用,
就不再是"研究过的例外",只是"红的止痛药"。所以条目结构化:

```js
const ALLOW = [ /* { name, replacement, why } */ ];
```

`replacement` 非空是硬断言("暂时不想改"不是放行理由,"替代品要求的 API level 高于基线"才是)。
**刻意不断言"名单必须为空"** —— 那会挡住合理放行;断言的是"有名字、没替代品 → 红",
于是侵蚀发生时红的是**放行这件事本身**,而不是某天的新 SDK。
变异:塞一条 `{ name:'px2vp', replacement:'', why:'暂时不想改' }` → 红。

## 2(pi 建议):扫目录的判据要防"空判据"

他问废弃 API 判据扫哪些目录(怕只扫 `pages/`,`common/` 里的旧写法逃掉)。
答案:扫的是**整个 ets 目录递归**(实测 25 个文件,含 `pages/ common/ model/ api/ entryability/`)。
顺手加了防退化的自检:文件数 ≥ 20,且 `pages/ common/ model/ api/` 四个目录都必须扫到
—— 目录改名/只扫一个子目录会让这条变成空判据而依然全绿。
变异:把扫描范围改成只扫 `pages/` → 红。

## 3(pi 建议):把"邻接不是结构"写进判据规范

同一个坑在本仓露头三次:① 窗口式正则被一行注释挤爆(原注释自嘲过);
② 括号配对取代窗口;③ 链式修饰符让"看前一个字符是不是 `}`"静默失效。
共同形式值得升格成规则,于是新建 `client/electron/test/CRITERIA.md`(七条),
并在 `run-all.mjs` 加**自检 3**:规范文件必须在、且必须点到关键条目。
WebUI 侧 `background.test.mjs` 的窗口式存量按 pi 的说明**记着不动**(那是他的地盘)。

规范里另外两条是本仓自己踩出来的:剥注释读代码 vs 读原文读理由(混用必红);
以及**验证要按真实入口跑** —— 我用 `node --test test/run-all.mjs` 验自检 3 时它"依然绿",
其实是 runner 把内部的 `process.exit(1)` 吞了;换成 `npm test` 走的那一行就红对了。
变异:删掉规范里的一条关键规则 → `npm test` 那条路 exit 1。

## 验证

`npm test` 退出码 0(11 个判据文件全绿 + vitest 258/258);`hvigorw assembleHap` 未受影响。
2026-09-14 14:51:30 +08:00