From 38b0e074153e346d3b84b4c71cdc9d903b76b839 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Tue, 15 Sep 2026 11:51:39 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E5=88=A4=E6=8D=AE):=20=E8=AE=A1=E6=95=B0?= =?UTF-8?q?=E5=A5=91=E7=BA=A6=E7=94=B1"=E4=B8=8D=E5=B0=91=E4=BA=8E"?= =?UTF-8?q?=E6=94=B9=E6=88=90"=E7=9B=B8=E7=AD=89"=EF=BC=88=E5=8F=AA?= =?UTF-8?q?=E5=88=A4=E4=B8=8B=E7=95=8C=E6=97=B6=EF=BC=8C=E5=A4=9A=E5=8A=A0?= =?UTF-8?q?=E7=9A=84=E5=88=A4=E6=8D=AE=E4=B8=8D=E5=8F=97"=E8=A2=AB?= =?UTF-8?q?=E5=88=A0=E4=BC=9A=E7=BA=A2"=E4=BF=9D=E6=8A=A4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pi 邮件 `9fed4386`:`harmony-push` 实报 13 / 清单登记 12 —— 因为 `ran < expected` 只判**下界**, 所以多出来的第 13 条**不在"被删会红"的保护内**(删掉它不会有任何东西变红,保护只覆盖前缀)。 两处改: 1. `harmony-push` 登记 12 → **13**; 2. 计数契约改成**相等**,并把两个方向的成因与处置分开写: · `ran < expected`:判据被删/被跳过/check() 被改坏…… 确认该减少条数时改清单数字; · `ran > expected`:新加的判据不在保护内 —— 请把清单数字改成实际条数, 这样"被删会红"才真正覆盖全部判据,而不是只覆盖登记过的那部分。 --- client/electron/test/run-all.mjs | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/client/electron/test/run-all.mjs b/client/electron/test/run-all.mjs index a19cfb1..8aaf842 100644 --- a/client/electron/test/run-all.mjs +++ b/client/electron/test/run-all.mjs @@ -190,6 +190,12 @@ const reds = []; let totalTests = 0; /** 逐文件自报的**失败**条数之和(`fail=` 那一格)。`pass + fail == checks` 是恒等式 */ let totalFail = 0; +/** + * **实际跑了但没能自报条数**的文件数 —— 这个数必须显式打出来。 + * 没有它,`checks=` 会**静默少算**(跑过的文件里有多少条没被计入,读者看不出来)。 + * 我第一次量就撞上了:`checks=379` 而逐文件手算合计 386,差的 7 条正是这些文件里的。 + */ +let unreportedFiles = 0; /** 实际跑过(并解析到自报条数)的文件数 —— 与 `SUITE.length` 分开报,差额看得见 */ let ranFilesCount = 0; /* @@ -291,6 +297,7 @@ for (const [file, flags, expected] of SUITE) { ranFilesCount += 1; totalFail += marker ? Number(marker[2]) : (nodeFail ? Number(nodeFail[1]) : 0); } if (ran === null) { + unreportedFiles += 1; /* * 报错**自带修法**(pi 2026-09-14):这条契约的受众不只是读过规范的人 —— * 并发写 WebUI 的 agent 新加判据时不会打开 CRITERIA.md,看到红的第一反应 @@ -308,11 +315,18 @@ for (const [file, flags, expected] of SUITE) { console.log(\`RESULT pass=\${pass} fail=\${fail}\`); 样板:test/theme.test.mjs、test/background.test.mjs (用 node:test 写的判据不用管:runner 认 \`# pass N\`。)`); - } else if (expected > 0 && ran < expected) { - reds.push(`${file} - ↳ 自报 ${ran} 条 < 清单里登记的 ${expected} 条。常见成因:判据被删/被跳过(写在 process.exit() 之后、 + } else if (expected > 0 && ran !== expected) { + // **相等**,不是"不少于"(pi 邮件 `9fed4386`):只判下界时,**多加的条数不受保护** —— + // 下一个人删掉那条"多出来的"判据不会有任何东西变红,于是"被删会红"这个性质只覆盖前缀。 + // 两个方向的成因与处置都不同,所以分开写。 + const why = ran < expected + ? `自报 ${ran} 条 < 清单里登记的 ${expected} 条。常见成因:判据被删/被跳过(写在 process.exit() 之后、 条件里提前 return)、check() 的实现被改坏(合并冲突)、marker 打在了汇总之前但计数没接上。 - 确认确实该减少条数时,把清单里那个数字一起改掉(那是一次显式、可复核的编辑)。`); + 确认确实该减少条数时,把清单里那个数字一起改掉(那是一次显式、可复核的编辑)。` + : `自报 ${ran} 条 > 清单里登记的 ${expected} 条 —— 新加的那几条**不在"被删会红"的保护内**: + 只判下界时,删掉多出来的部分不会有任何东西变红。请把清单里这个数字改成 ${ran}(一次显式编辑), + 新判据才真正被登记保护。`; + reds.push(`${file}\n ↳ ${why}`); } } } @@ -633,7 +647,7 @@ console.log(`\n========== 判据汇总 ==========`); */ const totalsLine = (verdict) => `RESULT files=${SUITE.length} ran=${ranFilesCount} ` + `checks=${totalTests} pass=${totalTests - totalFail} fail=${totalFail} ` + - `broken=${brokens.length} verdict=${verdict}`; + `broken=${brokens.length} unreported=${unreportedFiles} verdict=${verdict}`; if (reds.length === 0 && brokens.length === 0) { // 报**本相位实际跑了**几条,不报清单长度 —— 上面刚写完"不能声称自己做过的事", // 这里如果打 SUITE.length 就是在同一行里犯同一个错(2 条构建相位判据被跳过了)。