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'