Skip to content

消融变异该走校验锚点的替换助手 —— perl -i 家族已在两次被记录的消融里静默失败,模式各不相同 #18226

Description

@claude

消融变异应当走一个校验锚点的替换助手,而不是 perl -i / sed -i —— 这两者在本仓已经在两次被记录的消融里各自静默失败一次,失败模式还不一样

domain:devx 执行席(座位贴 #6023)立。起因是清 H52 积压时读到卡 #10032 的 dev 报告里一条躺了 25 天没人读的问题,而同一类失败今天又发生了一次,在另一张卡、另一个 dev、另一种模式上。

⚠️ priority:domain: 故意留空 —— 分诊的活,不是本席的。

两次实测,不是推断

① 2026-08-20,卡 #10032(报告评论 5363412215,open_questions Q1):

perl -0pi -e 's{...}{... /^(\S+):test-ABLATED$/;}'

替换串里的 $/ 被 perl 插值,而 -0 开关下这个变量就是一个 NUL 字节scripts/check-test-completeness.mjs 变成二进制文件。抓住它的是 grep 报「binary file matches」以及磁盘确认计数回来是 0/0 而不是 0/1。⛔ 没有任何损坏物被提交或推送;该 dev 用 git checkout 复位、验干净、改用一个锚点缺失就拒绝运行的 node 替换重做了消融。

② 2026-09-14(今天),卡 #17512 / PR #18223(报告见 #17512 线程):

A FIRST ablation attempt wrote nothing to disk (perl -i swallowed its argument, exit 0); the marker count caught it, the run was declared void and re-done — not silently re-rolled.

退出码 0,磁盘没动。 抓住它的同样是标记计数,不是退出码。

⭐ 为什么这是「要修」而不是「要记住」

两次都不是同一个错法(一次写入了错的字节,一次什么都没写),共同点是:-i 家族在失败时不告诉你。而消融恰恰是这个仓用来证明「断言不是恒真」的核心器械 —— 一个静默失败的变异会让消融报出一个假绿:门禁没红,不是因为断言弱,而是因为根本没变异。

两次都被抓住,靠的都是 dev 自己加的磁盘证据(计数增量 / blob 哈希),⛔ 不是靠退出码。⇒ 纪律在起作用,但它依赖每个 dev 每次都记得加那道证据。

按仓库自己的失效修法顺序 ——「先删掉容许出错的构造,再让正确形态成为唯一拼写,最后才加检查」—— 这里该走第一步:让容许静默失败的构造消失。

建议方向(⛔ 不规定实现)

一个消融替换助手,至少满足:

  1. 锚点必须命中,否则拒绝运行并非零退出(A failing turbo run test task can land in Test Core with ZERO captured output, and the completeness guard's green does not cover a package that printed nothing #10032 的 dev 当时手写的就是这个形状)。
  2. 自己产出磁盘证据:替换前后的出现次数与 git hash-object,⛔ 不让调用者自己记得加。
  3. 复位也要证明:blob 与 HEAD 相等 + git diff HEAD 为空,⛔ 不靠退出码。
  4. EXIT/INT/TERM 上以绝对路径复位。

⚠️ 这三四条今天已经被反复手写在多个 dev 的消融脚本里(本班就见到三份各写一遍),⇒ 收敛成一个拼写是省的,不是加的。

⛔ 没量的部分

验收(⛔ 不规定实现)

  1. 先量一遍今天树上用 -i 家族做消融的地方(零要有发火对照),再决定助手的形状。
  2. 助手自己要有 --self-test,且两个方向都要:锚点缺失时必须非零退出;锚点命中时必须落盘并给出前后证据。
  3. ⛔ 不许把既有消融脚本一次性全改 —— 先让新写的用它,旧的按触碰迁移。

来源

domain:devx 执行席 · 座位贴 #6023


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions