Files
PolyGateway/research-wiki/findings/2026-09-09-134-thinking-contracts-validation.md
T

5.6 KiB
Raw Blame History

type, node_id, title, date
type node_id title date
finding finding:2026-09-09-134-thinking-contracts-validation 1.3.4 T0T4 与 T7 确定性验证 2026-09-09

1.3.4 T0T4T7 实施验证

状态:本轮限定的生产契约与确定性测试已实现;不是整个版本验收。T5/T6/T8/T9 尚未执行。所有原始输出在 tests/outputs/134/,不提交。

基线与修改边界

项目 实际证据
起点 6a09054,保留既有两个本地测试提交,工作区仅原 .pi/ 与待提交设计/计划
T0 静态 t0-check.log.exitmake check,退出 0import-linter 1 kept
T0 指定测试 t0-baseline.log.exit660 passed,退出 0
生产范围 只修改 thinkingprovidersclientopenai_compat 四文件;端口、类型、缓存指纹、遥测 schema、embeddingOCR 循环未改
文档回滚 2553fc7dda5556wiki 工具 add_entity 会覆盖无 frontmatter 的同名文件,故先补原文 frontmatter,再以节点存在性保护调用工具,显式登记图节点/implements 边

红绿证据

任务 红证据 绿证据
T1 AUTO 成员/MiniMax/未知告警 t1-red.log9 failed103 passed;都是未拒绝/旧 medium/缺不保证文案 t1-green.log112 passed
T1 可执行迁移文案 t1-guidance-red.log1 failed,旧错误无配置例 t13-followup-green.log220 passed(含探针收尾)
T2 on_base 不偷带档 t2-wire-red.log:12 failed,旧解析接受非法开启片段 t2-green.log137 passed
T2 raw 纯守卫 隔离 raw-guard 变异:28 failed,含嵌套根与所有档位 还原退出 0;详见 mutation-summary.json
T3 标准 raw 实际 HTTP t3-raw-red-valid.log21 failed,旧 transport 发出了冲突请求 t3-green.log526 passed(工厂/配置/transportretry/纯解析)
T3 前置/准入 t3-entry-red.log:4 failed,旧工厂构造后端/请求进入洋葱/冲突未拒绝 同上;额外半开探针测试证明可再次取得探针且 inflight=0
T3 自定义根 隔离 custom-guard 变异:3 failed,丢 wire 后私有根绕过 t3-custom-green.log3 passed
T4 迁移 cache-isolation 变异:去掉显式身份后能力/fallback/wire 各节点红 t4-final-green.log:190 passed(缓存与遥测);新旧身份回滚、租户、多源和 per-call 覆盖均有断言
T4 命中遥测 cache-row 变异:1 failed,历史 low 不应替代本次 medium 还原退出 0
T7 客户端 NULL embed False→True6 failedOCR False→True12 failedtextlayout 独立红) t7-final-green.log328 passed
T7 阳性/emitter chat True→False:并发实际档断言失败;去 applies 短路:6 failed 各还原退出 0chat 糖失败 auto、nearest 失败 medium/成功 low 另有真实链路断言

隔离副本来源由 mutation-import.log 验证,路径为 /tmp/pgw134-mutation-*;无 .env、reference、.pi/。脚本 mutate.py、汇总 mutation-summary.json、逐例 mutation-*-red.log/.exitmutation-*-restored.log/.exit 均留存。11 个变异全部退出 1,逐例还原全部退出 0,恢复后校验文件散列。factory 三个变异分别抓到 Authorization 缺失、timeout 退回 5 秒、trust_env 写死 True。

调试记录(不把无效红当证据)

现象 根因与处理
初始 raw 红测试反而 21 passed 测试选 qwen 纯开关形态却请求 HIGH,旧实现先因形态拒绝;改用可表达 HIGH 的 openai 后全部因目标未拒绝而红。t3-raw-red.log 不计红证据,使用 t3-raw-red-valid.log
默认 HTTP factory 新测试 5 failed 开发机 socks:// 代理被 httpx 构造拒绝;测试 autouse 删除代理环境,仅隔离外部条件,不改生产 factory,仍分别验证 trust_env TrueFalse。t3-isolated-green.log207 passed
factory 失败随 T3 提交进入历史 8e61a66 当时附带上述未隔离测试;随后 71f1bdf 独立修复。最终工作区全绿;不声称每个历史提交均全绿
per-call 迁移工厂测试缺缓存参数 合成 env 仍为 cache_backend=noneloader 正确清空 namespacettl;改为 memory+显式 TTL,新测试 9 passed,不改生产配置默认
conda run 默认捕获模式下 stdin 脚本未执行 T0 第一次文档提交只有原始两文件;通过 --no-capture-output 重跑安全登记并单独提交,未将第一次零输出当登记成功
pi-lens LSP 报缺 pytestloguru、旧 StrEnum Literal 噪音、Python 3.12 语法不支持 非 conda 解释器限制;父监督明确批准记录并继续既定 conda pytestruffimport-linter,不改枚举/不加 ignore。后续异步 stale 测试报告已标 superseded,最终实际全量单测输出为准

当前检查与后续门

检查 结果
conda run --no-capture-output -n PolyGateway pytest tests/unit/ -q last-unit.log/.exit1241 passed3.95 秒,退出 0
make check last-check.log/.exit:格式/ruffimport-linter通过,退出 0
git diff --check 通过
本轮网络/slow 未执行;所有 HTTP 为 MockTransportSQLite 为临时文件,无付费调用
独立 verifier/集成/slow/下游迁移 由父会话后续执行,本轮不声明通过;设计所列真实缺测和下游缺失仍有效

日志方案沿已批设计:未知能力沿既有 loguru warning,实际调用仍经 TelemetryEmitter 单点出口,四类行来源和 NULL 契约用既有 schema 验证,不新增运行时数据面。