docs(debt): 新登记 prune-artifact-evidence-decays-with-reboot —— ★ 物证①的**前提已失效**(/tmp 是 tmpfs,重启即全失)

① 复核 pi `c6dbc8d0` §三: 他的加强物证**当时是对的且测法扎实** ——
   prune 的 `.backup` 在删除前**无条件**执行(:95)、路径**字面硬编码** `/tmp`、不做 env 覆盖;
   且他用「争议窗口 ±1h 内**有 21 个别的文件存活**」钉住「不是被清掉了」这个前提 ✓

② ★★★ 但我在 2026-09-27 04:10 复测,那个前提**已经不成立**:
     早于 09-26 09:32 的 /tmp 文件 = **0 个**、争议窗口(04:00–06:30)内也是 **0 个**
     而 `tmpfiles.d/tmp.conf:11` = `q /tmp 1777 root root 10d` ⇒ **1 天内不该被清**
     ⇒ 唯一解释: **/tmp 经历过清空/重启**; 且 `findmnt /tmp` ⇒ **tmpfs**
     ⇒ ★★ **重启即全失**,与 10d 策略无关、**不可恢复**
   ⇒ 所以「现在 0 个备份」**此刻已不能**推出「09-26 04:57 那会儿没跑过 --apply」

③ ★ 定稿已就地降级(`docs/API.md` 第(E)节该条划删除线 + 写明):
     · `reset-demo` **可排除** —— 凭物证②(`/opt/agentmail/backups/`,**非 tmpfs** ⇒ 跨重启存活,
       0 文件 + mtime 停在 09-14 17:26)✓ **不受影响**
     · `prune` 的"未跑过"**只在 2026-09-26 04:10 之前**(当次会话内)成立; 此后**需重新取证**
   ⇒ 即"三条腿"里最强的那条**已过期**,剩下的②③是"本机默认路径/默认库"

④ ★★ 可判形状(登记为 `prune-artifact-evidence-decays-with-reboot`,余额 31→32):
   凡以「缺失的产物」为物证,**必须同时记录**三项,缺一即降级:
     ① 该路径会不会被自动清理(tmpfs / tmpfiles / logrotate / 手工 rmtree)
     ② 「不是被清掉了」的**同时段旁证** —— 须**取证当时**记,**事后不可补**
     ③ 取证时刻 —— ①②③ **都会过期**
   ⇒ 与已记的「口径会随时间漂」(`recount-labels-must-match-predicates` 补记)同族:
     那条是**数字**会过期,这条是**物证**会过期。
   ⇒ ★ 由此得一条**该做而没做**的: 物证会过期 ⇒ **结论就该带时刻**。
     我们此前把「prune 没跑过」写成**无时刻的现在时** ⇒ 本次纠正这个写法。

校验: go test ./internal/repo/ -run Debt -count=1 ⇒ ok; 围栏 1692 配平; 未改产品代码
This commit is contained in:
2026-09-27 04:11:38 +08:00
parent 3f1abbf0c4
commit 2b8eeae3a6
2 changed files with 28 additions and 2 deletions

View File

@ -7875,14 +7875,32 @@ window.__AGENTMAIL_TOKEN__ = '<user_key>'; // 省略则走 Cookie
```
· **确定**: −3 有**至少一个**自洽解释(在飞占位释放)⇒ "缺口已有一个可行解释"(**不是唯一解释**)
· **确定**: `reset-demo` **可排除**(硬排除,不依赖单调性);`prune` **不能**用计数/单调性排除
· **确定(pi 的物证)**: `prune --apply` 与 `reset-demo` **都未跑过** —— 凭**谓词无关的产物**
· ~~**确定(pi 的物证)**: `prune --apply` 与 `reset-demo` **都未跑过** —— 凭**谓词无关的产物**~~
⚠️ ★★★ **2026-09-27 04:10 复测: 这条的**物证① 已失效**,整条要降级**
(/tmp 无 pre-prune 备份 + backups 目录 0 文件且 mtime 未动)
⚠️ ★★ **强度须限定**(2026-09-27 补: 本文别处已写这个限定、此处漏了 ⇒ 同文件口径不一):
产物是**本机**的 ⇒ 它排除的是「**本机**任何 `--apply`(不论谓词、不论库)」,
**不是**「任何机器上都没跑过」—— 后者无任何证据。
物证② 还要再限一层: `PREFIX` **与** `DB` 都可被 env 改
⇒ 它只覆盖「**默认 prefix + 默认库**」,不是"前缀无关/库无关"。
⇒ ★ 三条腿的真强度: 物证① **本机**谓词无关 > 物证② **本机**默认路径 > 「库非空」默认路径
⚠️ ★★★ **且物证① 有一个会自己消失的前提**(新增,本轮实测发现):
它成立需要「**该时段 /tmp 未被清空**」。pi `c6dbc8d0` 当时正是用
「争议窗口 ±1h 内**有 21 个别的文件存活**」钉这个前提 —— **那一步很扎实**。
★★ 但我 2026-09-27 04:10 重测: 早于 09-26 09:32 的 /tmp 文件 = **0 个**、
争议窗口(04:00–06:30)内也是 **0 个**;而 `tmpfiles.d/tmp.conf:11`
是 `q /tmp ... 10d`(**1 天内不该被清**)⇒ 唯一解释是 **`/tmp` 经历过清空/重启**。
且 `findmnt /tmp` ⇒ **tmpfs** ⇒ ★★ **重启即全失**,与 10d 策略无关、**不可恢复**。
⇒ 所以「现在 0 个备份」**此刻已不能**推出「09-26 04:57 那会儿没跑过 --apply」。
⇒ ★ 修正后的表述(按强度,且**带时刻**):
· `reset-demo` **可排除** —— 凭物证②(`/opt/agentmail/backups/`,**非 tmpfs** ⇒ 跨重启存活,
0 文件 + mtime 停在 09-14 17:26)✓ **这条不受影响**
· `prune` 的"未跑过"**只在 2026-09-26 04:10 之前**(当次会话内)成立;
此后**需重新取证**,不能沿用
⇒ ★ 教训: 「缺失的产物」当物证时,**必须同时记录** ① 该路径会不会被自动清理
(tmpfs / tmpfiles / logrotate)②"不是被清掉了"的**同时段旁证**(须**取证当时**记,事后不可补)
③ 取证时刻 —— ①②③ **都会过期**。已登记 `prune-artifact-evidence-decays-with-reboot`。
⇒ ★ 三条腿的真强度: 物证① **本机**谓词无关(**且已过期**)> 物证② **本机**默认路径(非 tmpfs,仍有效)
> 「库非空」默认路径
—— ⚠️ 这条排序是**我此刻据三条腿的覆盖面**推出来的,**不是**我早先写过的原话
(我查了提交史: 找不到我把②③写成"与①同强"的记录 ⇒ **不据此追认我有过那个错**)
· **仍不确定**: T1 的真实 bound/total(**无人观测**;pi 改判 bound(T1) ∈ [556, 559] 区间)