aps-agent/docs/round-4-confirm-batch-plan.md

91 lines
4.8 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.

# 第 4 轮工作计划(轻量合并版):批量审批(confirm-batch)
更新日期:2026-08-01
## 1. 本轮目标
新增批量审批能力:一条请求处理多条待审批确认卡(同一批准/驳回决定 + 每条可带意见),复用现有 P2/P3 单条 confirm 的完整语义(证据校验、双人分离、执行/驳回、审计),前端门禁管理台待审批列表支持多选批量操作;矩阵 P3「外部副作用二次确认」剩余项之一完成。
## 2. 背景和当前状态
- 当前已完成:单条 confirm 链路完整(P2 一次放行、P3 双人、证据链强校验、审批意见 note 落库);GovConsole 有 PendingView(单条批准/驳回)+ ApprovalHistoryView。
- 当前缺口:待审批列表只能逐条操作;无批量入口;后端无聚合批量端点。
- 本轮为什么现在做:矩阵 P3 剩余「批量审批」;本地可完整验证(双后端单条语义已被第 3 轮覆盖,批量是编排层)。
- Workspace preflight:第 3 轮收口(435 passed);服务 8003/5173 正常;共享脏工作区、无提交。
- 方向分析:Q1 推荐选项 A(批量审批),目标续跑轮授权执行。
## 3. 本轮工作方向
```text
单条 confirm
-> POST /api/actions/confirm-batch { confirmIds, approve, note? }(逐条走 execute_confirmed,聚合结果)
-> 前端 PendingView 多选 + 批量按钮(复用 postConfirm 语义)
-> 黄金测试:批量批准 P2 多条、批量含 P3 需二次确认、批量驳回、逐条隔离失败
-> 矩阵 P3 注记「批量审批已完成」;CHANGELOG
```
## 4. 已确认决策
任务重量:
- 档位:轻型(单域:gateway 端点 + GovConsole 前端 + 黄金测试)。
- 规模依据:核心是编排层(循环复用现有语义),不新增双后端状态机;风险 LOW。
- 选择原因:最小且独立的 P0 剩余项,可完整本地验证。
P0/P1 决策(按 Q1 推荐采纳):
- 决策 1(P0):本轮切片 = 批量审批(选项 A)。
- 决策 2(P1):不新建分支、不提交、不推送。
- 决策 3(P1):验证深度 = 聚焦批量端点测试 + 全量黄金回归。
默认假设:
- 假设 1:批量 = 同一 approve 决定应用于多条 confirmId;note 为公共意见(逐条落库)。
- 假设 2:逐条执行并聚合;单条失败不阻断其余(逐条隔离),响应含每条结果与失败原因。
- 假设 3:P3 首次批准(needsSecondConfirm)在批量结果中标记 secondConfirmRequired,不视为失败。
- 假设 4:批量仅限当前用户可审批的作用域(复用 allowed 谓词,天然隔离)。
未决但不阻塞:委托/转派审批、文件→DB 存量迁移、WORM 归档(后续轮)。
## 5. 范围
In scope:
- `server/gateway/app.py`:`ConfirmBatchRequest`(confirmIds: list[str]、approve: bool、note?: str)+ `POST /api/actions/confirm-batch`,逐条调用 `execute_confirmed`,聚合 `{results: [{confirmId, ok, message, secondConfirmRequired}]}`。
- `apps/web/src/api/client.ts`:`postConfirmBatch(sessionId, confirmIds, approve, note?)`。
- `apps/web/src/gov/GovConsole.tsx`:PendingView 多选(Checkbox)+ 批量批准/驳回按钮。
- `tests/golden/test_gov_api.py` 或新增 `test_confirm_batch.py`:批量 P2 通过、批量含 P3 二次确认、批量驳回、单条失败隔离、note 落库。
- 文档:`docs/architecture/harness.md`、`docs/product/plan-completion-matrix.md`(P3 注记)、`docs/CHANGELOG.md`。
Out of scope:
- 委托/转派、文件→DB 迁移、WORM、MySQL 实机故障注入。
- 提交/推送/合并/清理用户改动。
## 6. 成功标准
- 聚焦:`python -m pytest -q tests/golden/test_confirm_batch.py tests/golden/test_gov_api.py -p no:cacheprovider` 通过。
- 全量:`python -m pytest tests/golden -q -p no:cacheprovider`(固定 .venv)≥ 435。
- ruff 干净;前端 tsc 通过;git diff --check 无空白错误。
## 7. 验证方式
- 批量端点 API 测试(TestClient + install_test_auth);前端 tsc;全量黄金回归。
## 8. 关键风险
| 风险 | 影响 | 控制方式 |
|---|---|---|
| 批量逐条执行中断言耦合 | 部分失败语义不清 | 每条独立 try/except,聚合结果含 ok/message |
| P3 二次确认在批量中误判失败 | 语义错误 | secondConfirmRequired 单独标记 |
| 前端多选交互回归 | 编译/交互问题 | tsc + 复用既有 decide 逻辑 |
## 9. 停止条件
- 全量黄金测试非本轮相关回归无法快速定位时暂停。
- 任何提交/推送/合并/清理操作停下等待授权。
## 10. 本轮完成定义
- 实现、测试、文档完成;聚焦与全量通过;矩阵/CHANGELOG 回写;不提交。
- 收口:报告主要结论、关键洞察、需要特别留意的地方。
## 11. 下一步
轻量合并版:主 agent 实现 + 验证 + 收口报告。