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

System Characteristics: Deterministic Replay, Statistical Verdicts, Evidence Chain, CI-Native

The four system characteristics of the Cyclone deterministic scenario testing kernel: bitwise-reproducible replay per seed, Wilson+SPRT statistical verdicts, a four-piece evidence chain, and CI-native JUnit/Bazel integration.

§1 · PROBLEMWhy nobody trusts test results

The usual fate of a scenario test report: it gets produced, nobody re-checks it, and nobody owns it when things go wrong. Three root causes — irreproducibility (rerun the same scenario, get a different result; a FAIL can’t be regression-verified), verdicts by gut feel (“27 out of 30 passes” — does that pass? nobody can win the argument), and no evidence chain (a pass in the report can’t be traced back to the case version and raw data).

§2 · CHARACTERISTICSFour characteristics, four remedies

§2.1 Deterministic replay Supported

Virtual-time replay with content addressing: identical seeds produce bitwise-identical evidence logs. The clock is virtual, the scheduler deterministic, and replay outputs can be compared by SHA-256 — “works on my machine” ceases to exist.

§2.2 Statistical verdicts Supported

Wilson score lower bounds + SPRT sequential testing — statistical significance instead of hand-tuned thresholds. A verdict reads “0.99 (95% CI lower bound, n=300, case hash recomputable)”, and SPRT stops early once the evidence is conclusive, wasting zero simulation runs.

§2.3 Evidence chain Supported

The four-piece set: case hash + JSONL SHA-256 digest + failure snapshot + JUnit XML — every CI record traces back to the case version and raw data, recomputable by a third party.

§2.4 CI-native

JUnit XML out of the box Supported; rules_cyclone makes scenario tests first-class bazel test citizens Prototype; BES-ready Prototype.

§2.5 Architecture: one kernel, two notions of time

Offline mode trades the real clock for reproducibility; online mode trades back for realism — same scenario YAML, just flip the clock mode:

  Virtual clock Real clock
Replay data Offline mode: a fully controlled lab — reruns with the same seed are bitwise identical Supported Rarely used (replays are in no hurry)
Live bus No sense — live data waits for no one Online mode: the real world live — SocketCAN/UDP ingress with hardware timestamps Supported

Capture once, replay forever: record the bus once on the vehicle, replay offline indefinitely. A layered single engine — C++ kernel + Python scenario layer; the process boundary is the YAML schema + evidence-pack format. Details in the dual-mode clock article.

§2.6 The verdict pipeline

Case YAML → dataset replay → fault injection → SUT → verdicts → evidence report

261 automated tests green · JUnit/Jenkins ready · UDS diagnostics demo Prototype · Bazel ruleset rules_cyclone Prototype.

§2.7 Integration interfaces

For Bazel users Prototype:

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

# BUILD.bazel
cyclone_test(
    name = "aeb_regression",
    scenario = "scenarios/aeb.yaml",
)
# bazel test //... — same graph, same cache, same dashboard as unit tests

Any other CI:

# single-file binary, download and run (planned)
$ cyclone run cases/aeb.yaml --out out/

# JUnit XML → consumed directly by Jenkins / GitLab CI (supported)
out/aeb_report.xml
out/aeb_manifest.json   # evidence index

§3 · DEEP DIVESLearn more

Methodology background:

§4 · HONEST BOUNDARIESHonest boundaries

Scope and non-scope

Non-scope (Cyclone is not) Scope (Cyclone is)
A simulator — CarMaker / Carla own “how real the world is” A testing kernel — it owns “how trustworthy the result is”
Test management — people and process An execution engine — machines and evidence

Run it on your own scenario

A 30-minute demo: AEB regression → inject a fault → open the evidence report.

Book a 30-min demo Get the scenario pack