Files
orbit/docs/reports/phase-4-definitions.md

49 lines
5.8 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.
# P4 子项:定义校验与不可变发布
日期:2026-09-18。本子项已通过验收。范围是研发定义格式、静态校验、定义创建、版本发布/读取及独立SDK。实例启动、推进、信号/时间等待、暂停/恢复和轮询执行仍未实现;本报告不构成P4整体或生产高可用验收。
## 实现
- `weave/definition`提供schema_version=1结构及类型契约,六类节点、词法引用、条件、并行汇合和有限预算校验。不会执行上传源码。
- 创建/发布/读取四个HTTP路由,两个显式权限与`--workflow-access`初始化标志。API严格匹配字段,映射值递归检查;仅DSL常量允许显式null,普通任务参数限制保持不变。
- 复用现有两张定义表,未新增迁移、外键、级联或数据库依赖。发布在应用→身份→定义→队列顺序下串行化,版本/revision/审计/回执同事务。中文字段注释随代码保留。
- 同键绑定完整命令,同版本按规则摘要比较;数字使用精确JSON规范化。读取核对原文及结构摘要,损坏或悬空关联拒绝;重复请求仍检查当前队列权限。
- 独立SDK强类型定义、引用构建及四个客户端方法;完整六类节点发布例子和[API](../api/workflow-definitions.md)、[格式](../api/workflow-definition-format.md)、[场景](../examples/workflow-definition.md)同步。
## 回归证据
环境:macOS arm64,Go 1.27.1;Docker隔离MySQL 8.4.10,随机秘密/回环端口,由脚本创建并清理临时容器,不连接已有业务库。
| 检查 | 结果 |
| --- | --- |
| make fmt / test(race)/ vet / build | 通过;覆盖服务端、SDK与独立Inbox/Outbox模块 |
| DSL定向单测 | 顺序/分支/并行类型与作用域、禁用前向/跨分支引用、默认路径、策略完整性、轮次与尝试预算、状态完整分组、深度/数量上限、精确数值与非变更检查通过 |
| HTTP严格JSON | 嵌套map大小写别名/未知字段/重复键/null集合拒绝;DSL显式null常量可用,普通任务null仍拒绝 |
| 数据校验模糊测试 | 2个并行worker、10秒目标,15699次执行,通过(工具耗时11.278秒) |
| 真MySQL发布定向回归 | `TestIntegrationWorkflowDefinitions -count=3`通过,总12.756秒;包含并发、权限、无外键关联、回滚、损坏及数量上限 |
| 真HTTP提交后回执丢失 | 新SDK集成回归通过,1.314秒;服务确认201后代理断开连接,首次调用明确报错,原键重报返回同一版本,revision不重复增长 |
| 六类节点可运行发布例子 | 通过;v1/v2发布及旧版读取,revision=3、steps=8、max_concurrency=2、max_task_attempts=13;没有启动实例 |
| 独立SDK依赖 | GOWORK=off列出依赖,不包含服务端internal/model/platform/pulse/weave、MySQL或ORM |
| 完整隔离链路 | scripts/test-mysql.sh终态退出0;所有19个SDK例子及独立Inbox/Outbox两个例子通过,临时容器已清理 |
并发用例以12个调用竞争6个幂等身份,均取得同一不可变版本,只有一次新发布;随后验证等值小数重报、相邻大整数内容冲突、v2不改变v1、审计次数与父revision,数据库触发器拒绝直接UPDATE。发布不产生Pulse任务。
权限用例覆盖默认凭据无定义权限、原回执队列权限收回、跨命名空间队列/定义、不存在的父定义/队列、手工删除关联后的拒绝。真实数据库断言外键为0。
故障用例通过隔离库审计写入失败使版本/父revision/幂等身份全部回滚,再用原键成功发布;另外新增损坏摘要记录及删除父记录,确认读取失败。100个定义/100个版本上限真实由API填满,达到上限仍恢复旧回执。
首次完整回归在发布人读取上发现VARCHAR文本标识被当作BINARY ID扫描;修正为文本读取后再校验ID。三次定向回归已覆盖修正。本报告保留此失败记录,未将此前未到达的SDK链路视为通过。
最终完整回归中,存储集成108.239秒(定义子项2.42秒),Worker SDK91.133秒,计划5.782秒,队列4.458秒,批量1.378秒,查询1.335秒,订阅管理33.363秒,事件消费52.103秒,任务恢复3.418秒,定义SDK1.314秒;独立Inbox35.669秒、Outbox33.839秒,应用额度1.481秒。10个SDK进程故障父用例全部通过,总95.274秒,其中重试全停恢复四场景33.10秒;独立Inbox/Outbox另各有一个进程故障父用例。本次全链路零失败,已确认终态退出及容器清理,没有以日志片段或等待超时替代完成结论。
复现:`make fmt test vet build`、`make integration`;定向用例为`go test -race -count=3 -run '^TestIntegrationWorkflowDefinitions$' ./internal/storage/mysql`(只在隔离库设置ORBIT_TEST_MYSQL_DSN)。SDK定义用例在全量脚本中使用专门签发的流程权限运行。最后完整回归后仅补文档证据,没有修改运行代码。
## 后续边界
P4下一步是启动实例、固定版本与输入、同事务创建首批任务、内部事件接续和有界推进;继而交付顺序/条件/并行、信号与持久化定时等待。P5补齐轮询运行、门控、取消及有证据人工恢复。现在发布格式支持节点,不等于节点运行器已存在。
启动时必须再次核对定义版本、当前权限、队列与实际运行参数;JSON来源可能为null或超出Pulse字段限制,不能以静态校验代替运行校验。数据库列、已保存规则和SDK版本兼容都需要进入后续升级回归。
独立发布操作的数据库COMMIT回执丢失尚未单独注入;已有回滚及HTTP提交后回执丢失场景不能替代全部存储故障。定义列表、删除/归档、配置化额度、凭据轮换、容量、MySQL故障切换、备份和滚动升级继续按P6–P7处理;不承诺未经验证的生产吞吐和可用性。