pi 的三条增量,前两条落地: 1. **错误信息自带修法**:受众不只是读过规范的人 —— 并发写 WebUI 的 agent 新加判据时不会打开 CRITERIA.md,看到红的第一反应可能是"套件坏了"。所以把可照抄的修法写进那条错误本身 (共享 helper 的用法 + 样板文件路径),并说明 node:test 的判据不用管。 **red 是 ta 一定会看到的,文档不一定被打开。** 2. **marker 由共享 helper 打印**:新增 test/lib/checks.mjs(导出 check/finish), 计数只可能在该模块内发生 → "漏打 marker"与"计数写错位置"这两类在新文件上不可能发生。 为避免"写了没人用"(本仓踩过的坑),同时把两个手工计数的判据改用它: narrow-layout(原来只有 failed 计数)与 markdown-xss(原来根本没有计数器)—— 条数不变(52 / 9),套件仍全绿。 未回改其余 10 个文件:run-all 的 marker 检查已经覆盖它们。
45 lines
1.9 KiB
JavaScript
45 lines
1.9 KiB
JavaScript
/*
|
||
* 判据的共享 check/finish —— 让"漏打 marker"和"计数写错位置"这两类
|
||
* **在新文件上不可能发生**(pi 2026-09-14 的建议)。
|
||
*
|
||
* 背景:`run-all.mjs` 用"自报条数 + 每文件期望条数"当棘轮(只增不减),
|
||
* 但之前那是两条靠记性的约定 —— "记得在结尾打 `RESULT pass=N`"、
|
||
* "计数必须写在 `check()` 内部"。这两条各自都踩空过:
|
||
* `narrow-layout` 当时只有 `failed` 计数、`markdown-xss` 根本没有计数器。
|
||
*
|
||
* 用法(判据文件):
|
||
*
|
||
* import { check, finish } from './lib/checks.mjs';
|
||
* check('这条判据的名字', cond, '失败时给人看的细节');
|
||
* finish('主题'); // 打完汇总就退出(有失败则退出码 1)
|
||
*
|
||
* 计数只可能在这个模块里发生,所以只要用了它:
|
||
* - marker 一定会有(`finish()` 打);
|
||
* - `check()` 的实现不可能被"合并冲突改空"而看不见(空实现 → pass=0 → 棘轮红)。
|
||
*
|
||
* ⚠️ 反过来也成立:**判据文件里不要自己再写一份 check/计数**(那正是本模块要消灭的东西)。
|
||
* 已有的 12 条判据不用回改(`run-all.mjs` 的 marker 检查已经覆盖它们)。
|
||
*/
|
||
let pass = 0;
|
||
let fail = 0;
|
||
|
||
/** 一条判据。`ok` 为真记通过,否则记失败并打印细节 */
|
||
export function check(name, ok, detail = '') {
|
||
if (ok) {
|
||
pass++;
|
||
console.log(` 通过 ${name}`);
|
||
return true;
|
||
}
|
||
fail++;
|
||
console.error(` 失败 ${name}${detail ? ' — ' + detail : ''}`);
|
||
return false;
|
||
}
|
||
|
||
/** 汇总并退出。`label` 是给人看的名字(例:「主题」) */
|
||
export function finish(label) {
|
||
console.log(`\n${label}:${pass} 通过${fail ? `,${fail} 失败` : ''}`);
|
||
// 机器可读的契约行:run-all.mjs 只认这一行来判"这条判据到底跑了几条"
|
||
console.log(`RESULT pass=${pass} fail=${fail}`);
|
||
process.exit(fail ? 1 : 0);
|
||
}
|