change:
forge-ai-hub-flow-actionsstatus: reviewed_passed created: 2026-07-12
| 时间 | 阶段 | 事件 | 结论 |
|---|---|---|---|
| 2026-07-12 | Archive | 归档 forge-ai-hub-secure-actions |
修复后 Spec/Code Quality PASS,Secure Actions 27/27 |
| 2026-07-12 | Direction | 用户要求自动开始并执行下一阶段 | 进入阶段 2.2 Flow Actions Proposal/Apply |
| 2026-07-12 | Mapping | 检查 FlowClient、BusinessFlowService、采购审批和 BPMN 所有权 | 复用真实 FLOW binding 与任务访问校验,不建设第二套节点配置 |
| 2026-07-12 | Security | 检查任务办理入口 | 必须移除 DTO userId 覆盖,并把 taskId 降为需多重校验的定位符 |
<objectCode>:<recordId>;| 时间 | 范围 | 结果 |
|---|---|---|
| 2026-07-12 | 模块装配 | 新增 flow-actions 模块并接入 plugin parent、BOM、Admin 与配置开关 |
| 2026-07-12 | 发布与目录 | FLOW_ACTION 发布快照、grant allowedOperations 交集、固定元工具目录完成 |
| 2026-07-12 | 执行安全 | START/APPROVE/REJECT、USER A、已签收任务、对象/记录/模型绑定复核完成 |
| 2026-07-12 | 身份修复 | completeBusinessTask 不再读取 DTO userId,始终取可信当前用户 |
| 2026-07-12 | 幂等审计 | 新增 ai_capability_flow_action_log 与 V1.0.24;预留、摘要、双身份和结果快照完成 |
| 2026-07-12 | 事务修复 | 流程执行与 SUCCESS 更新进入同一本地事务;更新失败转 FAILED,不遗留永久 RUNNING |
| 2026-07-12 | 确认摘要 | FLOW_ACTION 仅显示 operation、recordId、taskId 安全尾号和请求指纹 |
| 验证 | 结果 | 说明 |
|---|---|---|
| Flow Actions 专项 | PASS,11/11 | 含成功日志更新失败回滚和 20 路并发最多一次副作用回归 |
| Secure Actions 专项 | PASS,29/29 | 含 FLOW_ACTION 分发和安全 elicitation 摘要 |
| Control Plane 专项 | PASS,29/29 | FLOW_ACTION 专用发布与 allowedOperations grant |
| Identity 专项 | PASS,35/35 | 双身份、OAuth Profile、失败关闭 |
| MCP 专项 | PASS,16/16 | 协议 2025-06-18、单 Streamable HTTP 与 transport guard |
| Flow Actions Reactor | PASS,34/34 | JDK 17,-am install -DskipTests |
| Admin 聚合 | PASS,41/41 | JDK 17,package -DskipTests |
| Generator 编译 | PASS | Reactor 编译 438 个源码文件;仅既有 deprecated/unchecked 警告 |
| Mapper XML | PASS | 两个新增 XML 经 xmllint --noout |
| Admin JAR | PASS | 包含 forge-plugin-capability-flow-actions-1.0.0.jar |
| 禁止依赖 | PASS | dependency tree 无 Spring Authorization Server、Sa-Token OAuth2 |
| 静态扫描 | PASS | 无 DTO userId 读取、tenant_id=0、物理 DELETE、${、旧 transport 配置 |
git diff --check |
PASS | 按本变更涉及文件范围执行 |
~/.m2 读取旧 Generator JAR,找不到新 getActionableTaskFormContext;按多模块规则先执行 34 模块 Reactor install,再复跑 10/10 通过。SUCCESS 可见但结果 JSON 尚未可见的测试替身竞态;改为原子替换不可变快照模拟数据库提交可见性后,11/11 通过。生产代码未出现该失败。状态置为 applied_pending_review。下一步应执行 /review forge-ai-hub-flow-actions,Review 修复并通过后再归档。
本轮按两阶段规则只读审查真实代码,不采信 Apply 自述作为合规证据。
| 检查 | 结果 |
|---|---|
| 单 Streamable HTTP、固定元工具、FLOW_ACTION/FLOW/MEDIUM、USER、elicitation、迁移与禁止依赖 | PASS |
| R1 Flow 服务最终 tenant/assignee 授权 | FAIL HARD-GATE;approve/reject 未比较 task.assignee 与 userId,也未显式核对任务租户 |
| R2 顶层伪造参数失败关闭 | FAIL HARD-GATE;handler 投影前未检查未知键,危险顶层字段被静默丢弃 |
| R3 远程副作用幂等与恢复 | FAIL HARD-GATE;远程提交成功、本地事务失败时可形成 orphan/FAILED/pending 组合 |
| R4 businessKey 契约 | FAIL;历史 link 场景实际 Flowable key 会追加 :R... |
| R5 发布版本事实 | FAIL;来源 SQL 未锚定 design version 的 PUBLISHED 记录 |
| R6 目录契约与 P0 测试 | FAIL;缺 sourceType/behavior/operation,关键安全路径无测试 |
| Flow Actions 专项 | PASS,11/11 |
| Secure Actions 专项 | PASS,29/29 |
| Mapper XML | PASS,xmllint --noout |
执行命令:
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home \
PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH \
mvn -Penable-tests -f forge-framework/forge-plugin-parent/forge-plugin-capability-flow-actions/pom.xml test
mvn -Penable-tests -f forge-framework/forge-plugin-parent/forge-plugin-capability-secure-actions/pom.xml test
xmllint --noout \
forge-framework/forge-plugin-parent/forge-plugin-capability-flow-actions/src/main/resources/mapper/FlowActionExecutionLogMapper.xml \
forge-framework/forge-plugin-parent/forge-plugin-capability-flow-actions/src/main/resources/mapper/FlowActionSourceMapper.xml
未启动任何服务,无需清理 PID;未执行真实 Flyway、Flowable E2E 或模型调用。
Review 结论:NEEDS_FIX。Spec Compliance FAIL,按规则未进入 Code Quality Review;当前状态为 reviewed_with_findings。下一步执行 /fix forge-ai-hub-flow-actions。
| Finding | 修复 | 验证 |
|---|---|---|
| R1 最终授权 | Flow 服务锁定 sys_flow_task,比较 tenant/assignee/status,再比较 Flowable assignee |
7/7 PASS |
| R2 顶层伪造 | invoke 投影前白名单,只允许 capabilityCode/version/recordId/idempotencyKey/arguments | 七类危险字段 PASS |
| R3 远程孤儿 | 任务动作凭证和完成态同事务;FAILED/超时 RUNNING 同摘要恢复;START 固定 key 回填 | 恢复与冲突测试 PASS |
| R4 businessKey | FLOW_ACTION 使用专用稳定 key 入口,普通人工流程保持历史语义 | START adapter 测试 PASS |
| R5 发布事实 | JOIN 精确 PUBLISHED design version,sourceVersion 取发布事实 | Mapper 契约测试 PASS |
| R6 目录/测试 | search/describe 实际输出与 Schema 增加 sourceType/behavior/operation | Handler/Contributor PASS |
新增迁移 V1.0.25__add_flow_task_action_idempotency.sql,只增加 sys_flow_task 的动作幂等字段与索引;未修改 V1.0.24。
无效的目标发行版: 17;改为项目 JDK 17 后通过,属于环境选择修正;* 未加引号被 zsh 展开拒绝,命令未执行任何测试或写操作;加引号后正常执行;mvn -pl forge-admin-server,forge-flow/forge-flow-server -am package -DskipTests:43/43 PASS;xmllint --noout:三个 Mapper XML PASS;禁止依赖/旧 transport/危险 SQL 扫描与 git diff --check PASS。Fix 结论:R1–R6 已完成,状态置为 fixed_pending_review,进入二次 Review。
| Finding | 修复 | 结果 |
|---|---|---|
| R7 SUCCESS 重放被 actionable 预检拦截 | SUCCESS 同摘要直接复用;活动 RUNNING 提前冲突;FAILED/超时 RUNNING 受控恢复 | Flow Actions 19/19 |
R8 独立 Flow 服务无法识别 fdu_ |
60 秒内部 Sa-Token 委托桥,Session 绑定 USER A/tenant/org/client/marker,失败禁止静态账号降级 | Client 2/2、Auth 7/7、Controller 3/3 |
| 普通用户 Token 可探测 delegated START | 专用入口要求权限并验证 Token Session 委托标记 | verifier/controller PASS |
| 委托 device 可能受共享/并发策略复用 | 每次签发唯一 device;空 Token、空 Session、非正 clientId 失败关闭 | Auth 7/7 |
| 同租户跨套件重名对象可能误取 FLOW binding | Source SQL 同时要求 b.target_id=o.id 和 target_code |
Mapper 契约与 XML PASS |
| Flowable 完成后任务状态写回结果被忽略 | 状态与幂等凭证必须更新一行,否则抛错回滚 | Flow 编译、授权测试与聚合 PASS |
mvn -pl forge-admin-server,forge-flow/forge-flow-server -am package -DskipTests:43/43 PASS;xmllint --noout:Flow Actions 两个 Mapper 与 FlowTaskMapper PASS;tenant_id=0、业务 ${...}、物理 DELETE;相关文件无尾随空格;forge-server 后 PASS,未产生代码或环境副作用。二次 Spec Compliance 与 Code Quality 均 PASS,状态置为 reviewed_passed,允许归档。