# 红面（变异）原始输出 —— 把 gomoku-ai 的「必堵对手五连」分支改成不可达
# 命令: sed 's/if (must.length) {/if (false) {/' gomoku.html | node selftest.mjs -
# 变异点: gomoku.html:365  if (must.length) {   ->   if (false) {   （全文件唯一命中，grep -c = 1）
# 时间: 2026-09-14 08:24:15 +0800
# 被测页面 sha256: a9b9749d468491f0d66d1273e24b90230a1cb9754e9e83d2e6b8369db4a76bba
# 套件 sha256: 18bef245c3f40282c72d5490838ec4759fcadf9ee52a32d8162f5f815d1f15f1
# exit code: 1
# ---- 以下为原始 stdout（未编辑） ----

[A] 核心逻辑（node:vm 真跑 gomoku.html 内联脚本）
  PASS  SIZE 恰为 15
  PASS  黑/白/空 常量
  PASS  A1 横向五连判胜
  PASS  A1 五连长度=5
  PASS  A1 五连坐标(横)
  PASS  A2 竖向五连判胜
  PASS  A3 右下斜(↘)五连判胜·白棋
  PASS  A3 五连长度=5
  PASS  A4 左下斜(↙)五连判胜
  PASS  A5 长连 6 子判胜
  PASS  A6 负向·四连不判胜
  PASS  A7 负向·中间断子不判胜
  PASS  A8 负向·空棋盘不判胜
  PASS  A9 已占位落子被拒
  PASS  A9 被拒后棋盘未被改写
  PASS  A9 越界落子被拒
  PASS  A9 负数坐标被拒
  PASS  A10 空盘未满
  PASS  A10 满盘为满
  PASS  A10 差一格未满

[B] 脚本化整盘对局（README 里给的可复现手数序列）
  PASS  B1 共 9 手且全部合法落盘
  PASS  B2 胜者为黑
  PASS  B3 五连长度=5
  PASS  B4 五连坐标
  PASS  B5 前 4 手白棋未抢先判胜（第 8 手白 4 连不判胜）

[C] 检查器非空转自负控（篡改实现，正断言必须变红）
  PASS  C0 篡改确实生效（源码被改写）
  PASS  C1 阈值改 6 后，横向五连不再判胜（证明 A1 非空转）
  PASS  C2 同一输入在正确实现下判胜（对照）
  PASS  C3 篡改版本与正确版本在该输入上结论相反

[D] 静态离线检查（无任何外部网络引用）
  PASS  D 未出现 http(s):// 外链
  PASS  D 未出现 src= 外部资源
  PASS  D 未出现 CSS @import
  PASS  D 未出现 CSS url(...) 外链
  PASS  D 未出现 <link> 标签
  PASS  D 未出现 网络 API 调用
  PASS  D 未出现 crossorigin/integrity
  PASS  D 页脚署名条存在
  PASS  D 有主控按钮 #undo / #restart
  PASS  D 判定阈值 5 在源码中可见

[E] AI 层优先级阶梯（node:vm 真跑 gomoku-ai）
  PASS  E1 ① 能成五直接赢 reason=win
  PASS  E1 ① 落点为自己的成五点 (7,2)/(7,7)
  FAIL  E2 ② 对手冲四(单端开放)必堵 reason=block-five :: expected "block-five", got "heuristic"
  PASS  E2 ② 落点恰为唯一成五点 (7,7)
  FAIL  E2b ② 对手活四必堵 reason=block-five :: expected "block-five", got "heuristic"
  PASS  E2b ② 落点在两个成五点 (7,2)/(7,7) 之一
  PASS  E3 ③ 对手活三有响应 reason=block-four
  PASS  E3 ③ 落点在封挡点 (7,2)/(7,6) 之一
  PASS  E3b ③ 对手跳三占断点 reason=block-open-three
  PASS  E3b ③ 落点为断点 (7,4)
  PASS  E4 ①优先于②：能赢就赢 reason=win
  PASS  E4 落点是自己的成五点而非对手的堵点
  FAIL  E5 ②优先于③：必堵成五点 reason=block-five :: expected "block-five", got "block-open-three"
  FAIL  E5 落点为冲四点 (7,7)，不是活三断点 (9,4) :: expected [7,7], got [8,3]
  PASS  E6 ④ 空盘首手 reason=center
  PASS  E6 ④ 空盘首手落点 (7,7)
  PASS  E7 ④ 同种子同局面 12 手序列逐手一致
  PASS  E7 序列非退化（首手 center，且 12 手互不重叠）
  PASS  E8 负向·probe 对已占位点不报任何形态
  PASS  E8 负向·probe 对越界点不报任何形态
  FAIL  E8 基线完整性·变异锚点唯一（gomoku-ai 内 if (must.length) 恰 1 处）
  FAIL  E8 基线完整性·套件内变异确实生效（gomoku-ai 源码被改写）
  PASS  E8 自控·把②改成不可达后同一局面不再 block-five（E2 非空转）
  FAIL  E8 对照·未变异版本在相同输入上给 block-five :: {"r":7,"c":7,"reason":"heuristic","score":38.6}

===== 结果：56 passed, 7 failed =====
  - E2 ② 对手冲四(单端开放)必堵 reason=block-five :: expected "block-five", got "heuristic"
  - E2b ② 对手活四必堵 reason=block-five :: expected "block-five", got "heuristic"
  - E5 ②优先于③：必堵成五点 reason=block-five :: expected "block-five", got "block-open-three"
  - E5 落点为冲四点 (7,7)，不是活三断点 (9,4) :: expected [7,7], got [8,3]
  - E8 基线完整性·变异锚点唯一（gomoku-ai 内 if (must.length) 恰 1 处）
  - E8 基线完整性·套件内变异确实生效（gomoku-ai 源码被改写）
  - E8 对照·未变异版本在相同输入上给 block-five :: {"r":7,"c":7,"reason":"heuristic","score":38.6}
