status: done created: 2026-07-12 complexity: 🔴复杂 parent-stage: Forge AI 中枢阶段 2.3 — R3 高风险人工审批
阶段 2.0~2.2 已完成可信 USER 委托身份、MEDIUM 受控业务动作和流程 START/APPROVE/REJECT。当前 BUSINESS_ACTION/MEDIUM 在 MCP elicitation 确认后可同步执行,但资金、权限、关键状态等 R3 动作不能由 Agent 直接完成。
本变更交付阶段 2.3 最小闭环:把显式发布为 BUSINESS_ACTION/ACTION/HIGH 的动作转换为可恢复审批请求,保存不可变信封加密快照,启动专用 Flowable 人工审批;审批通过回调必须重新授权并使用原幂等键一次性执行。MCP 新增固定查询工具 capability.approval.get,不动态发布审批实例 Tool。
PENDING_APPROVAL + approvalRequestId,审批前业务副作用为 0;capability-approval:<approvalId>,专用 BPMN 非空时不得被代码覆盖;FOR UPDATE,重新校验客户端状态/credentialVersion、grant、服务账号、USER A、tenant/org、能力/版本/策略、动作权限与业务状态摘要;capability.approval.get 只允许原 client + actor 查询安全状态摘要,不返回密文、参数、任务详情或密钥元数据;2025-06-18 的单 Streamable HTTP,不增加旧 SSE/STATELESS/stdio/ASYNC;forge-plugin-capability-high-risk-approval 组合模块;ai_capability_policy 与 ai_capability_approval;BUSINESS_ACTION/HIGH 专用发布入口与审批策略;CapabilityPayloadCrypto 和外部 Secret 版本化 KEK 实现;RESERVED → PENDING_APPROVAL → EXECUTING → SUCCESS/FAILED/REJECTED/EXPIRED/CANCELLED 状态机;capability.approval.get MCP 工具;/mcp Streamable HTTP + fdu USER A
-> capability.invoke
-> 实时 scope/grant/permission/tenant/org + HIGH 版本
-> MCP elicitation ACCEPT
-> Capability invocation audit RESERVED
-> HighRiskApprovalExecutionAdapter
-> 独立短事务预占 ai_capability_approval(RESERVED)
-> canonical request digest + business state digest
-> AES-256-GCM payload + wrapped DEK
-> capability-approval:<id> 启动专用 Flowable
-> PENDING_APPROVAL
-> 返回 approvalRequestId
Flow callback APPROVED
-> SELECT approval FOR UPDATE
-> expiry/client/grant/user/capability/version/policy/business state 重新校验
-> 解密并校验 request digest
-> BusinessActionExecutionService.executePublished(original idempotencyKey)
-> SUCCESS/FAILED
模块依赖固定为 High Risk → Secure Actions/Control Plane/Identity/Generator/Flow Client/MCP SPI。Capability Core 和 MCP transport 不反向依赖高风险模块。
BUSINESS_ACTION,behavior=ACTION,riskLevel=HIGH;approvalMode=FLOWABLE;{
"executeStatus": "PENDING_APPROVAL",
"message": "高风险动作已提交人工审批",
"correlationId": "<requestId>",
"idempotentHit": false,
"approvalRequestId": "<snowflake-id>"
}
重复相同请求返回同一 approvalRequestId,并将 idempotentHit=true。异摘要同幂等键返回 IDEMPOTENCY_CONFLICT。
输入只允许 approvalRequestId。输出只包含 approvalRequestId、capabilityCode/version、status、resultCode、submittedAt、expiresAt、completedAt、correlationId 和安全 message。
CapabilityPayloadCrypto 为协议无关 SPI;默认实现每条记录生成 32 字节随机 DEK;forge.capability.high-risk.crypto.keys.<keyId> 外部配置读取 Base64 32 字节值,activeKeyId 指定写入版本;APPROVAL_CRYPTO_UNAVAILABLE 或 APPROVAL_PAYLOAD_INVALID,不得执行;BusinessActionExecutionService.executePublished;forge_capability_high_risk_approval,businessType 固定 capability-approval;forge_capability_high_risk_approval_form,表单只读展示能力、来源、风险、申请人、字段变更摘要、提交/过期时间;PROCESS_COMPLETED/REJECTED/CANCELED 回调必须幂等;回调异常保留 PENDING/FAILED 对账证据,不吞异常冒充成功。新增下一版本 Flyway:
ai_capability_policy:capability/version、HIGH、flowModelKey、candidateGroup、expireSeconds、status、del_flag 和标准审计字段;ai_capability_approval:幂等域、双身份、credentialVersion、请求/业务摘要、keyId/wrappedDek/iv/ciphertext/authTag、流程关联、状态、稳定结果和标准审计字段;logic_delete_active 约束未删除唯一记录;executePublished;forge.capability.high-risk.enabled=false 停止 HIGH 发布、提交和回调执行;已存在记录保留可审计但不自动执行;forge-plugin-capability-high-risk-approval 并接入 plugin parent、BOM 和 Admin;功能默认关闭,启用时必须提供有效外部 KEK;capability-approval:<id>,返回 PENDING_APPROVAL + approvalRequestId,不会在 MCP 请求线程调用业务执行服务;BusinessCodeFormProvider,只读展示能力、申请人、目标记录、变更摘要和时间,密钥/密文/流程任务信息不返回;FOR UPDATE,重查 policy、client、credentialVersion、服务账号、USER A、tenant/org、grant、能力版本、动作权限、发布模型、业务状态和加密摘要,然后以原幂等键进入 EXECUTING 并至多执行一次;capability.approval.get 只允许原 client/actor/serviceUser/tenant/activeOrg 查询安全状态;2025-06-18、SYNC、单 Streamable HTTP,未新增旧 SSE、stdio、STATELESS 或 ASYNC。review-date: 2026-07-12 conclusion: NEEDS_FIX
Spec Compliance 已覆盖主体架构,但发现 7 个问题:回调未自动装配且事件类包名错误;幂等复用未绑定原 USER A;回调缺 policy/服务账号/客户端过期等重新授权;HIGH 提交前未复核动作步骤和发布字段;流程模型 lookup 故障被当作不存在;默认 BPMN/只读表单/approval.get 缺失;送审结果的 output Schema 和 Capability 审计仍按同步 SUCCESS 建模。
首轮不允许归档,问题明细和修复顺序见 fix-plan.md。
FlowEventContext;capability.approval.get,并对 secret-like 表单字段二次遮蔽;PENDING_APPROVAL;review-date: 2026-07-12 conclusion: PASS
阶段 2.3 范围已满足:BUSINESS_ACTION/ACTION/HIGH 不同步执行;外部版本化 KEK 和不可变密文快照;专用 Flowable 审批;回调重新授权与业务状态复核;原幂等键至多一次执行;固定 ownership 查询工具;单 Streamable HTTP 和禁止依赖边界均通过。
模块依赖方向、Mapper XML、tenant/del_flag、逻辑删除唯一键、异常失败关闭、明文隔离、默认模型保留和条件自动配置通过。Review Fix 后未发现阻断归档的问题。
未执行真实 MySQL Flyway、真实 Flowable 人工审批 E2E 或真实模型调用;这些必须在有隔离环境和审批账号时完成,当前不会被表述为已联调。
最终状态为 reviewed_passed,允许归档阶段 2.3。阶段 2 的代码建设完成,真实环境总体验收仍保留上述条件项。
archive-date: 2026-07-12 archive-status: done
mvn -pl forge-admin-server,forge-flow/forge-flow-server -am package -DskipTests,44/44 模块 BUILD SUCCESS;git diff --check 均通过;