aps-agent/docs/round-2-contract-gate-plan.md

92 lines
5.6 KiB
Markdown
Raw Permalink 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.

# 第 2 轮工作计划(轻量合并版):契约漂移门禁补全
更新日期:2026-08-01
## 1. 本轮目标
把三个公共排产契约(`scheduling_problem.schema.json` / `scheduling_solution.schema.json` / `plan_node.schema.json`)纳入 `tests/golden/test_contract_sync.py` 的跨层契约校验链(schema ↔ Python DTO ↔ 消费方),并增加不兼容消费者测试与文档清单门禁;矩阵 M0「跨层契约和文档同轮同步」由 Partial 升为 Done。
## 2. 背景和当前状态
- 当前已完成:`test_contract_sync.py` 已覆盖 `intent`/`ui_block`/`viewport_command`/`schedule_result` 四个契约的三方一致性(schema 枚举/必填 ↔ pydantic ↔ TS literal union),并有 InterfaceGate 启动握手测试;`scheduling_problem`/`scheduling_solution` 的 Python 模型在 `server/aps_domain/scheduling_dto.py`,`plan_node` 的模型在 `server/agent_core/plan_runtime.py`(PlanLayer/PlanStatus/PlanCreator 枚举与 schema 一致,字段集合一致)。
- 当前缺口:三个公共排产契约未进入校验链;无"不兼容消费者"回归测试;无文档清单门禁(docs/README.md 目录与契约文件的对应关系无自动化检查)。
- 本轮为什么现在做:矩阵 P0 批次点名「三层契约漂移门禁已有可运行首切片」,剩余验收标准为"增加契约生成/差异检查和文档清单门禁,漂移直接阻断合并"。
- Workspace preflight:第 1 轮(证据链 v1)已收口(425 passed / 审计 PASS);共享脏工作区、无提交。
- 方向分析:Q1 推荐选项 C(契约漂移门禁),目标续跑轮授权执行。
## 3. 本轮工作方向
```text
test_contract_sync.py(4 契约覆盖)
-> 扩展校验链:scheduling_problem / scheduling_solution / plan_node(schema ↔ Python DTO ↔ 消费方)
-> 不兼容消费者测试:Schema 漂移(删字段/改枚举)→ 校验失败
-> 文档清单门禁:docs/README.md 契约目录 ↔ shared/schemas/*.json 一一对应
-> 全量黄金测试 + 矩阵 M0 行 → Done
```
## 4. 已确认决策
任务重量:
- 档位:轻型(单测试域:test_contract_sync.py + docs/README.md;集成点唯一:黄金测试)。
- 规模依据:核心改动集中在 `tests/golden/test_contract_sync.py` 与 `docs/README.md`;无生产代码行为变化,风险 LOW。
- 选择原因:纯门禁/测试工程,直接服务 P0 批次验收出口「契约三方一致」。
P0/P1 决策(按 Q1 推荐采纳):
- 决策 1(P0):本轮切片 = 契约漂移门禁补全(选项 C)。
- 决策 2(P1):不新建分支、不提交、不推送(沿用共享脏工作区约束)。
- 决策 3(P1):验证深度 = 聚焦 test_contract_sync + 全量黄金回归。
默认假设:
- 假设 1:`scheduling_problem`/`scheduling_solution` 的 TS 消费方 = `apps/web/src/skills/SkillConsole.tsx` 只读展示(不做强类型消费),因此校验重点为 schema ↔ Python DTO 一致 + 网关契约端点返回可用。
- 假设 2:`plan_node` 消费方 = `server/agent_core/plan_runtime.py`(模型)与 `server/gateway/plan_api.py`(API),TS 无独立类型,校验 schema ↔ Python 模型一致。
- 假设 3:不兼容消费者测试用「schema 漂移注入」模拟:删除/改名 schema 字段或枚举 → 断言校验函数检测到漂移。
未决但不阻塞:契约生成自动化(从 schema 生成 pydantic/TS)留待后续轮次,本轮先做差异检查门禁。
## 5. 范围
In scope:
- `tests/golden/test_contract_sync.py`:新增三个契约的 schema↔Python 校验(字段集合、必填、枚举)、网关契约端点冒烟、不兼容消费者(漂移注入)测试。
- `docs/README.md`:文档清单门禁(列出全部 shared/schemas 契约与对应消费方文档);必要时补一个 `docs/product/contracts.md` 或复用现有文档。
- `docs/product/plan-completion-matrix.md`:M0 契约行 Partial → Done。
- `docs/CHANGELOG.md`:追加本轮条目。
Out of scope:
- 契约生成器(schema → pydantic/TS 自动生成);前端强类型化三个契约;任何生产代码行为变化。
- 提交/推送/合并/清理用户改动。
## 6. 成功标准
- `python -m pytest -q tests/golden/test_contract_sync.py -p no:cacheprovider` 全部通过(原 6 项 + 新增)。
- 全量 `python -m pytest tests/golden -q -p no:cacheprovider`(固定 .venv 运行时)通过,≥ 425。
- `python -m ruff check` 改动文件干净。
- `git diff --check` 无空白错误;`git status` 仅本轮文件。
## 7. 验证方式
- 聚焦:`python -m pytest -q tests/golden/test_contract_sync.py -p no:cacheprovider`
- 回归:全量黄金套件。
- 静态:ruff + git diff --check。
## 8. 关键风险
| 风险 | 影响 | 控制方式 |
|---|---|---|
| 三个契约存在真实漂移导致新测试失败 | 需要修复模型/schema | 先核对再断言;漂移修复限定契约文件 |
| SkillConsole 只读展示被误判为消费方 | 校验范围偏差 | 明确 TS 侧为展示型消费,校验 schema↔Python 为主 |
| 文档清单门禁误伤 | 无关文档改动触发失败 | 门禁只检查契约目录 ↔ docs 映射,不做全量文档校验 |
## 9. 停止条件
- 全量黄金测试出现非本轮相关回归且无法快速定位时暂停。
- 任何需要提交/推送/合并/清理用户改动的操作一律停下等待授权。
## 10. 本轮完成定义
- 实现、测试、审计、文档全部完成;聚焦与全量验证通过;矩阵与 CHANGELOG 回写;不提交。
- 收口:向用户报告主要结论、关键洞察、需要特别留意的地方。
## 11. 下一步
轻量合并版:主 agent 实现 + 验证 + 收口报告。