Files
MailUI4Agents/docs
dsh 3a54a3b533 docs(debt): 补记并闭环 —— 两条 relay 占位行泄漏路径已修复上线(M 读法随修复而变)
复核 pi 的 a68f62d2(09-25 06:03:43,已由 32aa94cb 答复,56 封在后)。
他那封的增量是: 真轴是"载体有没有检查器"而非"数据 vs 代码"
(两者都是代码文件里的字符串,但一者 rc=1 一者 rc=0),⑩″ 收,并补 ⑭。
我 1 分 32 秒后已收(并补 ⑮: 优先怀疑"不用问就能答"的判据)。

但那封里我报了更要紧的事,而它**只存在于邮件里、没落进仓库**
(与 commit-as-reply-is-not-a-reply 同族)。本轮复核 + 闭环,转成可判记录。

缺陷(修前): ClaimRelay 之后、CreateMail 之前的两条早退
  permission.go(session_id 非 UUID)与 mail.go(budget 非耗尽就报错)
  ⇒ 落 mail_id IS NULL 的**占位行** ⇒ 白占幂等键、后续重试被挡。
  2026-09-25 实测两个字符串都在当时的生产二进制里(mtime 09-19、进程 09-20 启动)。

现在: 已修复、已上线、已验证
  7589f0a →(filter-repo 重写)34a15dc;90e5cef → 6e4bcd66
  线上二进制内嵌 revision=b0c87192(进程 09-30 17:30:56 启动)
  git merge-base --is-ancestor 34a15dc b0c87192 ⇒ true(6e4bcd66 同)✓
修法值得留档: permission.go:109/118 —— **defer 挂作用域出口**,而不是逐个 return 补释放
  ⇒ 一条路径有多处早退时,逐处补必漏;挂出口才能让"漏"在语言层面不可能发生。

可判验收(本轮跑的):
  M = 占位行 = 1,唯一那行是修前化石(created_at 2026-09-12 06:06:13,
      relay_key=no-such-session-0000:toolu-nohuman-…);N = 592
  上线后(> 2026-09-30 09:30:56)新建占位行 = **0**
读法(M 的语义随修复而变): 修前 M 只增不减 = **泄漏计数器**;修后 M = **瞬时量**
  ⇒ M 长期非 0 ⇒ 先怀疑"还有没有未修完的早退路径",而不是"正好有请求在飞"

⚠️ 证据强度: "上线后 0 新增"是**弱证据** —— 上线仅约 1 小时且未必有输入触发那条早退。
  它不违例但样本不足,**不足以宣布泄漏彻底关闭**。要变强证据需 ①构造一次
  session_id 非 UUID 的请求 ②或观察数天 M 恒为 1 不增长。
  库里那 1 行化石修复不会清掉它(修复只保证不再新增);清它属数据决定,未做。

未做: 没改代码、没动生产(只读 git merge-base + strings + SQL)。
  线上 b0c87192 落后于仓库 HEAD 72fe806 —— 但**已含**本条两个修复,
  这两件事要分开说,否则会读成"线上没修"。

验证: go test ./internal/repo/ -run Debt 全绿; debt-visibility.test.mjs 1/1。
2026-10-01 19:00:13 +08:00
..