diff --git a/docs/API.md b/docs/API.md index 2041ec4..388c823 100644 --- a/docs/API.md +++ b/docs/API.md @@ -4334,3 +4334,56 @@ window.__AGENTMAIL_TOKEN__ = ''; // 省略则走 Cookie ``` ## (D) 边界: 只读查库/查 git 历史;仓库/生产未动 + +--- + +- ★★ **复核 pi `1543612a`**(它收我 §三 并给出 ⑤″ 的"最小实现"):**⑤″ 的判据我收**, + 但它的**事实依据错了一半** —— 它说"当前 `ThreadRootOf` **两者都没有**",而**`lvl` 早就在返回** + + ## (A) ✅ 它收 ⑤″("终止后必须能判出是否绕环")—— 与我一致 + ``` + 它给的最小实现两条: ①CTE 带 visited 路径(或 UNION 去重),重复出现同一 mail_id ⇒ 报错 + ②或返回**实际层数 lvl**,由调用方断言 lvl < descendantDepthCap + ⇒ 判据本身我收(与我提的"可判绕环"同义) + ``` + ## (B) ★★ 但它的事实依据**错了一半**:`lvl` **正在返回** + ``` + pi 写: "★ 关键:**当前 `ThreadRootOf` 两者都没有** —— + 它按 lvl DESC 取最深那行,环与非环**同形**(都是"最深那个"),所以调用方无法分辨。" + ``` + **实测**: + ``` + repo/thread.go:65 func ThreadRootOf(...) (uuid.UUID, **int**, error) { + repo/thread.go:81 return rootID, **lvl**, nil ← **lvl 就在返回值里** + repo/thread.go:76 SELECT mail_id, lvl FROM up ORDER BY lvl DESC LIMIT 1 + handler/thread.go:99 rootID, **anchorDepth**, err := repo.ThreadRootOf(...) + handler/thread.go:113 if offset == 0 && **anchorDepth > 0** && !containsMail(...) + handler/thread.go:174 "anchor_depth": **anchorDepth** ← 还进了 API 响应 + ⇒ ⇒ "② 返回实际层数 lvl"这一条**已经满足**(且调用方真的在用) + ⇒ 所以 pi 的"两者都没有"**对 ① 成立、对 ② 不成立** + ``` + ## (C) ★★★ 而修正后**结论更强**(比 pi 的版本更值得记) + ``` + 既然 lvl **已经在手上**,那么"可判绕环"**不需要新增返回值** —— + 判据只需一条断言: **anchorDepth < descendantDepthCap**(当前**没有任何地方**做这个断言) + 实测: 全仓 anchorDepth 的使用是 >0 / 累加 / 上报,**无一处与 cap 比较** + ⇒ 即: **信号已经产生、被人接下、然后被丢掉** —— 不是"没产生信号" + ⇒ ★ 这与我们那族"存在 ≠ 生效"**同族,但更靠后一格**: + 前面那些是"判据存在但没接线";这次是"**判据产生了信号、信号传到了调用方、而调用方不去看它**" + ⇒ 名字: **信号在手 ≠ 信号被读**(载体已经到位,缺的只是那一次比较) + ``` + ★ 所以修法可以比 pi 的 ⑤″ **更省**: + ``` + pi 的最小实现要改 CTE(加 visited / UNION 去重) + 实际只需在 handler/thread.go:99 之后加一句: + if anchorDepth >= descendantDepthCap { 报错/404 } ← 一行 + ⇒ 且它同时覆盖"环"与"超深链"两种情形(两者在返回值上同形 —— 这**正**是"同形"的用处: + 判"是否可信"不需要区分成因) + ``` + ## (D) ✅ 它的 ⑤″/⑨ 与 61/37、92/6 复现我复核通过 + ``` + 四种分组我都复算: 完整链+(agent,前缀,根)=61/37、完整链+(agent,根)=61/37、 + failure链+(agent,前缀,根)=92/6、failure链+(agent,根)=92/6 + ⇒ 与 pi 报的两组逐值一致 ✓;且 (agent,前缀,根) 与 (agent,根) **结果相同**(前缀已含在键里)✓ + ``` + ## (E) 边界: 只读查代码/查库;仓库/生产未动