feat: add bounded workflow decisions and durable result inbox

This commit is contained in:
2026-09-18 01:11:42 +08:00
parent 520e98d9d1
commit 0f7ac5203b
20 changed files with 1909 additions and 9 deletions

View File

@@ -0,0 +1,60 @@
# P4 进展:步骤决策与内部结果交付
日期:2026-09-18。本次完成纯步骤决策器、Pulse结果原子写入Weave Inbox及独立快照迁移;P4整体尚未完成,实例API、消费推进与真实等待运行器仍待开发。设计与边界见[内部基础](../10-workflow-engine-core.md)。
## 代码与数据变化
- weave/engine提供不可变编译结果、1–32变更预算的顺序/分支/并行决策、任务参数与等待描述、精确数字条件及POLL业务状态分类。不会调用业务处理器或授予执行权。
- 结果事务复用现有任务快照查询读取关联;内部交付先于对外结果流行锁,任务/尝试/许可/原事件/内部快照/外部日志/审计/回执一起提交或回滚。
- 新迁移000017为Inbox增加来源任务、激活、状态版本和独立快照4字段,全部中文注释。35个实体、293个直接声明持久化字段,零外键/级联。旧的未验证记录隔离,不按当前任务重建历史。
- 尚无新的公共运行API或SDK;已有定义发布SDK和其余场景随完整回归验证,执行器不作为业务端可调用的SDK暴露。
## 已完成验证
环境:macOS arm64、Go 1.27.1、隔离Docker MySQL 8.4.10。所有数据库测试使用临时库、随机秘密与回环端口。
| 检查 | 证据 |
| --- | --- |
| make fmt / race test / vet / build | 通过,覆盖服务端、SDK和独立Inbox/Outbox模块 |
| 决策器单测 | 预算1/2/32反复重编译及JSON恢复,不重复产生任务;精确数字、分支固定、并行汇合、暂停、类型/大小/状态拒绝、不可达执行、已完成组合完整性、并发只读、SIGNAL/TIMER/POLL准备与查询分类均通过;新增嵌套并行分支耗尽预算后仍遍历其他在途分支的回归,race测试通过 |
| 初始真实MySQL定向回归 | 修正测试夹具未提交非成功结果error_code后,Schema、结果交付、v16升级连续3轮通过,共22.917秒;此轮尚未加入后续自然租约到期用例 |
| 新结果交付用例 | 四种结果、8个并发同完成回执、暂停期间收集、POLL旧激活归属、内部/外部写入失败完整回滚、缺失owner/门控/激活/定义拒绝;独立快照不依赖外部结果日志;实际数据库租约自然到期后转NEEDS_REVIEW并交付一次,重复恢复不再写入 |
| 升级用例 | 真实v16结构及PENDING/LEASED/PROCESSED/QUARANTINED记录升级,历史状态/代次及空来源检查;缺来源的新PENDING被CHECK拒绝;schema与零外键检查通过 |
| 存储全量及无外键检查 | 重跑后全部存储集成测试通过,116.335秒;v7的70个外键移除至0、323个原索引组件保留,新结果唯一索引另行核对。v9额度回填和v16升级通过;直接查询当前测试库外键为0、业务字段空COMMENT为0 |
| 完整隔离回归 | scripts/test-mysql.sh退出0;19个SDK示例与独立Inbox/Outbox共21个例子执行通过,10个SDK进程故障父用例及Inbox/Outbox各自进程故障通过,临时容器已清理 |
| 模型及文档核对 | 含公共Record的293个直接持久化字段声明均有中文注释;799个本地文档链接、53个JSON块校验通过;git diff --check通过 |
完整脚本中的测试组结果如下(秒):
| 测试组 | 耗时 |
| --- | ---: |
| MySQL存储全量 | 116.335 |
| Worker连接及自动运行SDK | 92.477 |
| 计划 / 队列资源SDK | 5.676 / 4.488 |
| 批量受理 / 任务查询SDK | 1.424 / 1.627 |
| 订阅管理 / 事件SDK | 33.392 / 51.871 |
| 人工恢复 / 定义发布SDK | 3.395 / 1.354 |
| 独立Inbox / Outbox | 34.588 / 34.330 |
| 应用额度SDK | 1.503 |
| SDK真实进程故障 | 93.116 |
复现入口(Go及Docker需已安装):
```sh
make fmt test vet build
make integration
```
本次实际通过GO参数选择Go 1.27.1、DOCKER参数选择本机Docker;脚本自行创建隔离数据库,不连接已有业务数据库。数据库环境变量缺失时普通单测会跳过集成用例,不能代替上述真实integration结果。
测试中的流程关联由受控SQL夹具创建,不能作为实例受理实现的证据。数据库写入失败通过触发器注入,之后原完成身份重报成功;没有修改接口约束以接受不合法回执。
首次完整回归暴露两处旧升级测试未适配v17:v9还原夹具遗漏删除新增Inbox字段,v7索引保留比较未单独核验新增唯一索引。已修正夹具并增加该唯一索引列序/唯一性断言,重跑存储全量通过;没有修改历史迁移或放宽零外键检查。
复查另发现决策器在左侧分支耗尽变更预算后,提前返回另一个已有分支,误报其活动子任务不可达。新增测试先复现,再将预算限制保留在新增变更处,继续遍历已有选中路径;恢复后各任务仍只激活一次,最终输出及完整race检查通过。
## 尚未实现及后续工作
下一步实现实例存储适配与Start/Get/步骤查询:认证、固定版本/输入、实例及门控、首批任务与幂等/审计同事务;之后内部事件消费、有限推进检查点、持久化等待、流程来源与SDK接入。POLL轮次、信号竞争、暂停/取消/核查恢复与预算维护继续按P4–P5交付。
本阶段没有真实流程进程重启回归、持久化轮询或信号/定时消费器。P3已有进程故障测试只证明原任务和订阅链路,不能替代Weave运行器验证。增加关联索引读取与快照写入后的吞吐、存储增长、清理及跨版本上线边界继续在P6–P7验证,不声称生产容量和高可用已达标。