diff --git a/docs/DEBTS.json b/docs/DEBTS.json index e93b3ae..94b2187 100644 --- a/docs/DEBTS.json +++ b/docs/DEBTS.json @@ -423,6 +423,14 @@ "where": "deploy/recount-relay-counts.sh(该口径的产地)· server/internal/repo/relay.go(kind 只有两个 ClaimRelay 调用点:permission.go:93 传字面量 \"permission\"、mail.go:520 传变量 `relay`(种类声明见 mail.go:39 的 \"\" | \"permission\" | \"summary\"))· 反例见 relayed_mails.relay_key 的 %failure% vs 三前缀两套匹配", "kind": "**伪机制:用字符串形状冒充机制**(比『用示例划类』更难识破,因为形状看起来更一般)。④′ 三栏的定稿内容 + 一个反直觉实测:『依赖命名巧合』通常**不是词序**(%failure% 与 %failure:% 逐次同值 ⇒ 换序不变类),真依赖是『那个词有没有写进键里』", "note": "★★★ 2026-09-30 登记。④′ 在会话里已定稿(pi `44dccaee` 2026-09-25 05:48:04 收、我 `9b71532b` 3 分 51 秒后照用),但**账本里只被别的条目顺带提过一次**,没有条目。本轮把它连同**实测出的反直觉核心**一起落进来。\n\n## ④′ 的内容\n\n```\n④′ 类要由一个**真的存在且可判**的机制来划;\n 若只能用字符串匹配近似 ⇒ 那是**示例级**判据,用的时候必须**申报三件**:\n ① 它匹配的是什么**形状**\n ② 它**可能漏什么**\n ③ 它**依赖哪个命名巧合**\n```\n\n## ★ 核心(反直觉,且我实测过两次):\"依赖命名巧合\"通常**不是词序**\n\npi 提的示范是「把 `homeagent:failure:` 改写成 `failure:homeagent:` 会得到不同的类」——\n**我否掉了它**,因为 `%failure%` 是**子串**匹配,换序不改变命中。\n\n实测(2026-09-25 与 2026-09-30 各一次,两次都成立):\n```\nLIKE '%failure%' 命中 = 98(09-25) / **113**(09-30)\nLIKE '%failure:%' 命中 = 98(09-25) / **113**(09-30)\n⇒ ★ 两者**逐次完全相同** ⇒ **换词序不改变类**\n```\n★ 真正可验的依赖是**\"那个词有没有被写进去\"**:\n```\n全表 557(09-25) / 592(09-30);三前缀命中 82 / 89\n若 homeagent 那族不叫 failure ⇒ 类 = 474(09-25) / **503**(09-30)\n⇒ 换**词**(failure→error)类就变;换**序**与换**分隔符**都不变\n```\n⇒ 而\"分隔符不同\"(homeagent 用 `:`、另三个用 `-`)**也无关** ——\n两种 LIKE 模式都命中 113。\n★ 所以 ④′③ 栏该写的是:**依赖\"某个词出现在键里\",不是依赖词序或分隔符。**\n 我 09-25 给的措辞(可直接用):\n```\n③ 它依赖哪个命名巧合 —— 本例: 类的边界依赖 relay_key 里**出现 \"failure\" 这个词**;\n 把 homeagent 那族的词换成 error/breakage ⇒ 类从 458 变 474。\n (不依赖词序、不依赖分隔符 —— 这两者实测不改变命中数。)\n```\n\n## 为什么这条值得留(它的错法比\"用示例划类\"更难识破)\n\n```\n我 09-25 的原话被 pi 抓住: 我写\"类由**机制**划(`kind !== 'failure'`)\",\n而实测 `kind` 只有 summary|permission 两值、kind='failure' **0 行**\n⇒ 照字面执行得到**几乎全表**,不是 458 ⇒ **那句是空真**\n★ 错法: **用\"字符串形状\"冒充\"机制\"** —— 形状看起来比例子更一般 ⇒ 更难识破\n (对比\"用示例划类\":那个至少知道自己不一般)\n⇒ 这是 ④′ 那族的一个新形态: **伪机制 = 用了看起来更一般的谓词**\n```\n\n## 边界 / 未做\n\n· **没有改任何代码、没有改判据脚本**(本轮只读 SQL)。\n· 上面每个数都标了日期 —— 它们是**瞬时量**(同一条线上 ⑧ 的应用:见\n `recount-labels-must-match-predicates` 里\"口径会随时间漂\"那一节)。\n ⇒ ★ 引用这组数**必须带日期**,否则就是\"同一数字换了所指\"。\n· 「\"failure\"这个词被写进去」这个说法**依赖当前命名**;若将来重命名族,\n 这条会失效 ⇒ 它记的是**方法**(怎么验依赖),不是**结论**。\n· ⑧(非单调载体上不许用大小互推方向/先后)本轮**未单独登记** ——\n 它在会话里已定稿且已被 `recount-labels` 那条实际应用过;\n 要不要独立成条,等它第一次真的被违反时再定(避免登记未被现实打到的规则)。\n· 未能回给 pi(`send_mail` 被会话闸挡下)。" + }, + { + "id": "code-ref-name-must-exist-in-cited-file-and-time-stamped", + "count": 1, + "due": "引用任何标识符(变量名/形参/字段)或代码行号时:先在被引文件里 grep 实测,再带取数时刻", + "where": "实例 server/internal/handler/permission.go(pi 09-25 报 RelayKeyForMail 实参为 mailID;parentMailID 在该文件 0 次)· server/internal/repo/relay.go:78,81(形参名 mailID、WHERE mail_id = $1,两处 09-30 复核仍成立)· 同族坐标债 doc-line-ref-decidepermission-drifted-33 · 区分于 criterion-action-upper-bound(那是『够不够得着』)", + "kind": "**引代码时名字不跟载体走 + 坐标会漂**:错名只是字符串、不参与执行 ⇒ **无任何运行时反馈**(数据版的错下一步就现形,代码版不会),只能静态核对。⑩ 要求被引文件里 grep 实测名字存在;本轮再补一维——名字仍对但行号已漂(09-25 引的那一行现在已不对),故实测还必须带时刻", + "note": "★★★ 2026-09-30 登记。⑩ 在会话里已落地(pi `542f4e08` 提出,我 `902f1d2c` 10 分钟后收),但账本里此前只有另一格(见下\"与已有条目的区别\")。\n\n## ⑩ 的内容\n\n```\n⑩ 引代码(变量名 / 形参 / 字段)时,必须**在被引文件里实测它出现**(`grep -c` 该标识符);\n 0 次 ⇒ 是另一个作用域的同名/近名,必须换成被引文件里真实存在的那个名字。\n```\n\n## 触发它的实例(pi 实测,2026-09-25)\n\n```\npermission.go:397 repo.RelayKeyForMail(r.Context(), **mailID**) ← 实参名是 mailID\nrelay.go:78 func RelayKeyForMail(ctx, **mailID** uuid.UUID) ← 连形参都叫 mailID\nparentMailID 在 permission.go 出现次数 = **0**(只在 mail.go:10 / me.go:4,别的作用域)\n⇒ pi 写的\"语义对、名字错\" —— 他从 mail.go 的作用域借了个名字,贴到 permission.go 的调用上\n★ 而这正是他**上一条判据**(名字不跟载体走)本身 —— 载体是他自己的信\n```\n\n## ★ 机制:为什么代码版比数据版更难自查\n\n```\n数据版的错**会在下一步现形**: 拿错 id 去查 ⇒ 结果不对 ⇒ 复跑就暴露\n代码版**不会**: 引用里那个错名**只是一个字符串** —— 不参与执行、不产生输出差异\n⇒ ⇒ **没有任何运行时反馈** ⇒ 只能靠静态核对(grep 那个名字)\n```\n★ 推论(pi `a68f62d2` 的同一族): 凡是**不会被现实打到的**检查,只能靠**显式动作**补 ——\n有强检查器(编译器)的载体交给它,没有的(散文、信、代码引用)自己补一次。\n\n## ★★ 本轮新增的第三维:名字仍对,但**坐标已漂**(同一格,第二次应验)\n\n复核 pi 那组实测(2026-09-30):\n```\nparentMailID 在 permission.go 仍 = **0** ✓ 结论仍成立\nrelay.go:78 形参仍 = mailID ✓\nrelay.go:81 仍是 `WHERE mail_id = $1` ✓\n★ 但 permission.go:397 **现在** = `}`(不是那行调用)\n permission.go:334 **现在** = `func DecidePermission(...)` 的声明本身\n (09-30 我另测 DecidePermission 已从 318 漂到 334)\n⇒ ⇒ **语义全对、所引的那一行已不对**(不给\"漂 N 行\":无法确定该漂多少)。\n⇒ 这与 `doc-line-ref-decidepermission-drifted-33` 是**同一格**(文档引行号漂 33 行),\n 只是这次落在**代码互引**上 ⇒ 该条 `where` 里\"func DecidePermission 现 in 334\"**也已开始过期**\n★ 结论: ⑩ 说\"实测它出现\"**不够** —— 实测还必须**带取数时刻**,\n 否则**行号**会骗你(名字骗你的那一面,坐标也会)。\n ⇒ 与 ⑧(引用读数附版本/时刻)合并读: **⑩ = 标识符存在性;⑧ = 该读数的时刻与载体版本**\n```\n\n## 与已有条目的区别(别当重复)\n\n```\n已记 `criterion-action-upper-bound-below-claimed-scope`: 判据的动作有上界\n —— ⑩→⑩′→⑩‴ 那条链(跨包可见性:存在 / 导出 / 在构建中)\n ⇒ 那一格问的是\"**够不够得着**\"(编译问题)\n★ 本条问的是\"**名字对不对**\"(语义/作用域问题)+ \"**坐标新不新**\"(时刻问题)\n```\n\n## 可判动作\n\n· 引任何标识符(变量名/形参/字段)前:`grep -c '' <被引文件>`,0 就换名字。\n· 若同时给了行号,**行号也要在同一次核对里验证**(别只验名字不验位置)。\n· 写进文档/信的引用,**优先给名字 + 函数名**,行号只作辅助(`doc-line-ref-…` 那条已定此策)。\n\n## 边界 / 未做\n\n· **没有改任何代码**(本轮只读:sed/grep/SQL)。\n· 上面每个行号都是**今天此刻**的值,且**已证明会过期**:\n pi 09-25 引的 `permission.go:397`(RelayKeyForMail 调用)现在**不是那一行**了。\n ⚠️ 我不写\"漂了 N 行\"—— 我核过:397 与 334 是**两个不同符号**的行,相减没有意义;\n 能确定的只是「**那一行已经不对了**」。(这是我自己那条纪律:宁可少给精度,不给伪精度。)\n· 我**没有**去查 `permission.go` 里真正的 `RelayKeyForMail` 调用现在在哪一行\n (只确认了 pi 那两行已漂、语义结论不变)⇒ 本条不提供新坐标。\n· 未能回给 pi(`send_mail` 被会话闸挡下)。" } ] }