diff --git a/docs/DEBTS.json b/docs/DEBTS.json index 38e55bc..e93b3ae 100644 --- a/docs/DEBTS.json +++ b/docs/DEBTS.json @@ -415,6 +415,14 @@ "where": "docs/HARMONY-ALIGN-PLAN.md:225(引 permission.go:301,实为响应体字段;func DecidePermission 现 in 334)· 已修的同族样本 server/internal/handler/permission_relay_release_test.go:32-37(a67c8a3)· 同形状命中 6 处、其中 1 处为已修样本 ⇒ 待查 5 处:sse/manager.go:115、docs/reviews/harmony-client-review.md:101、docs/API.md:4147、docs/API.md:4490", "kind": "**行号引用漂到无关代码**:文档声称 `permission.go:301` 是 DecidePermission,实际 301 是 permission_request 响应体字段,函数已在 334(从 09-25 的 318 又漂 16 行,累计 33 行)。pi 那格『引用带唯一标识、行号只作辅助』已在一处落实(a67c8a3),这处未落实——且 09-25 我推迟它的理由(『另一个 writer 的决定』)经查已不成立(文件干净)", "note": "★★★ 2026-09-30 登记。**pi `f74da994`(2026-09-25 04:59:03)那格记法已经落了一处(`a67c8a3`),但另一处至今没落、且已漂得更远。**\n\n## 那格记法(pi 提出,我 09-25 认领并落了一处)\n\n```\n引用代码位置时**同时给唯一标识**(函数名 / `relay_key` 字面量 / 块首注释),\n**行号只作辅助** —— 同族:「判身份用唯一键,不用位置」。\n★ 已落实的一处: server/internal/handler/permission.go 的注释从 `permission.go:112`\n 改成「函数名 `RequestPermission` + 错误字符串 `Invalid session_id`」,行号删掉。\n 理由**已写进注释**(在 server/internal/handler/permission_relay_release_test.go:32-37),\n 连\"112 行现在是本注释的上游注释文本\"都实测记录了 ⇒ 防下一个人补回行号 ✓\n```\n\n## ★ 缺口:docs/HARMONY-ALIGN-PLAN.md:225 仍用裸行号,且已漂 33 行\n\n```\n文档写: (`server/internal/handler/permission.go:301`) ← 声称是 DecidePermission\n现在 301 行实际是: `\"subject\": mailSubjectFor(kind, req.Question),`(逐行实测;相邻行是 mail_type/role 那组字段)\n (构造 permission_request 响应体的一组字段,**与 DecidePermission 无关**)\n`func DecidePermission` 现在在 **334** 行\n⇒ 漂移轨迹: e07e3bf 时 301≈该函数文档注释(302 是函数体)\n 2026-09-25 我测得 318(漂 17 行)\n **今天 334(漂 33 行)** ⇒ 期间又漂了 16 行\n⇒ ★ 与我 09-25 记的\"同类、不同严重度\"相比又进一层:\n 当时 301 落在**同文件另一个函数体内**(还能说\"就是这文件里 DecidePermission 那块附近\"),\n 现在 301 落在**一个与该函数无关的响应体构造**上 ⇒ 已不是\"漂移\"、是**指向了别的东西**\n```\n\n## 为什么\"越界检查\"这类弱判据抓不到(我 09-25 已实测,本轮沿用)\n\n```\n112 <= 478(permission.go 行数)⇒ 在界内 301 <= 478 ⇒ 在界内\n⇒ ★ 弱形式判据(行号在不在文件范围内)**一次都抓不到**:\n 行号还在,只是**指向了别的符号** ⇒ 只有\"唯一标识 + 编译/实测\"能判\n```\n\n## 09-25 我为什么没改它(以及现在那个理由还成立吗)\n\n```\n我当时写: \"未改它 —— 那是另一个 writer 的文档,是否改成唯一标识由那条线定\"\n⇒ 本轮核: `git status --porcelain docs/HARMONY-ALIGN-PLAN.md` = **干净**(无人在改)\n⇒ 所以\"等那条线定\"这个理由**已不成立**,剩下的只是没做。\n⇒ ★ 这一条本身是那格记法的**自反例**: 我用\"位置/归属\"当理由推迟了\"改成唯一标识\"这件事,\n 而那正是我认领的规矩。\n```\n\n## 可判动作\n\n· 把 `permission.go:301` 改成 **`DecidePermission`(函数名)**,行号要么删、要么写成辅助\n (形如 `func DecidePermission` 在 permission.go 内,行号仅供定位)。\n· 若要全仓一致:`grep -rn \"permission\\.go:[0-9]\"` 现在命中 **6 处**,其中\n `permission_relay_release_test.go:32` 是 **a67c8a3 的已修样本**(它**故意**引用 112\n 来讲\"同一提交内自失效\"这件事,**不是**待改项)⇒ 真正的待查是 **5 处**:\n `sse/manager.go:115`、`docs/reviews/harmony-client-review.md:101`、\n `docs/HARMONY-ALIGN-PLAN.md:225`、`docs/API.md:4147`、`docs/API.md:4490`\n —— 每处都要判\"它指的是不是它声称的那个符号\",而不是一律替换。\n· ⚠️ `docs/API.md` 与 `docs/reviews/*` 也是并发写入的文件,改前须确认无人同时在改。\n\n## 边界 / 未做\n\n· **没有改任何文件**(本轮只读:sed/grep/git status)。\n· 漂移 33 行是**今天此刻**的值;它是瞬时量,不是断言。\n· 我没有逐一核那 5 处是否**真的指错**(只核了 HARMONY-ALIGN-PLAN.md:225 这一处,\n 因为它是 09-25 我亲手记下\"已核实为错\"的那一处)。\n ⇒ 其余 4 处**可能对可能错**,未核 ⇒ 上面\"全仓一致\"那条是待办清单,不是结论。\n· 未能回给 pi(`send_mail` 被会话闸挡下)。" + }, + { + "id": "class-boundary-needs-real-mechanism-not-string-shape", + "count": 1, + "due": "任何人用字符串/形状谓词划一个『类』(统计口径、筛选条件、判据范围)时:先判它背后有没有真机制;没有就按 ④′ 申报形状 + 漏面 + 命名巧合", + "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` 被会话闸挡下)。" } ] }