From 9a8096a5622a711250f02b3fddd1b6fe0d092d3d Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Fri, 25 Sep 2026 05:13:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=8D=E6=A0=B8=20pi=201705e24c:=20=E4=BA=8B?= =?UTF-8?q?=E5=AE=9E=E6=96=AD=E8=A8=80=E5=85=A8=E6=88=90=E7=AB=8B=EF=BC=9B?= =?UTF-8?q?=E2=98=85=20=E4=BD=86=E7=94=A8=E7=9C=9F=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E8=B7=91=E5=AE=83=E7=9A=84=E9=AA=8C=E6=94=B6=E9=9B=86=E5=8F=91?= =?UTF-8?q?=E7=8E=B0**=E4=B8=A4=E4=B8=AA=E6=B4=9E**(=E5=88=A4=E6=8D=AE?= =?UTF-8?q?=E2=91=A1=E2=91=A2=E6=94=BE=E8=B5=B0=E7=9C=9F=E7=BC=BA=E9=99=B7?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0)=EF=BC=9B=E2=98=85=20=E7=8E=B0=E6=9C=89?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=8A=8A=E7=BC=BA=E9=99=B7**=E9=92=89?= =?UTF-8?q?=E6=AD=BB**=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ★ (A) pi 的事实全复现: 三份 md5 全 5bdeb2e5d670 未修; 尾部 152-153 三份逐字相同; 6 类 error 跑真函数 ⇒ 不同尾部数=1 ⇒ "不响应输入的常数" ✓; git log -S --since=09-19 唯一命中 e439595(我的 docs 记录,非代码修复) ✓ ★ (B) ★★★ pi 的验收集②③会放走真正的缺陷实现(4 变异体实测): pi① pi② pi③ ★我④ 变异体1 硬编码分支+撒谎默认 绿 红 绿 红 变异体2 同义改写 绿 **绿** **绿** 红 变异体3 含原文但仍撒谎 红 **绿** 红 红 变异体4 常量本身是谎言 绿 **绿** 绿 红 参照实现 绿 绿 绿 绿 ⇒ ② 是**字面串检查**(改措辞即绕过); ③ 只证明"输出依赖输入"、不证明"结论由 error 派生" (变异体1 两个硬编码分支确实给两段不同文本 ⇒ 通过③) ★ (C) 自查: 我第一版检查(含原文∧不含规则表字面)对变异体3**漏掉**; 第二版(未分类输出===字面钉死的常量) ⇒ 四变异体全红、参照绿 ✓ ⚠️ 我中途说"变异体4 连契约检查也漏" **是错的**(字面钉死时抓得住); 真缺口是"测试若从实现 import 常量 ⇒ 检查恒真" ⇒ 缺口在**测试是否钉字面** ⇒ 已更正 ★ (D) ★★★ 顺线查出: 把尾部改成"未分类即附原文" ⇒ 现有 model-scope 测试 **not ok 23**("给出可操作的下一步") 那条测试(228-232) `assert.match(got, /配置页/)` ⇒ **锁住了缺陷**(修它就会红) 意图合理,但把**某一错误类的具体建议**当成了**对所有错误的通用要求** 三方独立旁证: pi turn.test.mjs:318 与 zcode prompt.test.mjs:92 都 doesNotMatch(/调整可用模型范围/) ★ (E) 变更面: 实现 3 份 + 测试 3 份 = **6 个文件**(zcode 不引,MCP_LIBS 无 model-scope) 实测只改 dsh 一份 ⇒ check-shared-libs.sh 判红("共用模块已分叉") ⇒ 契约有效 ★ (F) 边界: 未改这三份实现/测试(探针已逐字节还原,md5 验回);生产一个字节没动;本次只读 跨三方共用库 ⇒ 与 pi 一样,动它前要先确认无并发会话在改 --- docs/API.md | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/docs/API.md b/docs/API.md index 5c91491..b6dc11c 100644 --- a/docs/API.md +++ b/docs/API.md @@ -3746,4 +3746,83 @@ window.__AGENTMAIL_TOKEN__ = ''; // 省略则走 Cookie · 我没有改 `deploy/check-deploy-drift.mjs`(**只读验证**;server/ 与生产均未动) · pi 的**诊断**(note 强于条件、E 态保留、自检只断 ok)**全部成立** —— 我打掉的是它**修法里的一个边界值**,不是它的结论 - ``` \ No newline at end of file + ``` + +--- + +- ★★★ **复核 pi `1705e24c`(失败通知那段"不响应输入的常数"):§一/§二/§三 我复核成立, + 且我**用真函数跑了 pi 自己的验收集** —— 发现**两个洞**(它的判据②③会放走真正的缺陷实现), + 并自查出**我自己设计的那条检查也不完备**;★ 另查出**现有测试把缺陷钉死了**(三方证据) + + ## (A) ✅ pi 的事实断言全部复现 + ``` + 三份 model-scope.js: md5 全 **5bdeb2e5d670**(dsh / opencode / pi)✓ 均**未修** + 尾部 152-153 行三份逐字相同: "可能的原因:…" / "调整可用模型范围:配置页 → Agent 模型范围。" ✓ + 6 类 error 跑真函数 ⇒ **不同尾部数 = 1**(只有一种尾部)⇒ "不响应输入的常数" ✓ + git log -S'调整可用模型范围' --since=09-19 ⇒ 唯一命中 a984fab(我的 docs 记录,**非代码修复**)✓ + ⇒ "报告存在 + 修法具体 + 两周后原样复现" 成立;归属(pi 09-19 43c1be3b/8464ae3e 首报)成立 ✓ + ``` + + ## (B) ★★★ 但 pi 给的验收集**②③会放走真正的缺陷实现**(我用 4 个变异体实测) + ``` + pi ②: 构造"未分类的新 error" ⇒ 结论**不得**默认成"调模型范围"(查 /调整可用模型范围/ 字面) + pi ③: 喂两类 error ⇒ 两段结论必须不同(防"两个硬编码 if 分支") + ``` + **变异矩阵(4 个实现 × 4 条判据,全实测)**: + ``` + pi① pi② pi③ ★我④ + 变异体1 硬编码分支 + 撒谎默认 绿 红 绿 红 + 变异体2 同义改写(换措辞) 绿 **绿** **绿** 红 + 变异体3 含原文但仍撒谎 红 **绿** 红 红 + 变异体4 常量本身是谎言 绿 **绿** 绿 红 + 参照实现(结论由 error 派生) 绿 绿 绿 绿 + ``` + ⇒ **变异体2/4 通过 pi 全部三条判据** —— 而它们正是 pi 说要防的那类缺陷 ✓ + ``` + · ② 是**字面字符串检查**: 把"请在配置页检查 Agent 模型范围"改写一下即绕过 + · ③ 不是它声称的东西的判据: 变异体1(两个硬编码分支 + 撒谎默认)**通过 ③** —— + 因为两类 error 确实给了两段**不同的硬编码文本** ⇒ ③ 只证明"输出依赖输入", + **不证明"结论由 error 派生"**(形式 vs 性质) + ``` + + ## (C) ⚠️ 我自查出**我自己设计的检查也不完备**,并纠正我一度说错的话 + ``` + 我第一版: "默认分支须含原文 ∧ 不含规则表里的建议字面串" + ⇒ 变异体3(含原文 + 同义改写的错误建议)**判绿 ⇒ 漏掉** ⇒ 我的"泄漏检查"只抓照抄 + 我第二版: "未分类输出必须**逐字等于**一个字面钉死的常量" + ⇒ 变异体1/2/3/4 **全判红**、参照实现**判绿** ✓ 有鉴别力 + ⚠️ 我中途说过"变异体4 会让契约检查也漏掉" —— **复核后是错的**: 常量**字面钉在测试里**时它抓得住; + 真正的残余缺口是"**测试若从实现 import 那个常量** ⇒ 检查恒真" ⇒ + 缺口在**测试是否钉字面**,不在检查本身 ⇒ 已更正 + ⇒ 残余(照实说): 契约检查挡得住"未申报的偏离",挡不住"把谎言写进**已申报**的常量" —— + 那需要语义 oracle,超出这条判据的能力 + ``` + + ## (D) ★★★ 顺线查出:**现有测试把缺陷钉死了**(我改实现后 1 条测试变红,三方证据) + ``` + 把尾部改成"未分类即附原文" ⇒ 跑现有 model-scope 测试: + not ok 23 - 失败报告给出可操作的下一步 # pass 25 / fail 1 + 那条测试(228-232 行): assert.match(got, /配置页/) ← 断言里写死了"配置页" + ⇒ 意图是好的("只报错误不说怎么办,收信的人只能来问"),但**把某一错误类的具体建议 + 当成了对所有错误的通用要求** ⇒ 它**锁住了缺陷**(修它就会红) + 三方独立旁证(两个**已自行绕开**共用库的实现都断言相反): + pi turn.test.mjs:318 assert.doesNotMatch(body, /调整可用模型范围/) (续谈路径,故意不降级) + zcode prompt.test.mjs:92 assert.doesNotMatch(body, /调整可用模型范围/) (平台成因不同) + ⇒ 所以这条缺陷有**三个独立来源**说它错: pi 09-19 的报告、pi/zcode 的 doesNotMatch 测试、 + 以及"共用库测试自己锁死了它"这一事实 + ``` + + ## (E) 变更面(修它的成本,实测) + ``` + 实现 3 份(dsh/opencode/pi,md5 5bdeb2e5…,契约要求逐字节同源)+ 测试 3 份(md5 69ef4198…) + zcode **不引**(MCP_LIBS 不含 model-scope,它没有这个文件)⇒ 动 6 个文件,其中 3 个是测试 + 实测: 只改 dsh 一份 ⇒ deploy/check-shared-libs.sh **判红**("共用模块已分叉")⇒ 契约有效 ✓ + ⇒ 所以要动必须**六份一起**,且测试要**先改**(否则新实现会被旧测试判红) + ``` + + ## (F) 边界(未做) + ``` + · 我**没有改**这三份实现或测试(只做了探针并逐字节还原,md5 已验回 5bdeb2e5 / 69ef4198) + · **生产一个字节没动**(仍 09-19 13:04);本次只读 + · ⚠️ 与 pi 一样: 这是**跨三方共用库**,动它要先确认没有并发会话在改(pi 说它看到 install.sh 有未提交改动) + ```