CYCLONE SOLUTION BRIEF CY-SOL-004 · REV 2026-09-12

系统特性:确定性回放、统计判定、证据链与 CI 原生

Cyclone 确定性场景测试内核的四个系统特性:同 seed 证据日志逐字节一致的确定性回放、Wilson+SPRT 统计判定、四件套证据链、JUnit/Bazel 的 CI 原生集成。

§1 · PROBLEM测试结果为什么没人信

场景测试报告的常见命运:跑出来,没人复核,出事没人认。根子上的原因有三个——不可复现(同一场景重跑结果不一样,FAIL 无法回归验证)、判定靠感觉(”跑了 30 把过 27 把”算不算过,谁也说不服谁)、证据不成链(报告里的 pass 无法回溯到用例版本和原始数据)。

§2 · CHARACTERISTICS四个特性,对应四味药

§2.1 确定性回放 已支持

虚拟时间回放 + 内容寻址:同 seed 的证据日志逐字节一致。时钟是虚拟的,调度是确定的,回放结果可以拿 SHA-256 比对——”我机器上能跑”这件事从此不存在。

§2.2 统计判定 已支持

Wilson 置信区间下界 + SPRT 序贯检验——用统计显著性替代人肉阈值。判定结论长这样:”0.99(95% CI 下界,n=300,case hash 可复算)”,证据攒够就提前下判,不浪费一把仿真。

§2.3 证据链 已支持

四件套:case hash + JSONL SHA-256 digest + 失败快照 + JUnit XML——每条 CI 记录可回溯到用例版本与原始数据,第三方可复算。

§2.4 CI 原生

JUnit XML 开箱即用已支持;rules_cyclone 让场景测试成为 bazel test 一等公民原型验证中;BES 就绪原型验证中。

§2.5 架构:一个内核,两种时间观

离线模式用虚拟时钟换可复现,在线模式用真实时钟换真实感——场景 YAML 不动,拨一下时钟模式即可切换:

  虚拟时钟 真实时钟
回放数据 离线模式:完全受控的实验室,同 seed 重跑比特级一致 已支持 很少用(回放不赶时间)
实采总线 没意义——真实数据不等人 在线模式:真实世界的现场,SocketCAN/UDP 接入 + 硬件时间戳 已支持

capture once, replay forever:实车采一次总线,回到离线模式无限复现。C++ 内核 + Python 场景层的分层单引擎,进程边界 = YAML schema + 证据包格式。详见双模时钟博客。

§2.6 判定流水线

用例 YAML → 数据源回放 → 故障注入 → SUT → 统计判定 → 证据报告

261 项自动化测试全绿 · JUnit/Jenkins 就绪 · UDS 诊断演示原型验证中 · Bazel 规则包 rules_cyclone原型验证中。

§2.7 集成接口

Bazel 用户原型验证中:

# MODULE.bazel
bazel_dep(name = "rules_cyclone", version = "0.1.0")

# BUILD.bazel
cyclone_test(
    name = "aeb_regression",
    scenario = "scenarios/aeb.yaml",
)
# bazel test //... —— 与单元测试同图、同缓存、同看板

其他 CI:

# 单文件二进制,下载即跑(规划中)
$ cyclone run cases/aeb.yaml --out out/

# JUnit XML → Jenkins / GitLab CI 直接消费(已支持)
out/aeb_report.xml
out/aeb_manifest.json   # 证据索引

§3 · DEEP DIVES深入了解

方法学背景阅读:

§4 · HONEST BOUNDARIES诚实边界

范围与非范围

非范围(Cyclone 不是) 范围(Cyclone 是)
仿真器——CarMaker / Carla 负责”世界有多真” 测试内核——负责”测试信不信得过”
测试管理平台——管人和流程 执行引擎——管机器和证据

拿你自己的场景跑一次

30 分钟演示:AEB 回归 → 注入故障 → 打开证据报告。

约 30 分钟演示 获取场景包