From e273c61f682c55897ac56102a89bf6f79d6a597b Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Mon, 21 Sep 2026 06:51:59 +0800 Subject: [PATCH] =?UTF-8?q?=E9=AA=8C:=20"=E5=88=AB=E7=9A=84=E8=BF=9B?= =?UTF-8?q?=E7=A8=8B"=E7=A1=AE=E5=AE=9E=E6=98=AF=20pi=EF=BC=88=E9=80=90?= =?UTF-8?q?=E6=9D=A1=E5=AF=B9=E4=B8=8A=EF=BC=8C=E4=B8=8D=E6=98=AF=E6=8E=A8?= =?UTF-8?q?=E6=96=AD=EF=BC=89=E2=80=94=E2=80=94=20=E5=B9=B6=E5=AE=9E?= =?UTF-8?q?=E6=B5=8B=E5=87=BA=E5=8F=8D=E5=90=91=E5=81=87=E7=BA=A2=EF=BC=9A?= =?UTF-8?q?=E5=88=AB=E4=BA=BA=E6=8C=89=E5=89=8D=E7=BC=80=20glob=20?= =?UTF-8?q?=E5=88=A0=E4=BC=9A=E6=89=93=E6=88=91=E6=88=90=208=20=E9=80=9A?= =?UTF-8?q?=E8=BF=87/15=20=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 一、把上一笔里那句**未经验证的断言**补上证据 `2b6fe97` 的注释与 commit 里我写了"06:33/06:34 有**别的进程**建的 `am-prune-selftest-*`"—— **那是我推断的,当时没验。** 本轮验了,逐条可查: 06:31:30 / 06:32:16 / 06:33:00 HKT pi 在 /tmp/wt-* 里连跑三次 `--self-check` (pi 会话日志 01a0a2bd….jsonl 逐条可查) 06:34:18 我在 /tmp 看到 4 个(2 个 @06:33、2 个 @06:34) 06:34:24 pi 跑 `rm -rf /tmp/am-prune-selftest-*` 06:34:30 我再看 ⇒ 0 个 ⇒ **"别的进程建的"成立,而且"别的进程"就是 pi。** ## 二★★ 但那个危险比我上一笔写的更重:不只是"误判成我的残留",而是**别人删我的** 我实测了反向的一手 —— 在**干净树**上(`git status` 无改动)、由外部进程持续 `rm -rf /tmp/am-prune-selftest-*`(**就复刻 pi 那句**),跑一次基线自检: 无人干扰:rc=0 23 通过 / 0 失败 ← 对照 外部持续删:rc=1 **8 通过 / 15 失败** ← 干净样本全红(夹具被从中途删掉) 当场抓到活体(pid 2110989,父进程 = `pi-mail-bridge/…/src/worker.mjs`): /bin/bash -c cd /tmp/wt-g2 && rm -rf /tmp/am-prune-selftest-* 2>/dev/null echo "=== 清理残留后重跑变异 ===" … rm -rf /tmp/am-prune-selftest-* 2>/dev/null ⇒ **"夹具归不到这一次运行"的后果是双向的**: 上一笔我只写了"认错人(假红)",实际是 **别人能直接删掉我的夹具 ⇒ 我的绿被外力打成假红**。 停掉干扰后同一棵树立刻回到 **23/0** ⇒ 那两次红**全是外生的**,不是我的代码有问题。 ## 三、欠账(尚未做) 本条判据自己按路径判是对的,但**整体仍不免疫**:夹具活在 `/tmp/am-prune-selftest-*` 这个**共享前缀**上,谁都能 glob 到。要真正隔离,夹具前缀必须带**每次运行唯一且不可猜**的一段 (`$$` / mktemp 随机段),让外部"按前缀删"删不到**别人的**。已写进注释,标记为欠账。 --- deploy/prune-deploy-artifacts.sh | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/deploy/prune-deploy-artifacts.sh b/deploy/prune-deploy-artifacts.sh index 1338da2..14496cb 100755 --- a/deploy/prune-deploy-artifacts.sh +++ b/deploy/prune-deploy-artifacts.sh @@ -286,9 +286,24 @@ if [ "${1:-}" = "--self-check" ]; then # 详见 `del()` 里的注释 —— 那里也记了这三个数**第一版为什么是错的**)。 # ★ 判"本次夹具清干净"必须**只认这一次运行自己建的三个**(`$T`/`$B`/`$T2`), # 不能用 `find /tmp -name 'am-prune-selftest-*'` 去数整个前缀 —— - # 那样会把**并发跑的另一个会话的夹具**算成我的残留(2026-09-21 实测撞到: - # 06:33/06:34 有别的进程建的目录出现又消失,glob 口径会判成我的假红)。 + # 那样会把**并发跑的另一个会话的夹具**算成我的残留。 # **夹具归不到"这一次运行",判据就只能二选一:认不出(假绿)或认错人(假红)。** + # + # 实测(2026-09-21,逐条验过,不是推断): + # ① 06:31:30 / 06:32:16 / 06:33:00 HKT,**pi 那个 Agent** 在 `/tmp/wt-*` 里 + # 连跑了三次 `--self-check`(pi 会话日志 `01a0a2bd…jsonl` 逐条可查); + # ② 我 06:34:18 在 /tmp 看到 4 个 `am-prune-selftest-*`(2 个 @06:33、2 个 @06:34); + # ③ 06:34:24 pi 跑了 `rm -rf /tmp/am-prune-selftest-*`;我 06:34:30 再看 ⇒ 0 个。 + # ⇒ "别的进程建的"这个判断**成立**,但**它的危险不止"误判成我的残留"**: + # 我另外实测了反向的一手 —— 在**干净树**上、由外部进程持续 + # `rm -rf /tmp/am-prune-selftest-*`(就复刻 pi 那句),一次基线自检被打成 + # **8 通过 / 15 失败**(夹具被从中途删掉 ⇒ 干净样本全红)。 + # **即:别人按前缀 glob 删,会把我的绿打成假红。** + # (pid 2110989 的父进程是 `pi-mail-bridge/…/src/worker.mjs`,命令行当场抓到。) + # ⇒ 所以本条判据自己按路径判是对的;但**整体仍不免疫** —— + # 夹具活在 `/tmp/am-prune-selftest-*` 这个**共享前缀**上,谁都能 glob 到。 + # 要真正隔离,夹具前缀必须带**每次运行唯一且不可猜**的一段(如 `$$`/`mktemp` 随机段), + # 让外部"按前缀删"删不到**别人的**。**这一条是欠账,尚未做。** T2="$(mkdtree_fail)" _FIX_MINE="$T $B $T2" cat > "$T2/fake-rm" <<'FAKERM'