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 有未提交改动) + ```