execution-log.md 10 KB

执行日志 — Forge AI 中枢受控业务动作

change: forge-ai-hub-secure-actions status: done created: 2026-07-12

1. 启动记录

时间 阶段 事件 结论
2026-07-12 Archive 归档 mcp-user-delegation-identity Identity 34/34、MCP 14/14、Admin 39/39,状态 done
2026-07-12 Direction 用户要求开始新阶段开发 进入阶段 2.1 secure actions Proposal/Apply
2026-07-12 Mapping 检查 Capability/MCP/Control Plane/Generator 复用已发布业务动作,但必须增加发布快照、字段交集、R2 elicitation 和幂等指纹加固
2026-07-12 Protocol 检查 MCP SDK 0.17.0 公开 API McpSyncServerExchange.createElicitation 可用于同调用 R2 确认,无需旧 SSE 或自建确认 Token

2. 已冻结边界

  • 固定元工具而非动态顶层业务 Tool;
  • 仅 BUSINESS_ACTION/ACTION/MEDIUM;
  • 仅 UPDATE_FIELD/CREATE_RECORD;
  • 只允许 USER Token invoke;
  • 字段白名单三方交集;
  • elicitation ACCEPT 后同步执行;
  • 不含 Flowable、消息、领域动作、R3、Nacos、Agent Runtime 和真实模型调用。

3. Apply 进展

执行时间:2026-07-12 12:04–12:10 +08:00。

  • MCP:新增 McpToolContributor 与启动期聚合器;固定工具按名称稳定排序,重复名称失败关闭;ping 改为默认 contributor;
  • MCP 验证:16 tests,0 failures,0 errors;既有 STREAMABLE/SYNC Guard 回归保持;
  • Generator:新增发布版本 Mapper XML、发布动作解析和 executePublished 入口;
  • 幂等:请求指纹改为 canonical JSON 的 SHA-256,不再把参数值写入日志;相同幂等键不同请求拒绝;
  • Generator 验证:BusinessActionExecutionServiceTest 3/3,模块 compile PASS;
  • 模块:创建 forge-plugin-capability-secure-actions,接入 plugin parent、BOM 和 Admin;默认未启用,避免未完成 Tool 误开放;
  • 聚合编译:Secure Actions -am compile,33/33 reactor modules SUCCESS;
  • 本轮未启动服务、未执行 Flyway、未调用真实模型、未 commit/push。

4. Apply 收尾验证

执行时间:2026-07-12 12:57–13:18 +08:00。

4.1 增量实现与缺陷修正

  • Secure Actions:完成业务动作专用发布、ACTION grant、动态授权目录、search/describe/invoke、MCP elicitation、字段三方交集和双审计关联;
  • Schema:修复发布 Schema 缺少 Draft 2020-12 声明的问题,三个固定元工具补齐 outputSchema、annotations、text JSON 和 structuredContent
  • 权限:固定元工具显式校验 capability:discover / capability:invoke 或能力级 scope,再叠加 client grant、平台权限、动作权限、tenant/activeOrg;OAuth metadata 与请求校验器同步支持受治理目录的通用 scope;
  • 目录:从固定 51 条改为 capability_code + id keyset 分批扫描,权限过滤后仍能准确返回 hasMore,不把全量授权加载进内存;
  • 执行:调用前重新从指定发布版本读取动作和模型快照,校验版本字段 ∩ grant 字段 ∩ 发布模型可写字段;创建动作允许省略 recordId
  • 错误与审计:增加 INSUFFICIENT_SCOPEPOLICY_MISMATCHIDEMPOTENCY_CONFLICT 稳定错误码;Schema 越权映射为 INVALID_ARGUMENT 并在审计中只记录 Schema 路径;审计写入异常只记录 requestId、capabilityCode、exceptionType;
  • Generator:发布快照与 canonical SHA-256 幂等指纹生效,业务动作日志记录 capability requestId、clientId、serviceUserId、actorType,不保存参数值。

4.2 执行证据

验证项 命令/范围 结果
当前 Reactor 依赖安装 mvn -pl ...forge-plugin-capability-secure-actions -am install -DskipTests 33/33 SUCCESS
Secure Actions 模块 mvn -Penable-tests test 18/18 PASS
Generator 专项 BusinessActionExecutionServiceTest,BusinessObjectActionServicePublishedTest 7/7 PASS
Control Plane 模块 mvn -Penable-tests test 24/24 PASS
MCP 模块 mvn -Penable-tests test 16/16 PASS;协议 2025-06-18、STREAMABLE/SYNC Guard 保持
Identity 模块 mvn -Penable-tests test 35/35 PASS
Admin 聚合 mvn -pl forge-admin-server -am package -DskipTests 40/40 SUCCESS
禁用依赖 Admin dependency:tree includes 扫描 无 Spring Authorization Server、无 Sa-Token OAuth2
XML/SQL xmllint + placeholder/tenant/DELETE 扫描 PASS;V1.0.23 未实库执行
传输 MCP/Identity/Secure Actions 静态扫描 仅 Guard/负向测试出现 SSE、STATELESS、stdio、ASYNC;运行配置仍为单 /mcp Streamable HTTP

4.3 基线差异与跳过项

  • 首次从 Secure Actions 子模块直接测试时解析到本地仓库旧 Generator 构件,导致新发布快照类型不可见;通过 Reactor -am install -DskipTests 安装当前工作区构件后解决,产品代码无需兼容旧构件;
  • 首次执行 -am test 时,Generator 全量基线 289 项中存在 2 failures + 1 error:FormulaExecutionEngineLookupTestFormulaValueMaskerTestLowcodeRuntimeConfigBuilderTest。这些测试不在本轮改动路径;本轮 Generator 专项 7/7 和 Admin 聚合编译均通过,未修改无关公式/低代码逻辑;
  • 未启动 Admin,避免 Flyway 自动修改真实数据库;V1.0.23 仅做静态验收;
  • 未接入真实支持 elicitation 的外部 MCP 客户端,使用 SDK exchange mock 覆盖 ACCEPT/DECLINE/CANCEL/不支持 elicitation;
  • 未调用真实大模型,未启动后台服务,未产生需清理 PID,未 commit/push。

5. Apply 结论

阶段 2.1 受控业务动作已达到 applied_pending_review:写副作用必须依次通过可信 USER 身份、Token scope、实时 client grant、用户权限、租户/组织、发布快照、字段交集、幂等键和 MCP elicitation ACCEPT + confirm=true。流程、消息、领域动作、高风险动作、旧 SSE/STATELESS/stdio/ASYNC 仍失败关闭。

6. Review 执行记录(2026-07-12)

本轮只读审查实现,没有修改产品代码、启动服务、执行 Flyway、调用真实模型或写数据库。

检查 结果
固定 Tool、Streamable HTTP、USER/Scope/权限、发布快照、elicitation、幂等、禁用依赖 PASS
R1 grant 字段交集进入运行时 Schema FAIL HARD-GATE;descriptor 保留版本原始 inputSchema,grant 缩小未生效
R2 resolved version source binding FAIL HARD-GATE;SQL 混用 v.version/policyc.source_key/source_version
R3 递归步骤失败关闭 FAIL HARD-GATE;validator 只遍历顶层 actionConfig.steps
R4 基础设施不可用错误 FAIL;目录解析故障会成为 INVALID_ARGUMENT,普通 DB 故障成为 EXECUTION_FAILED
R5 Capability 双审计闭环 FAIL;审计异常被吞,业务写入后仍可返回成功
R6 elicitation 请求指纹 FAIL;当前摘要只包含 requestId 与 idempotencyKey

Review 结论:NEEDS_FIX。Spec Compliance 未通过,按两阶段规则未进入 Code Quality Review;当前状态为 reviewed_with_findings,不得归档或进入 Flow Actions。下一步执行 /fix forge-ai-hub-secure-actions

7. Fix 执行记录(2026-07-12)

7.1 实现结果

  • R1:运行时输入 Schema 裁剪到版本/grant 交集,invoke 增加显式字段集合校验;
  • R2:授权目录统一读取 resolved version 的 source binding,并同时约束版本行为、风险和可见性;
  • R3:递归扫描步骤容器,顶层兼容 steps/stepList,任何嵌套步骤和未知/禁用类型拒绝;
  • R4:新增 CATALOG_UNAVAILABLE/AUTHORIZATION_UNAVAILABLE/AUDIT_UNAVAILABLE,安全日志不包含原始异常消息或参数;
  • R5:Capability 审计改为写前预留、相同 requestId + 双身份条件更新;审计故障不再静默返回业务成功;
  • R6:elicitation 使用 canonical request SHA-256 指纹,不记录字段值。

7.2 验证证据

验证项 结果
Reactor 当前构件安装 -pl ...forge-plugin-capability-secure-actions -am install -DskipTests,33/33 SUCCESS
Secure Actions 27 tests,0 failures,0 errors
Control Plane 27 tests,0 failures,0 errors
Generator 专项 7 tests,0 failures,0 errors
MCP 16 tests,0 failures,0 errors;协议仍为 2025-06-18 + Streamable HTTP/SYNC Guard
Identity 35 tests,0 failures,0 errors
Admin 聚合 最终复跑 40/40 reactor modules SUCCESS
XML/静态安全 两个 Mapper xmllint PASS;trailing whitespace、禁用认证依赖、arguments 日志、Secure Actions 传输漂移扫描 PASS

首次 Secure Actions 增量测试在 testCompile 阶段因 AssertJ 当前版本的 IteratorAssert 不支持 containsExactly 失败;改为显式收集字段列表后复跑 27/27 通过。该失败未进入产品运行逻辑。

7.3 条件跳过与清理

  • 未启动 Admin 或其它后台服务,未产生需清理 PID;
  • 未执行 V1.0.23 真实 MySQL 迁移,继续保留静态校验证据;
  • 未接真实外部 MCP elicitation 客户端,使用 SDK exchange mock;
  • 未调用真实大模型,未 commit/push。

Fix 结论:R1–R6 已修复并完成增量验证,状态更新为 fixed_pending_review。下一步再次执行 /review forge-ai-hub-secure-actions;复审通过前不归档或进入 Flow Actions。

8. 修复后复审与归档(2026-07-12)

8.1 两阶段复审

  • Spec Compliance:R1–R6 逐项核对实际代码和测试,全部 PASS;
  • Code Quality:未发现 Critical、Important 或阻塞归档的 Minor 问题;
  • HARD-GATE:发布快照、授权字段交集、幂等、elicitation、USER 双身份和写前审计均保持失败关闭,允许进入 Flow Actions。

8.2 增量证据

验证项 结果
Secure Actions 专项 2026-07-12 14:30,27/27 PASS
Mapper XML xmllint --noout PASS
Flyway placeholder V1.0.23 扫描无输出
文本质量 相关 git diff --check PASS
既有回归基线 Control Plane 27/27、Generator 7/7、MCP 16/16、Identity 35/35、Admin 40/40

第一次 placeholder 命令从子模块使用了错误的相对路径并返回“文件不存在”,随后改为正确的 ../../../db/migration/... 路径复跑,无输出;该命令问题不涉及产品代码。

8.3 归档结论

  • 状态更新为 done
  • 归档目录:code-copilot/changes/archive/2026-07-12-forge-ai-hub-secure-actions/
  • 未启动服务、未执行真实 Flyway、未调用真实模型、未产生待清理 PID,未 commit/push。