aps-agent/docs/round-12-approval-transfer-...

93 lines
4.7 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.

# 第 12 轮工作计划(轻量合并版):审批转派(transfer)
更新日期:2026-08-01
## 1. 本轮目标
新增审批转派:当前可审批者可将待确认项转派给指定用户(`transfer`),转派后仅目标用户可审批;双后端(文件/DB)支持并记录 TRANSFERRED 历史事件;矩阵 P3「外部副作用二次确认」剩余项之一(转派审批)完成。
## 2. 背景和当前状态
- 当前已完成:审批委托(delegation,第 10 轮)、审批意见、批量审批;`ApprovalBackend` 协议含 stage/decide/pending_record/consume_grant 等。
- 当前缺口:无转派能力——待确认项只能 owner/delegate 操作,无法移交给他人;`ApprovalBackend` 无 transfer 方法。
- 本轮为什么现在做:矩阵 P3 剩余「委托/转派审批」的转派部分;纯本地可验证。
- Workspace preflight:第 11 轮收口(474 passed);服务 8003/5173 正常;共享脏工作区、无提交。
- 方向分析:Q1 推荐(审批转派),目标续跑轮授权执行。
## 3. 本轮工作方向
```text
待确认项只能 owner/delegate 操作
-> ApprovalBackend.transfer(confirm_id, to_user_id, allowed, now_epoch)(文件+DB)
-> harness.transfer_confirmation(confirm_id, to_user_id):当前可审批者转移,转派后仅目标可审批
-> 历史事件 TRANSFERRED;网关 POST /api/actions/transfer
-> 黄金测试:owner 可转派、非 owner 拒绝、转派后目标可审批原 owner 不能、双后端持久化
-> 矩阵 P3 注记「转派已完成」;CHANGELOG
```
## 4. 已确认决策
任务重量:
- 档位:轻型(ApprovalBackend + 双后端 + harness + 网关 + 测试)。
- 规模依据:新增一个 transfer 方法(文件/DB 各一)+ harness 封装 + 端点;沿用 decide 的 CAS/事务模式;风险 LOW。
- 选择原因:P3 剩余项中委托之后的自然增量。
P0/P1 决策(按 Q1 推荐采纳):
- 决策 1(P0):本轮切片 = 审批转派(transfer)。
- 决策 2(P1):不新建分支、不提交、不推送。
- 决策 3(P1):验证深度 = 聚焦转派测试 + 全量黄金回归。
默认假设:
- 假设 1:转派仅 P2 单重审批(P3 需双人分离,转派改变 owner 会破坏 SOD 语义,故 P3 拒绝转派)。
- 假设 2:转派后 `ownerUserId = 目标用户`(原 owner/delegate 不再可审批);历史事件 status=TRANSFERRED 记录 from/to。
- 假设 3:仅当前可审批者(owner 或被委托人)可发起转派;角色策略仍校验。
- 假设 4:`transfer` 返回新 pending 或 None(失败);DB 后端沿用 CAS 重试。
未决但不阻塞:批量转派、委托撤销、转派审计 UI 展示(后续轮)。
## 5. 范围
In scope:
- `server/agent_core/approval_store.py`:`ApprovalBackend.transfer()` 协议 + `ApprovalStore.transfer()`(文件)。
- `server/agent_core/approval_db_store.py`:`DatabaseApprovalStore.transfer()`(DB,CAS)。
- `server/agent_core/harness.py`:`transfer_confirmation(confirm_id, to_user_id)`(校验当前身份可审批 + P2 判定)。
- `server/gateway/app.py`:`TransferRequest` + `POST /api/actions/transfer`。
- `tests/golden/test_approval_transfer.py`(新):owner 转派、非 owner 拒绝、P3 拒绝、转派后目标可批原 owner 不能、DB 持久化。
- 文档:`docs/architecture/harness.md`、`docs/product/plan-completion-matrix.md`(P3 注记)、`docs/CHANGELOG.md`。
Out of scope:
- 批量转派、委托撤销、转派 UI 展示、MySQL 实机故障注入。
- 提交/推送/合并/清理用户改动。
## 6. 成功标准
- 聚焦:`python -m pytest -q tests/golden/test_approval_transfer.py tests/golden/test_approval_store.py tests/golden/test_harness_p3.py -p no:cacheprovider` 通过。
- 全量:`python -m pytest tests/golden -q -p no:cacheprovider`(固定 .venv)≥ 474。
- ruff 干净;git diff --check 无空白错误。
## 7. 验证方式
- 转派单测(owner/非 owner/P3/转派后作用域/DB);全量回归。
## 8. 关键风险
| 风险 | 影响 | 控制方式 |
|---|---|---|
| 转派破坏 P3 SOD | 安全回归 | P3 显式拒绝转派 |
| 转派后作用域不清 | 越权/锁死 | 转派后 owner=目标;测试锁定 |
| DB CAS 不一致 | 竞态 | 沿用 decide 的 CAS 重试模式 |
## 9. 停止条件
- 全量黄金测试非本轮相关回归无法快速定位时暂停。
- 任何提交/推送/合并/清理操作停下等待授权。
## 10. 本轮完成定义
- 实现、测试、文档完成;聚焦与全量通过;矩阵/CHANGELOG 回写;不提交。
- 收口:报告主要结论、关键洞察、需要特别留意的地方。
## 11. 下一步
轻量合并版:主 agent 实现 + 验证 + 收口报告。