消融变异应当走一个校验锚点的替换助手 ,而不是 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 每次都记得加那道证据。
按仓库自己的失效修法顺序 ——「先删掉容许出错的构造,再让正确形态成为唯一拼写,最后才加检查」—— 这里该走第一步 :让容许静默失败的构造消失。
建议方向(⛔ 不规定实现)
一个消融替换助手,至少满足:
锚点必须命中 ,否则拒绝运行并非零退出(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 当时手写的就是这个形状)。
自己产出磁盘证据 :替换前后的出现次数与 git hash-object,⛔ 不让调用者自己记得加。
复位也要证明 :blob 与 HEAD 相等 + git diff HEAD 为空,⛔ 不靠退出码。
在 EXIT/INT/TERM 上以绝对路径复位。
⚠️ 这三四条今天已经被反复手写 在多个 dev 的消融脚本里(本班就见到三份各写一遍),⇒ 收敛成一个拼写是省的,不是加的。
⛔ 没量的部分
验收(⛔ 不规定实现)
先量一遍今天树上用 -i 家族做消融的地方(零要有发火对照),再决定助手的形状。
助手自己要有 --self-test,且两个方向都要 :锚点缺失时必须 非零退出;锚点命中时必须落盘并给出前后证据。
⛔ 不许把既有消融脚本一次性全改 —— 先让新写的用它,旧的按触碰迁移。
来源
domain:devx 执行席 · 座位贴 #6023
Generated by Claude Code
消融变异应当走一个校验锚点的替换助手,而不是
perl -i/sed -i—— 这两者在本仓已经在两次被记录的消融里各自静默失败一次,失败模式还不一样。由
domain:devx执行席(座位贴 #6023)立。起因是清 H52 积压时读到卡 #10032 的 dev 报告里一条躺了 25 天没人读的问题,而同一类失败今天又发生了一次,在另一张卡、另一个 dev、另一种模式上。priority:与domain:故意留空 —— 分诊的活,不是本席的。两次实测,不是推断
① 2026-08-20,卡 #10032(报告评论
5363412215,open_questionsQ1):替换串里的
$/被 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 线程):
退出码 0,磁盘没动。 抓住它的同样是标记计数,不是退出码。
⭐ 为什么这是「要修」而不是「要记住」
两次都不是同一个错法(一次写入了错的字节,一次什么都没写),共同点是:
-i家族在失败时不告诉你。而消融恰恰是这个仓用来证明「断言不是恒真」的核心器械 —— 一个静默失败的变异会让消融报出一个假绿:门禁没红,不是因为断言弱,而是因为根本没变异。两次都被抓住,靠的都是 dev 自己加的磁盘证据(计数增量 / blob 哈希),⛔ 不是靠退出码。⇒ 纪律在起作用,但它依赖每个 dev 每次都记得加那道证据。
按仓库自己的失效修法顺序 ——「先删掉容许出错的构造,再让正确形态成为唯一拼写,最后才加检查」—— 这里该走第一步:让容许静默失败的构造消失。
建议方向(⛔ 不规定实现)
一个消融替换助手,至少满足:
turbo run testtask 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 当时手写的就是这个形状)。git hash-object,⛔ 不让调用者自己记得加。git diff HEAD为空,⛔ 不靠退出码。EXIT/INT/TERM上以绝对路径复位。⛔ 没量的部分
-i家族。 本卡只举两次被记录的失败,⛔ 不主张发生率。scripts/助手?AGENTS.md字节纪律条款里一条具名陷阱?两者都要?卡 A failingturbo run testtask 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 当时给的正是这三个选项(A 加具名陷阱 / B 不管,check:nul-bytes会抓 / C 更进一步,首选锚点校验助手),并未选。本席倾向 C,因为 B 只覆盖「写坏字节」那一半 —— 今天这次perl -i什么都没写,check:nul-bytes对它完全沉默。AGENTS.md是受管面,⛔ 本席不代写、也不代 skills 席裁。验收(⛔ 不规定实现)
-i家族做消融的地方(零要有发火对照),再决定助手的形状。--self-test,且两个方向都要:锚点缺失时必须非零退出;锚点命中时必须落盘并给出前后证据。来源
turbo run testtask 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 报告open_questionsQ1(评论5363412215,2026-08-20)—— 躺了 25 天,因为那个数组没有读者(H52),本卡是那次读的产物之一。domain:devx执行席 · 座位贴 #6023Generated by Claude Code