docs: record deterministic reasoning contract validation
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
---
|
||||
type: finding
|
||||
node_id: finding:2026-09-09-134-thinking-contracts-validation
|
||||
title: "1.3.4 T0–T4 与 T7 确定性验证"
|
||||
date: 2026-09-09
|
||||
---
|
||||
|
||||
# 1.3.4 T0–T4/T7 实施验证
|
||||
|
||||
> 状态:本轮限定的生产契约与确定性测试已实现;不是整个版本验收。T5/T6/T8/T9 尚未执行。所有原始输出在 `tests/outputs/134/`,不提交。
|
||||
|
||||
## 基线与修改边界
|
||||
|
||||
| 项目 | 实际证据 |
|
||||
| --- | --- |
|
||||
| 起点 | `6a09054`,保留既有两个本地测试提交,工作区仅原 `.pi/` 与待提交设计/计划 |
|
||||
| T0 静态 | `t0-check.log`/`.exit`:make check,退出 0,import-linter 1 kept |
|
||||
| T0 指定测试 | `t0-baseline.log`/`.exit`:660 passed,退出 0 |
|
||||
| 生产范围 | 只修改 thinking/providers/client/openai_compat 四文件;端口、类型、缓存指纹、遥测 schema、embedding/OCR 循环未改 |
|
||||
| 文档回滚 | `2553fc7`/`dda5556`;wiki 工具 add_entity 会覆盖无 frontmatter 的同名文件,故先补原文 frontmatter,再以节点存在性保护调用工具,显式登记图节点/implements 边 |
|
||||
|
||||
## 红绿证据
|
||||
|
||||
| 任务 | 红证据 | 绿证据 |
|
||||
| --- | --- | --- |
|
||||
| T1 AUTO 成员/MiniMax/未知告警 | `t1-red.log`:9 failed,103 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(工厂/配置/transport/retry/纯解析) |
|
||||
| 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→True:6 failed;OCR False→True:12 failed(text/layout 独立红) | `t7-final-green.log`:328 passed |
|
||||
| T7 阳性/emitter | chat True→False:并发实际档断言失败;去 applies 短路:6 failed | 各还原退出 0;chat 糖失败 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 True/False。`t3-isolated-green.log`:207 passed |
|
||||
| factory 失败随 T3 提交进入历史 | `8e61a66` 当时附带上述未隔离测试;随后 `71f1bdf` 独立修复。最终工作区全绿;不声称每个历史提交均全绿 |
|
||||
| per-call 迁移工厂测试缺缓存参数 | 合成 env 仍为 cache_backend=none,loader 正确清空 namespace/ttl;改为 memory+显式 TTL,新测试 9 passed,不改生产配置默认 |
|
||||
| conda run 默认捕获模式下 stdin 脚本未执行 | T0 第一次文档提交只有原始两文件;通过 --no-capture-output 重跑安全登记并单独提交,未将第一次零输出当登记成功 |
|
||||
| pi-lens LSP 报缺 pytest/loguru、旧 StrEnum Literal 噪音、Python 3.12 语法不支持 | 非 conda 解释器限制;父监督明确批准记录并继续既定 conda pytest/ruff/import-linter,不改枚举/不加 ignore。后续异步 stale 测试报告已标 superseded,最终实际全量单测输出为准 |
|
||||
|
||||
## 当前检查与后续门
|
||||
|
||||
| 检查 | 结果 |
|
||||
| --- | --- |
|
||||
| `conda run --no-capture-output -n PolyGateway pytest tests/unit/ -q` | `last-unit.log/.exit`:**1241 passed,3.95 秒,退出 0** |
|
||||
| `make check` | `last-check.log/.exit`:格式/ruff/import-linter通过,退出 0 |
|
||||
| `git diff --check` | 通过 |
|
||||
| 本轮网络/slow | 未执行;所有 HTTP 为 MockTransport,SQLite 为临时文件,无付费调用 |
|
||||
| 独立 verifier/集成/slow/下游迁移 | 由父会话后续执行,本轮不声明通过;设计所列真实缺测和下游缺失仍有效 |
|
||||
|
||||
日志方案沿已批设计:未知能力沿既有 loguru warning,实际调用仍经 TelemetryEmitter 单点出口,四类行来源和 NULL 契约用既有 schema 验证,不新增运行时数据面。
|
||||
@@ -220,6 +220,11 @@
|
||||
"id": "plan:2026-09-09-134-thinking-contracts",
|
||||
"label": "1.3.4 推理契约实施计划",
|
||||
"type": "plan"
|
||||
},
|
||||
{
|
||||
"id": "finding:2026-09-09-134-thinking-contracts-validation",
|
||||
"label": "1.3.4 T0–T4 与 T7 确定性验证",
|
||||
"type": "finding"
|
||||
}
|
||||
],
|
||||
"links": [
|
||||
@@ -446,6 +451,13 @@
|
||||
"relation": "implements",
|
||||
"evidence": "已批准设计;T0基线660 passed、make check通过",
|
||||
"added": "2026-09-09T04:48:57.560089+00:00"
|
||||
},
|
||||
{
|
||||
"source": "plan:2026-09-09-134-thinking-contracts",
|
||||
"target": "finding:2026-09-09-134-thinking-contracts-validation",
|
||||
"relation": "tested_by",
|
||||
"evidence": "T0–T4/T7:1241单测与11隔离变异;未覆盖live/集成/发布",
|
||||
"added": "2026-09-09T05:39:12.170598+00:00"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
# Research Wiki 索引
|
||||
|
||||
> 自动生成,更新时间:2026-09-09 04:48 UTC
|
||||
> 自动生成,更新时间:2026-09-09 05:39 UTC
|
||||
|
||||
## design (42)
|
||||
- [1.3.4 推理意图与测试证据设计](designs/2026-09-09-134-thinking-contracts-design.md) `design:2026-09-09-134-thinking-contracts-design`
|
||||
@@ -46,7 +46,8 @@
|
||||
- [调用方自定义维度设计(issue #11)](designs/issue11-caller-dimensions.md) `design:issue11-caller-dimensions`
|
||||
- [采样参数透传设计(issue #4)](designs/sampling-params.md) `design:sampling-params`
|
||||
|
||||
## finding (14)
|
||||
## finding (15)
|
||||
- [1.3.4 T0–T4 与 T7 确定性验证](findings/2026-09-09-134-thinking-contracts-validation.md) `finding:2026-09-09-134-thinking-contracts-validation`
|
||||
- [2026-07-20-m2-soak-workload](findings/2026-07-20-m2-soak-workload.md) `finding:2026-07-20-m2-soak-workload`
|
||||
- [2026-07-21-m25-acceptance](findings/2026-07-21-m25-acceptance.md) `finding:2026-07-21-m25-acceptance`
|
||||
- [2026-07-21-p6-soak-baseline](findings/2026-07-21-p6-soak-baseline.md) `finding:2026-07-21-p6-soak-baseline`
|
||||
|
||||
@@ -152,3 +152,5 @@
|
||||
- [2026-09-05 04:07 UTC] 重建索引: 95 篇页面
|
||||
- [2026-09-09 04:48 UTC] 新增边: plan:2026-09-09-134-thinking-contracts --implements--> design:2026-09-09-134-thinking-contracts-design
|
||||
- [2026-09-09 04:48 UTC] 重建索引: 97 篇页面
|
||||
- [2026-09-09 05:39 UTC] 新增边: plan:2026-09-09-134-thinking-contracts --tested_by--> finding:2026-09-09-134-thinking-contracts-validation
|
||||
- [2026-09-09 05:39 UTC] 重建索引: 98 篇页面
|
||||
|
||||
@@ -7,7 +7,7 @@ date: 2026-09-09
|
||||
|
||||
# 1.3.4 推理契约与测试证据实施计划
|
||||
|
||||
> 日期:2026-09-09。状态:**自审及 Codex 独立计划审查通过(复审 run ea38c3a7-12ef-4bf0-bb04-257ce37eb96f),进入执行;尚未编码/执行验收**。
|
||||
> 日期:2026-09-09。状态:**自审及 Codex 独立计划审查通过(复审 run ea38c3a7-12ef-4bf0-bb04-257ce37eb96f),T0–T4、T7 已实现并通过确定性验证;T5/T6/T8/T9 待执行**。
|
||||
> 设计:`research-wiki/designs/2026-09-09-134-thinking-contracts-design.md`,用户已正式批准。
|
||||
> 目标:解决 #21 的受管推理语义漏洞、#25 的测试归因漏洞、#26 的客户端遥测守卫缺口,不扩展生产端口或遥测 schema。
|
||||
> 方案:在既有推理决策层添加窄校验并接入工厂/默认 transport;测试侧独立保留请求与响应证据,按明确命题判定覆盖。缓存仍由下游显式迁移,生产治理循环不重写。
|
||||
@@ -184,7 +184,7 @@ T5 按 `(session_id, parent_call_id) → AttemptEvidence.call_id → HttpEvidenc
|
||||
|
||||
**验证**:`conda run -n PolyGateway pytest tests/unit/test_thinking.py tests/unit/test_providers.py -q`;新拒绝和 wire 回归先红后绿,其余保留行为通过。若旧下游形态测试依赖 M3 True,需要在 T3 明确改为已批准迁移样本,不能暗改能力表让它绿。
|
||||
|
||||
- [ ] 提交点:`fix: enforce registered auto reasoning capabilities`。
|
||||
- [x] 提交点:`fix: enforce registered auto reasoning capabilities`。
|
||||
|
||||
### T2:纯 wire/raw 所有权校验
|
||||
|
||||
@@ -202,7 +202,7 @@ T5 按 `(session_id, parent_call_id) → AttemptEvidence.call_id → HttpEvidenc
|
||||
|
||||
**验证**:`conda run -n PolyGateway pytest tests/unit/test_thinking.py -q`,每类目标反例有有效红绿,保留行为绿。
|
||||
|
||||
- [ ] 提交点:`fix: validate ownership of managed reasoning parameters`。
|
||||
- [x] 提交点:`fix: validate ownership of managed reasoning parameters`。
|
||||
|
||||
### T3:接入工厂、请求入口和默认 transport
|
||||
|
||||
@@ -225,7 +225,7 @@ T5 按 `(session_id, parent_call_id) → AttemptEvidence.call_id → HttpEvidenc
|
||||
|
||||
**验证**:`conda run -n PolyGateway pytest tests/unit/test_client.py tests/unit/test_config.py tests/unit/test_openai_compat.py tests/unit/test_retry.py -q`,加 T1/T2 的测试一起跑;工厂/请求/全量注入拒绝均有旧实现红、新实现绿。
|
||||
|
||||
- [ ] 提交点:`fix: reject conflicting raw reasoning overrides before sending`。
|
||||
- [x] 提交点:`fix: reject conflicting raw reasoning overrides before sending`。
|
||||
|
||||
### T4:显式缓存迁移和四种遥测口径回归
|
||||
|
||||
@@ -247,7 +247,7 @@ T5 按 `(session_id, parent_call_id) → AttemptEvidence.call_id → HttpEvidenc
|
||||
|
||||
**验证**:`conda run -n PolyGateway pytest tests/unit/test_cache.py tests/unit/test_client.py tests/unit/test_telemetry.py -q`。两项新增能力/wire 迁移节点均置于 `tests/unit/test_cache.py::TestExplicitCacheMigration`,单跑 `conda run -n PolyGateway pytest tests/unit/test_cache.py::TestExplicitCacheMigration -q`;分别在隔离副本去掉其 namespace/salt 隔离输入,必须因没有新拒绝/新 wire 而红,恢复后绿,不能只以 nearest→error 的测试代替这两类。两客户端的源指纹必须断言相等,生产指纹算法一字不改。
|
||||
|
||||
- [ ] 提交点:`test: pin explicit cache migration and reasoning row semantics`。
|
||||
- [x] 提交点:`test: pin explicit cache migration and reasoning row semantics`。
|
||||
|
||||
### T5:有限测试归因和独立取证
|
||||
|
||||
@@ -307,7 +307,7 @@ chat 阳性走真实 RetryMW+emitter:True 糖失败 auto、显式请求失
|
||||
|
||||
**验证**:`conda run -n PolyGateway pytest tests/unit/test_embedding.py tests/unit/test_ocr_client.py tests/unit/test_telemetry.py tests/unit/test_monkey_ocr.py tests/unit/test_retry.py -q`,再执行上表隔离变异;原实现绿、四类有效红、还原绿。
|
||||
|
||||
- [ ] 提交点:`test: guard reasoning-free telemetry through real client paths`。
|
||||
- [x] 提交点:`test: guard reasoning-free telemetry through real client paths`。
|
||||
|
||||
### T8:文档、日志登记与独立验证
|
||||
|
||||
@@ -375,3 +375,7 @@ chat 阳性走真实 RetryMW+emitter:True 糖失败 auto、显式请求失
|
||||
|
||||
自审已核对:生产守卫所有消费者在 §3 定义;新增测试文件有确定路径;conftest 当前不存在故明确新建;默认工厂不支持 transport 注入故使用已批准全量注入而非偷扩 API;缓存不改指纹;无从公共 model_reported 倒推上游身份;所有命令均在 conda 环境;未执行的测试不写为已通过。
|
||||
计划审查由父会话组织,完成后直接实施,不新增人类计划审批门。执行中本文件任务勾选与 finding 保持实际状态一致;本次计划编写未运行 pytest、变异或真实模型调用。
|
||||
|
||||
## 本轮实施证据
|
||||
|
||||
T0–T4/T7 的命令、实际失败与修复、11 个隔离变异及 1241 项单测通过,见 `findings/2026-09-09-134-thinking-contracts-validation.md`。未执行 live、集成和发布,T5/T6 的测试支持文件未创建。
|
||||
|
||||
Reference in New Issue
Block a user