See Ordinum in action
A real run, step by step.
Ordinum testing stock ROS 2 Nav2 under injected faults: what it checked, what it saw, how it reproduced the failure, and why we classified it as our own harness artifact.
Evidence classification: Real external target · Harness artifact
Fault configuration, not a Nav2 defect.
WALKTHROUGH, section 001
Seven steps, one recorded failure case.
Every value below comes from the committed report, traces and meta file for one Nav2 pilot failure: the schedule that found it, its minimized form (the run shown) and 10 replays on fresh seeds.
Step 01: System under test
Nav2 1.3.13 on ROS 2 Jazzy, unmodified, in a pinned Docker image with no network access, on a simplified loopback simulator (no physics, no state estimator). Task 8 (depot_ne_diag) on the depot map, with a 34 s deadline.
- Target
- nav2_loopback · sim_time
- Image
- ros:jazzy-ros-base@sha256:103b6c4179…ed2410
- Middleware
- rmw_fastrtps_cpp
- Task
- 8 depot_ne_diag · depot map · 34 s deadline
Source: docs/demo/nav2_success_mismatch_compare.html @ c25ba4f
Step 02: Property checked
success_mismatch, a truth-vs-claimed check: Nav2's reported result is compared with the simulator's ground-truth pose, and success counts only within 0.35 m of the goal. The harness records that ground truth; the search never sees it.
- Invariant
- success_mismatch [high]
- Check
- oracle (truth vs claimed)
Source: docs/demo/nav2_success_mismatch_compare.html @ c25ba4f
Step 03: Injected faults
The random search scheduled 4 faults; 3 applied: odometry noise at 1.04 s, transform noise (σ 0.356 m) at 4.40 s, and laser-scan reordering at 6.52 s. A fourth fault waited on a trigger that never fired.
- F1 msg_noise
- odom · σ 0.104 · @ 1.04 s · removed by ddmin
- F2 msg_noise
- tf · σ 0.356 · @ 4.40 s · kept by ddmin
- F3 msg_reorder
- scan · window 3 · @ 6.52 s · kept by ddmin
- F4 msg_nan
- scan · fraction 0.692 · not applied · removed by ddmin
Source: experiments/results/v2/nav2_pilot/raw/confirm/success_mismatch_meta.json
Step 04: Observed behavior
In the minimized run, Nav2 accepted the goal at 0.01 s, replanned about once a second, and reported SUCCEEDED at 11.61 s. The simulator's true pose was 0.80 m from the goal.
- 0.01 s
- bt_navigator · goal accepted
- 11.61 s
- bt_navigator · SUCCEEDED (error 0)
- Counters
- replans 24 · recoveries 0 · BT failures 0
Source: experiments/results/v2/nav2_pilot/raw/confirm/traces/success_mismatch_minimized.jsonl
Step 05: Verifier verdict
success_mismatch violated (severity high): SUCCEEDED at t=11.6101 but the true pose is 0.80 m from the goal (> 0.35 m). A violation is a test failure, not automatically a defect; it still has to be classified.
- 11.61 s
- success_mismatch violated: SUCCEEDED at t=11.6101 but the true pose is 0.80 m from the goal (> 0.35 m)
Source: docs/demo/nav2_success_mismatch_compare.html @ c25ba4f
Step 06: Reproduction & minimization
Nav2 is not deterministic, so Ordinum measured reproduction statistically instead of replaying exactly: 8/10 fresh seeds violated (Wilson 95% CI 49-94%). Delta debugging cut 4 faults to 2 in 26 runs but hit its 600 s cap, so the result is not verified 1-minimal. Transform noise alone reproduced 6/10 in follow-up runs.
- Reproduction
- 8/10 · Wilson 95% CI 49-94% · statistical
- Seeds
- 70000-70009 (fresh seeds)
- Minimization
- 4 → 2 faults · 26 ddmin runs · not verified 1-minimal
- Re-runs
Source: experiments/results/v2/nav2_pilot/raw/confirm/success_mismatch_meta.json
Step 07: Regression artifact
Saved as fail_ca43c26f7e96.json: the minimized scenario, build fingerprint, configuration hash, violated property and reproduction data. Today it asserts the violation recurs in at least 4 of the 10 stored seeds; after a fix it is flipped to require 0. It is stored with the pilot results, not in the committed regression suite, and needs Docker to run. A harness regression check, not a Nav2 bug guard.
- Case
- fail_ca43c26f7e96.json
- Parent scenario
- scn_b2e632175480
- Config
- cfg_00390553f7a8
- Fingerprint
- sha256:fcf9d1083401…c953bc
Source: experiments/results/v2/nav2_pilot/regression/fail_ca43c26f7e96.json
Why this is not a Nav2 defect
The injected noise (σ 0.356 m on the odom→base_footprint transform, from 4.40 s to the end of the run) is physically unrealistic, and this setup has no state estimator to reject it, so the fault corrupted the robot's only position source. A separate adversarial review, briefed to argue against the classification, upheld it.
Read the research“Under physically unrealistic noise on the odometry transform, in a stack with no state estimator, Nav2 reported SUCCEEDED while the simulator's true pose was 0.4-0.8 m from the goal (8/10 replays). This is a robustness observation under an unrealistic fault configuration and a demonstration of the truth-vs-claimed oracle. It is not a Nav2 defect.”
Quoted from: docs/research/nav2_pilot.md §9.1 (separate adversarial review, verdict upheld)
FULL TRACE, section 002
The full trace. Both runs, every event.
Timeline rendered from the recorded traces: harness ground truth and what Nav2 reported, on separate lanes.
Real trace / success_mismatch / task 8 depot_ne_diag
ddmin output, replayed at exec seed 70001. This run violates the invariant.
Real trace of the Nav2 success_mismatch case (minimized run, exec seed 70001). Fault 1: msg_noise on tf, applied at 4.40 s. Fault 2: msg_reorder on scan, applied at 6.52 s. Nav2 result: SUCCEEDED (error 0) at 11.61 s. Oracle: SUCCEEDED at t=11.6101 but the true pose is 0.80 m from the goal (> 0.35 m).
Event log · select an event to locate it · key events
Real trace: docs/demo/nav2_success_mismatch_compare.html @ c25ba4f
Lanes from experiments/results/v2/nav2_pilot/raw/confirm/traces/success_mismatch_minimized.jsonl. The committed HTML report does not draw the behavior-tree lane; it comes from the committed minimized trace. Times are simulation seconds from goal dispatch.
Report preview · nav2_success_mismatch_compare.html
fail_ca43c26f7e96 · nav2_loopback
success_mismatch [high] on task 8 (depot_ne_diag)
SUCCEEDED at t=11.6101 but the true pose is 0.80 m from the goal (> 0.35 m)
Original scenario · 4 scheduled, 3 applied
- msg_noise · odom@ 1.04 sduration_s=9.936 σ=0.104removed by ddmin
- msg_noise · tf@ 4.40 sduration_s=12.714 σ=0.356kept by ddmin
- msg_reorder · scan@ 6.52 sduration_s=1.225 window=3kept by ddmin
- msg_nan · scannot appliedduration_s=3.852 fraction=0.692 · trigger bt:FollowPath:FAILURE#1removed by ddmin
Exec seed 697847706: no violation (Nav2 ABORTED, error 103).
Reduced scenario · 2 faults
- msg_noise · tf@ 4.40 sduration_s=12.714 σ=0.356
- msg_reorder · scan@ 6.52 sduration_s=1.225 window=3
Exec seed 70001: Nav2 SUCCEEDED at 11.61 s; violation: success_mismatch.
Reproduction · statistical
Wilson 95% CI 49-94%
exec seeds 70000-70009 (fresh seeds)
Minimization · ddmin
4 → 2 faults · 26 runs
oracle statistical(n=10,k=3)
not verified 1-minimal (600 s cap)
Target and build identity
- Target
- nav2_loopback · sim_time
- Fingerprint
- sha256:fcf9d1083401…c953bc (full value sha256:fcf9d1083401ba4c4844a2c33af3f2790bcdef747b25cc21f0adaec7c0c953bc)
- Base image
- ros:jazzy-ros-…ed2410 (full value ros:jazzy-ros-base@sha256:103b6c417973394659af6804d4917cd489b91e5ed22eb7bef263025a3bed2410)
- Middleware
- rmw_fastrtps_cpp
- Config
- cfg_00390553f7a8
- Run / trace
- run_2a46d6fcdfbf · trc_838a45be2c585670
- Found by
- random arm · campaign seed 1001 · execution 15
- Regression case
- experiments/results/v2/nav2_pilot/regression/fail_ca43c26f7e96.json
Environment: ROS 2 loopback simulator (no EKF, no AMCL; map→odom static).
Real report: docs/demo/nav2_success_mismatch_compare.html @ c25ba4f
Re-rendered from the committed report, traces and meta file; not a screenshot. From the private product repository; the original reports are not yet published.
fail_ca43c26f7e96 · nav2_loopback
success_mismatch [high] on task 8 (depot_ne_diag)
SUCCEEDED at t=11.6101 but the true pose is 0.80 m from the goal (> 0.35 m)
Original scenario · 4 scheduled, 3 applied
- msg_noise · odom@ 1.04 sduration_s=9.936 σ=0.104removed by ddmin
- msg_noise · tf@ 4.40 sduration_s=12.714 σ=0.356kept by ddmin
- msg_reorder · scan@ 6.52 sduration_s=1.225 window=3kept by ddmin
- msg_nan · scannot appliedduration_s=3.852 fraction=0.692 · trigger bt:FollowPath:FAILURE#1removed by ddmin
Exec seed 697847706: no violation (Nav2 ABORTED, error 103).
Reduced scenario · 2 faults
- msg_noise · tf@ 4.40 sduration_s=12.714 σ=0.356
- msg_reorder · scan@ 6.52 sduration_s=1.225 window=3
Exec seed 70001: Nav2 SUCCEEDED at 11.61 s; violation: success_mismatch.
Reproduction · statistical
Wilson 95% CI 49-94%
exec seeds 70000-70009 (fresh seeds)
Minimization · ddmin
4 → 2 faults · 26 runs
oracle statistical(n=10,k=3)
not verified 1-minimal (600 s cap)
Target and build identity
- Target
- nav2_loopback · sim_time
- Fingerprint
- sha256:fcf9d1083401…c953bc (full value sha256:fcf9d1083401ba4c4844a2c33af3f2790bcdef747b25cc21f0adaec7c0c953bc)
- Base image
- ros:jazzy-ros-…ed2410 (full value ros:jazzy-ros-base@sha256:103b6c417973394659af6804d4917cd489b91e5ed22eb7bef263025a3bed2410)
- Middleware
- rmw_fastrtps_cpp
- Config
- cfg_00390553f7a8
- Run / trace
- run_2a46d6fcdfbf · trc_838a45be2c585670
- Found by
- random arm · campaign seed 1001 · execution 15
- Regression case
- experiments/results/v2/nav2_pilot/regression/fail_ca43c26f7e96.json
Environment: ROS 2 loopback simulator (no EKF, no AMCL; map→odom static).
Real report: docs/demo/nav2_success_mismatch_compare.html @ c25ba4f
Re-rendered from the committed report, traces and meta file; not a screenshot. From the private product repository; the original reports are not yet published.
TWO MORE REAL RUNS, section 003
What else a result can be.
Evidence classification: Real external target · Expected behavior
Nav2 drives around an obstacle
An obstacle was inserted at 3.0 s. Nav2 replanned about once a second and reported SUCCEEDED at 17.46 s. No property violated. One run; reproduction was not measured.
Real report: docs/demo/nav2_obstacle_nominal.html @ c25ba4f
Evidence classification: Controlled positive control
A planted bug on our toy robot
On our in-house toy robot, an obstacle plus a corrupted controller value drove the robot off its grid at step 9. The toy is deterministic, so replay is exact: 5/5. Minimization kept the 2 faults that applied out of 6 scheduled. We planted this bug; it is a check on the engine, not a discovery.
Real report: docs/demo/toy_failure_compare.html @ c25ba4f
Broker and cross-system testbed runs (experimental) are on the Research page:
- MQTT integrationHarness artifact · no confirmed finding
- Cross-system testbedExpected behavior
Provenance
, section 004Read from the Ordinum product repository (private research branch ordinum-2). Demo artifacts were copied at commit c25ba4f and are unchanged at 124dde072. The original HTML reports are not yet published on this site.
- Branch
- ordinum-2
- Commit
- c25ba4f478eda03e8b1fc482206121a7f5bc78d8
- docs/demo/nav2_success_mismatch_compare.html @ c25ba4f
- experiments/results/v2/nav2_pilot/raw/confirm/traces/success_mismatch_original.jsonl
- experiments/results/v2/nav2_pilot/raw/confirm/traces/success_mismatch_minimized.jsonl
- experiments/results/v2/nav2_pilot/raw/confirm/success_mismatch_meta.json
- experiments/results/v2/nav2_pilot/regression/fail_ca43c26f7e96.json
- docs/demo/nav2_obstacle_nominal.html @ c25ba4f
- docs/demo/toy_failure_compare.html @ c25ba4f
DESIGN PARTNERS
Help us test the failures your team struggles to reproduce.
We're looking for design partners: engineering and product-security teams working on connected devices, robotics, or systems where cloud, broker and device meet. Tell us about a failure that is hard to reproduce; it shapes which integrations we build next.
Research-stage. No pricing or pilot terms yet.