复核 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:
81
docs/API.md
81
docs/API.md
@ -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 有未提交改动)
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user