多人并行开发机器人系统时,最常见的摩擦不是代码写不出来,而是模块对字段、版本、启动顺序和失败语义的理解逐渐漂移。接口文档如果只靠自然语言,很难及时发现“双方都能运行,但理解不同”。

我的做法是把跨模块消息变成可检查的 schema,并把关键状态变化写成追加式事件,以固定输入进行确定性回放。

Schema 校验输入模块处理追加事件固定 seed 回放比较状态与顺序
合同约束结构与版本事件保存身份与因果回放隔离输出并复核判定

Schema 是边界合同

Schema 应约束必填字段、枚举、范围、版本和条件关系,并为未知版本提供明确拒绝路径。它不能代替业务逻辑,但能让非法输入在模块边界尽早失败,而不是进入运行时后变成模糊状态。

版本迁移要显式。消费者应知道自己接受哪些版本,生产者也应保留兼容测试。仅仅新增一个可选字段,有时仍会改变默认行为,不能假设“JSON 能解析”就兼容。

回放是重新运行判定,不是重发动作

事件应包含稳定身份、单调时间、前序关系、输入摘要和版本指纹。回放时固定 seed、初始状态和事件顺序,检查状态机是否得到相同结果。涉及设备输出的模块必须替换为隔离适配器,避免历史事件再次驱动物理设备。

确定性回放特别适合复现并发边界和取消顺序,但不能证明真实世界完全确定。传感器噪声、操作系统调度和硬件时序仍需在相应层验证。

参考资料

证据边界

本文不公开任何内部 schema、字段名、模块拓扑、任务数据或团队流程,只总结接口治理和回放验证方法。