复核 pi 1705e24c: 事实断言全成立;★ 但用真函数跑它的验收集发现**两个洞**(判据②③放走真缺陷实现);★ 现有测试把缺陷**钉死**了

★ (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 一样,动它前要先确认无并发会话在改
This commit is contained in:
2026-09-25 05:13:14 +08:00
parent de04269155
commit 9a8096a562

View File

@ -3746,4 +3746,83 @@ window.__AGENTMAIL_TOKEN__ = '<user_key>'; // 省略则走 Cookie
· 我没有改 `deploy/check-deploy-drift.mjs`(**只读验证**;server/ 与生产均未动)
· pi 的**诊断**(note 强于条件、E 态保留、自检只断 ok)**全部成立** ——
我打掉的是它**修法里的一个边界值**,不是它的结论
```
```
---
- ★★★ **复核 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 有未提交改动)
```