test(判据): ★★★ 套件从 10-02 10:46 起一条都没跑过 —— 补接线 + 结算登记数

**零读数 24 小时,仓库里没有任何记录**(DEBTS.json 58 条里 grep「没接进」0 命中)。

漏接线的三个(都来自 aeb1f41 / 2f17f62,都比 run-all.mjs 最后一次改动晚):
    test/inbox-fallback-poll.test.mjs   ← SSE 兜底轮询(探测 total 变化)
    test/sse-credentials.test.mjs      ← SSE 订阅跟账号凭证走
    test/web-comment-only.test.mjs

**为什么严重(三层放大)**:
1. 自检 2「每个 *.test.mjs 都要在清单里」在跑任何判据**之前** exit(1)
   ⇒ 实测 RESULT 行数 = **0**
2. npm test = run-all && vitest && typecheck ⇒ vitest(270 格)与
   typecheck **一起不跑** —— 而两者单独跑都是绿的
3. 失败信息只有一行中文 stderr,**不含"红"字样**,看起来像"环境问题"
⇒ 下一个人据上一份报告继续推断"判据在把守" ⇒ **报告的证据等级被系统性高估**。
守卫本身**不删**(漏接线绝不静默是真价值),代价靠「新增即接线」这条义务兜。

**顺带结算的登记数漂移**(都在 clean HEAD 上就红,非本次引入):
· harmony-window 9→10、appearance-defaults 7→8、harmony-2in1 23→24
  ("自报条数 > 登记条数"是显式的编辑义务:只判下界时多出来的条数删掉不红)
· harmony-appearance 28→29 —— 配合工作树里别人新增的那条设备判据
· static-criteria 5→4 —— appearance-defaults 已上设备并移出 STATIC_ONLY,
  **移出名单时忘了回头改这笔登记**,由 commit-hygiene 的机器镜像抓住
· debt-visibility REGISTERED['harmony-appearance'] 4→6 —— 两处都是
  **散文**(一处引用文件既有句子、一处在报错文案里),按该文件既有先例登记
  并注明;⚠️ 写那段说明时不能引用词表里的词,否则本文件自己数超(实测 12→14 即红)

**commit-hygiene 基线推进**:7d081095 与 477479a37 两条 `fix(harmony):` 改了
"鸿蒙源码 + 另一侧判据",按本仓口径该标 `跨端:`。二者**已推送到 origin 与
origin-https**(merge-base --is-ancestor 实测为真)⇒ 不能 amend;也不往 MARKERS
放行 `fix(harmony):`(那等于永久允许"说单端、实际改两端")。唯一正确处置是
推进基线 + 具名记下。已验证:COMMIT_HYGIENE_BASELINE 覆盖后 pass=4 fail=0。

**CRITERIA.md 新增 §6.0「怎么读判据的数」** —— 原有 17 节全在讲「怎么写」,
缺的就是这一半,而今天两起独立事件都出在它:
· 6.0.1 接线守卫的失效形状是「全停」不是「那一条不跑」;ran 必须 == SUITE 条数
· 6.0.2 退出码只能来自不接管道的运行(`cmd >file 2>&1; echo $?`)。
  **本会话我连踩 5 次** `cmd | tail -N` ⇒ 报的是 tail 的码。实例:
  npm test|tail-80(真实:0 条判据跑过)、npm test|tail-30(真实:vitest 根本没跑)、
  tsc --noEmit|tail-20(**碰巧**也是 0 —— 事实为真但**当时无根据**,仍须重取证)
· 6.0.3 && 链里「全绿」要问**真跑到那一环了吗**(red 之后的东西根本没跑,
  而日志里「有 RESULT 行」与「无下游输出」可以同时出现)
· 6.0.4 判据变红先问「判据用的工具本身可信吗」(读取器的缺陷是**静默**的)
· 6.0.5 **当你就是改工具的人**:第一假设是「我弄坏了它」不是「代码回归」——
  「判据过期了」这个反应本身就错,它默认了「我改的是正确的东西」。
  附本次三次改错的下游依赖表,以及"下游依赖是**行为依赖**,
  codegraph 那类符号图看不见"。

★ 顺带记一条取证教训:本机每条命令都吐一行 libpcre 的
  `no version information` 噪声 ⇒ 某次 grep 的输出被它吞掉,
  我把"命令返回空"当成了"没有匹配"。**空输出要连退出码一起看**,
  这与 6.0.2 是同一族,只是这次发生在我自己的取证上。
This commit is contained in:
2026-10-03 10:43:41 +08:00
parent 93697c4061
commit 6df3c356d6
5 changed files with 161 additions and 8 deletions

View File

@ -129,9 +129,9 @@ const SUITE = [
// `setWindowLayoutFullScreen(true)`(消黑边)+ `getWindowAvoidArea`(让开时钟/手势条)。
// 只做前半 ⇒ 页签被时钟盖住(上一次就是这样退回去的,黑边于是留了三天);
// 只做后半 ⇒ 黑边照旧。**两半缺哪一半都要判红**,所以变异自检两个方向都跑过。
['test/harmony-window.test.mjs', ['--experimental-strip-types', '--no-warnings'], 9],
['test/harmony-window.test.mjs', ['--experimental-strip-types', '--no-warnings'], 10],
// 外观契约:默认值去 Go 源码里读(服务端 DefaultAppearance 是权威)+ 缓存键按账号
['test/appearance-defaults.test.mjs', [], 7],
['test/appearance-defaults.test.mjs', [], 8],
['test/build-stamp.test.mjs', [], 7],
['test/packaging.test.mjs', [], 5],
['test/align-refs.test.mjs', [], 3],
@ -168,7 +168,7 @@ const SUITE = [
* 2in1 键盘可达(用户 2026-09-21「快捷键打开发信页面 / 上下键切换发信目标 /
* 回车展开输入框」)。见该文件头部说明:为什么单开一个文件、为什么不端到端验。
*/
['test/harmony-2in1.test.mjs', [], 23],
['test/harmony-2in1.test.mjs', [], 24],
['test/harmony-contacts.test.mjs', [], 5],
// ★★ 下面三条是**补接线**,不是新写的判据(2026-09-17)。
//
@ -190,7 +190,28 @@ const SUITE = [
// 三维地址拼装:直接执行 `model/ReplyTarget.ts` 真逻辑(行为判据)
['test/harmony-reply-target.test.mjs', ['--experimental-strip-types', '--no-warnings'], 7],
// 宽屏侧栏图标轨:`WideSidebar` 接线与常量(静态判据,无设备)
['test/harmony-widescreen.test.mjs', [], 7]
['test/harmony-widescreen.test.mjs', [], 7],
/*
* ★★ 2026-10-03 补接线。三条都是 `node:test` 写的(`from 'node:test'` ⇒
* `shapeOf` 推导出 `usesNodeTest`,`--test` 由 harness 自动加、**不要手写**),
* 登记数按惯例写 0:**node:test 的条数由 runner 的 `# pass N` 认**,
* `fileChecks !== expected` 那条守卫只作用于自报 RESULT 的判据(`expected > 0` 才判)。
*
* 为什么漏了会**停掉全部判据**:自检 2("每个 `*.test.mjs` 都要在清单里")
* 在跑任何判据**之前** `process.exit(1)` ⇒ 实测 `RESULT` 行数 = 0,
* 一条读数都没有。而 `npm test` 是 `run-all && vitest && typecheck`
* ⇒ run-all 退出码非 0 ⇒ **vitest 与 typecheck 也不再跑**。
* 这是 `a && b && c` 链的形状(注释里已记过它的代价),只不过这里
* 卡在第一环、且失败信息只有一行 stderr、看起来像"环境问题"。
*
* 三条的来历:`inbox-fallback-poll` / `sse-credentials` 来自 `aeb1f41`
* (SSE 跟账号凭证 + 断线重放 + 兜底轮询),`web-comment-only` 来自 `2f17f62`
* —— 两个提交都比本清单上一次改动(`62b7c94`,09-02… 实际 10-02 00:14)**晚**,
* 即"新加判据的人没接线",与守卫注释里记的 09-17 那次同形状。
*/
['test/inbox-fallback-poll.test.mjs', ['--experimental-strip-types', '--no-warnings'], 0],
['test/sse-credentials.test.mjs', ['--experimental-strip-types', '--no-warnings'], 0],
['test/web-comment-only.test.mjs', ['--experimental-strip-types', '--no-warnings'], 0]
];
// 自检 1:清单里的文件必须真的存在(写错名字 = 那条判据永远不跑)