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

62 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
type: finding
node_id: finding:2026-09-09-134-thinking-contracts-validation
title: "1.3.4 T0T4 与 T7 确定性验证"
date: 2026-09-09
---
# 1.3.4 T0T4T7 实施验证
> 状态:本轮限定的生产契约与确定性测试已实现;不是整个版本验收。T5/T6/T8/T9 尚未执行。所有原始输出在 `tests/outputs/134/`,不提交。
## 基线与修改边界
| 项目 | 实际证据 |
| --- | --- |
| 起点 | `6a09054`,保留既有两个本地测试提交,工作区仅原 `.pi/` 与待提交设计/计划 |
| T0 静态 | `t0-check.log``.exit`make check,退出 0import-linter 1 kept |
| T0 指定测试 | `t0-baseline.log``.exit`660 passed,退出 0 |
| 生产范围 | 只修改 thinkingprovidersclientopenai_compat 四文件;端口、类型、缓存指纹、遥测 schema、embeddingOCR 循环未改 |
| 文档回滚 | `2553fc7``dda5556`wiki 工具 add_entity 会覆盖无 frontmatter 的同名文件,故先补原文 frontmatter,再以节点存在性保护调用工具,显式登记图节点/implements 边 |
## 红绿证据
| 任务 | 红证据 | 绿证据 |
| --- | --- | --- |
| T1 AUTO 成员/MiniMax/未知告警 | `t1-red.log`9 failed103 passed;都是未拒绝/旧 medium/缺不保证文案 | `t1-green.log`112 passed |
| T1 可执行迁移文案 | `t1-guidance-red.log`:1 failed,旧错误无配置例 | `t13-followup-green.log`220 passed(含探针收尾) |
| T2 on_base 不偷带档 | `t2-wire-red.log`:12 failed,旧解析接受非法开启片段 | `t2-green.log`137 passed |
| T2 raw 纯守卫 | 隔离 `raw-guard` 变异:28 failed,含嵌套根与所有档位 | 还原退出 0;详见 mutation-summary.json |
| T3 标准 raw 实际 HTTP | `t3-raw-red-valid.log`21 failed,旧 transport 发出了冲突请求 | `t3-green.log`526 passed(工厂/配置/transportretry/纯解析) |
| T3 前置/准入 | `t3-entry-red.log`:4 failed,旧工厂构造后端/请求进入洋葱/冲突未拒绝 | 同上;额外半开探针测试证明可再次取得探针且 inflight=0 |
| T3 自定义根 | 隔离 `custom-guard` 变异:3 failed,丢 wire 后私有根绕过 | `t3-custom-green.log`3 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.log`328 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/.exit``mutation-*-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.log`207 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/.exit`**1241 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 验证,不新增运行时数据面。