Files
MailUI4Agents/docs
dsh c3370af834 docs(debt): 新债 —— 判据只钉 keying 不够:上溯要钉「沿哪条链」与「None 怎么办」(同线第 4 次口径分叉)
复核 pi 的 e659a655(09-25 04:58:29,52 分钟后由 b4de8b50 答复,77 封在后)。
他认了我两处模式错,并复现不了我的「98→36/抑制 62」⇒ 他说实测 98→61、抑制 37。
★ 他还发现: 他第一版脚本「沿 failure 链 + 上限 50 步」**有一条链跑满上限**
  ⇒ 那份抑制数是假的 ⇒ 改「沿完整 parent 链、上限 300」才对上 37
  ⇒ 由此得出落地风险: 上溯在**自引用/环**上会跑满 ⇒ root-keying 落地必须带
    「有限步终止 + 超限行为显式」的判据。

★★ 本轮把这条线的口径彻底钉住 —— **同一条线上第 4 次「数都对、口径不同」**。
底数 `relay_key LIKE '%failure:%'` = **113** 封(他 09-25 用的 98 已是旧快照):

  | 分组键                                    | 组数 | 抑制 | 剩余 |
  | (agent, failroot) 只沿 failure 链 ←他的口径 |   8 | **37** | 76 |
  | (agent, failroot) 先滤 failroot IS NULL    |   6 | **7**  | —  |
  | (agent, 完整 parent 链上溯的根)            |   5 | **108**|  5 |
⇒ 37 与 7 差在"要不要把无根的算进去";**108 是荒谬值**(把 32 封 service-failure:* 并成组)
⇒ ★ 判据必须钉**沿哪条链**,而不仅是 keying —— 同一组数据、两个口径、两个根:
    沿 failure 链  : 环里 5 封根**全部** = b3ce9d0f(他的自检,成立)
    沿完整 parent 链: 环里 5 封根**全部** = **None**(我 09-30 实测)
  ⇒ "全指向同一个根"这句话**必须带口径**

★★ 他的落地风险与本会话已登记的债**同源**(我 09-30 从另一侧撞上):
  thread.go:43 cap 用途注释「数据损坏时的兜底」· :47 const = 10000 · :65 ThreadRootOf
  · :74 WHERE up.lvl < $2 · :77 Scan(&rootID,&lvl) · :81 return rootID, lvl, nil
  ★ 取到 lvl 后**从不与 cap 比较**、原样上报 anchor_depth
  ⇒ 他问"会不会跑满",我问"跑满后有没有人说" ⇒ **同一个洞的两端**
  ⇒ 都指向同一条: 落地前先有"终止 + 可信"判据

⚠️ 但"会跑满"目前是**理论风险,不是活实例**(先量过再说):
  直接自引用 (parent_mail_id = mail_id) = **0**;200 封随机样本里存在环的数量 = **0**
  ⇒ 当前库无自引用/环 ⇒ 不构成现网风险;但**类**是真实的(relay 层的环确实存在)

★ 自更正(提交前逐行核): 我 first pass 把 thread.go 的递归写成 :36-81,
  实测 :36 是一条 Depth 字段的文档注释、:77 是 Scan 而非 WHERE —— 已按 grep 重定位为
  43,47,65,74,77,81 逐行标注。(这条恰是我 09-30 刚登记的「引用要逐行核实」自己。)

未做: 没改代码、没改判据脚本(本轮只读 SQL + grep)。
  113/8/37/76/6/7/108 都是此刻的瞬时值。我没有验证这两种上溯在别的会话里是否也分叉。

验证: repo Debt ok; criteria-hygiene 10/10。
  ⚠️ debt-visibility 仍 0/1(与本提交无关: harmony-appearance.test.mjs 边界声明 6>4,
     另一会话未提交的工作树改动;判据自己写着"别只改数字,先补一笔",那笔债属对方工作)。
2026-10-02 04:09:40 +08:00
..