jianf
fc5fe11590
docs: 去掉 README 计数并在判据侧禁止它 + 变异判据方法论 dev-notes
1. README 计数去掉(不留守卫)
去掉「119 tests」与「10 checkpoints / 10/10 checkpoints passed」。
理由按裁定:一个没有守卫、被手改过五次的数字是负资产,
它给人的确定感是假的;加守卫要翻倍套件时间,不值。
守卫反过来断言「README 不得出现计数」:
/\b\d+\s+tests\b/i
/\b\d+\s+checkpoints\b/i
/\b\d+\s*\/\s*\d+\s+checkpoints passed/i
三种写法实测都能抓住(120 tests / 12 checkpoints / 12/12 passed)。
顺带处理一处同类:原文「(6 tests)」是手抄的测试数,删;
「12 blocks × 15 queries = 45 cases」是 fixture 自身内容量,也删并改为
指向 fixture 文件 —— 由文件决定的东西不该在文档里再写一份。
(README 现在的口径:表格说「验什么」,`npm test` / `npm run check` 说「多少」。)
2. docs/dev-notes-mutation-criteria.md(新)
把三轮踩出来的方法论落成仓库文档,README 的 Verify 段加指针。
三类失效模式,每条都给「形态 / 实测证据 / 正确形态 / 自查问句」:
① 自测型假变异(犯四次:W11† / W11d†a / W11d†b / W12†)
变异在 test/ 里自己拼替身,一行 lib/ 没碰 ⇒ 真回退下保持绿
实测:M-a / M-b 下 W11d†a / W11d†b 均绿,只有 W11d 红
② 清单写死(W11f)
手写 MODES 漏掉新 case;future_mode_a/b 测的是「掉进 default 的」,
永远测不到「有人新写了一个 case」
实测:植入 brand_new_mode(零命中时撒谎)→ 写死版全绿,扫描版红
并记下边界:自动推导不能替代「提取本身也要被守卫」,
所以还需要 declared.length >= 4 + W11f-a(guards the guard)
③ 变异共享状态并发撞车(我自己引入的)
就地改写 lib/*.js,而 node --test 并行跑文件 ⇒ 别的文件读到中间态
实测:约 1/30 偶发失败,症状像 flaky 断言;A1b / G2b / G5 这类
读源码的判据会读到被改坏的中间态
修法:在 lib/ 副本上变异(复制 lib + package.json + 软链 node_modules),
finally 清理,锚点失配显式失败
文末给通用自查清单 9 条 + 一句话记住三条。
验证
- npm test 119/119、npm run check 10/10
- 连跑 6 次全量 0 失败
- 无 .orig / .rej / /tmp/mut-* 残留
- 未 amend / 未 force push,199553f 之后是新提交
2026-10-30 14:36:41 +08:00
..
2026-10-30 14:36:41 +08:00
2026-10-30 00:39:44 +08:00
2026-10-30 14:00:07 +08:00
2026-10-30 09:52:06 +08:00
2026-10-30 09:29:37 +08:00