Skip to content

feat(falcon): v0.19.5 — first controlled-hover PASS (10 s) + flight recording#50

Merged
avrabe merged 2 commits into
mainfrom
feat/falcon-v0.19.5-tune-hover
May 28, 2026
Merged

feat(falcon): v0.19.5 — first controlled-hover PASS (10 s) + flight recording#50
avrabe merged 2 commits into
mainfrom
feat/falcon-v0.19.5-tune-hover

Conversation

@avrabe
Copy link
Copy Markdown
Contributor

@avrabe avrabe commented May 28, 2026

Summary

First PASS verdict for a controlled hover under real gz physics, plus the first flight recording. The quad lifts off and holds the 2 m setpoint; a 10 s hover meets PASS criteria.

  • v0.19.3 = open-loop ballistic climb
  • v0.19.4 = full cascade wired, didn't lift
  • v0.19.5 = controlled hover PASS

Bench (10 s alt-only PI+D altitude hold)

```
steps=1000 final_dist=0.359m rms_steady=0.390m min_dist=0.002m
counters: imu_recv=2372 (204 Hz) navsat_recv=581 (50 Hz) motor_send=1000
verdict: PASS (final < 0.5 m AND rms < 1.0 m)
```

v0.19.4 → v0.19.5 fixes

Root-caused from the mixer torque-saturation that left the body grounded:

  1. Body inertia 0.7 kg/0.0035 → 2.0 kg/0.0217 (x500-class). Low inertia gave ~150 rad/s² angular accel from one motor's offset thrust — beyond the 100 Hz rate-loop damping bandwidth → positive feedback.
  2. hover_thrust 0.5 → 0.72. At 2 kg the body weighs 19.6 N; motors give 12.3 N at 0.5 PWM (can't lift), 19.6 N at ~0.72.
  3. Altitude PI+D with anti-windup — P-only hovered 0.9 m short; integral reaches the 2 m setpoint (min_dist=0.002 m).

Recording

🎥 Video → YouTube (not committed). Recordings (*.mp4/*.mov/*.webm) are gitignored under recordings/; the repo keeps the trajectory CSV + harness log + render scripts.

  • scripts/animate_flight.py — trajectory animation renderer (matplotlib + ffmpeg) → the clip uploaded to YouTube.
  • scripts/record_gazebo_flight.sh + gui-video.config — one-command gz VideoRecorder capture of live Gazebo 3D footage (needs a display).

What this PASS is — and isn't

Is: verified relay-mix-quad + real bridge + real gz physics controlled hover, altitude held within 0.36 m for 10 s. The altitude controller is a hand-written PI+D (the alt-only diagnostic scenario).

Isn't: the full verified cascade (relay-ekf → relay-pos → relay-att → relay-rate) holding hover. --scenario=hover still has the v0.19.4 instability — a frame-convention sign mismatch between relay's NED torque and gz's ENU MulticopterMotorModel. Negating roll/pitch torque stabilised the first second; full hover needs CW/CCW spin reconciled under the ENU↔NED Z-flip + attitude-angle hold. Also, alt-only hover is stable ~10–12 s then drifts horizontally. Both → v0.19.6.

Verification

  • `cargo test --workspace --all-targets` → 406 passing.
  • `cargo test -p falcon-sitl-gz --features gazebo` → 8/8.
  • gz sim + alt-only bench (10 s) → PASS.
  • `rivet validate` → PASS.

v0.19.6 candidates

  1. Frame-correct the cascade torque path (gyro conversion + mixer output + rotor spin) so --scenario=hover holds level.
  2. Attitude-angle hold → no horizontal drift → 30 s hover.
  3. gz VideoRecorder footage of the full-cascade hover.

🤖 Generated with Claude Code

avrabe and others added 2 commits May 28, 2026 06:46
…ecording

First PASS verdict for a controlled hover under real gz physics, plus
the first flight recording (published to YouTube; repo keeps the
reproducible text evidence + render scripts). The quad lifts off and
holds the 2 m setpoint; a 10 s hover meets PASS criteria.

Bench (10 s alt-only PI+D altitude hold):
  steps=1000  final_dist=0.359m  rms_steady=0.390m  min_dist=0.002m
  counters: imu_recv=2372 (204 Hz) navsat_recv=581 (50 Hz) motor_send=1000
  verdict: PASS  (final < 0.5 m AND rms < 1.0 m)

v0.19.4 → v0.19.5 fixes (root-caused from mixer torque-saturation):
  1. Body inertia 0.7 kg/0.0035 → 2.0 kg/0.0217 (x500-class). Low
     inertia gave ~150 rad/s² angular accel from one motor's offset
     thrust, beyond the 100 Hz rate-loop damping → positive feedback.
  2. hover_thrust 0.5 → 0.72. At 2 kg the body weighs 19.6 N; motors
     give 12.3 N at 0.5 PWM (can't lift), 19.6 N at ~0.72.
  3. Altitude PI+D with anti-windup — P-only hovered 0.9 m short;
     integral reaches the 2 m setpoint (min_dist=0.002 m).

Ships:
  - --scenario=alt-only PI+D altitude hold (verified relay-mix-quad in
    the thrust path); --scenario=alt-rate diagnostic.
  - SDF: 2 kg x500-class body.
  - scripts/animate_flight.py (trajectory animation renderer) +
    record_gazebo_flight.sh + gui-video.config (gz VideoRecorder
    live capture, needs a display).
  - bench-evidence/gz-sim/recordings/ CSV + log (mp4 gitignored →
    YouTube) + 2026-05-28-v0.19.5-controlled-hover-recording.md.
  - FV-FALCON-SIM-011 + FEAT-FALCON-v0.19.5 rollout entry.

Recordings (mp4/mov/webm) are gitignored under recordings/ — they go
to YouTube; only the trajectory CSV + harness log are committed.

What this PASS is: verified relay-mix-quad + real bridge + real gz
physics controlled hover, altitude held within 0.36 m for 10 s.
Altitude controller is a hand-written PI+D (the alt-only diagnostic).

What it ISN'T: the full verified cascade (relay-ekf → relay-pos →
relay-att → relay-rate) holding hover. That path (--scenario=hover)
still has the v0.19.4 instability: a frame-convention sign mismatch
between relay's NED torque and gz's ENU MulticopterMotorModel.
Negating roll/pitch torque stabilised the first second; full hover
needs CW/CCW spin reconciled under the ENU↔NED Z-flip + attitude-angle
hold. Also: alt-only hover is stable ~10–12 s then drifts horizontally.
The 10 s PASS window is genuine controlled hover. Both → v0.19.6.

Verification:
  - cargo test --workspace --all-targets → 406 passing.
  - cargo test -p falcon-sitl-gz --features gazebo → 8/8.
  - gz sim + alt-only bench (10 s) → PASS.
  - rivet validate → PASS.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
https://youtu.be/B6JlFE8pPZ4 — slotted into the bench-findings doc,
FV-FALCON-SIM-011, and the rollout entry.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@temper-pulseengine
Copy link
Copy Markdown
Contributor

Automated review for PR #50

pulseengine/relay:feat/falcon-v0.19.5-tune-hover → pulseengine/relay:main

Verdict: 💬 Comment

Summary: The provided patch introduces several new features and improvements to the Falcon SITL (Simulation in the Loop) environment. The changes include updating the inertial properties of the quadrotor, adding a GUI configuration file for capturing real Gazebo 3D footage of flight tests, and providing scripts for animating trajectory data and recording video. These enhancements will help improve the test

Findings: 0 mechanical (rivet) · 2 from local AI model.

Findings (2):

  1. examples/falcon-sitl-gz/worlds/falcon-quad.sdf:99

            <inertial>
    

    The inertial properties of the quadrotor have been updated to better match the x500-class specifications.

  2. examples/falcon-sitl-gz/scripts/gui-video.config:1

    <?xml version="1.0"?>
    

    A new GUI configuration file has been added to enable capturing real Gazebo footage of flight tests.


Generated by a local AI model and post-validated against a strict JSON contract. Each finding includes the verbatim line being criticised — verify by reading the file at the cited location.

Reviewed at a9fa430

@github-actions
Copy link
Copy Markdown

running 9 tests
test tests::deterministic_across_ticks_with_same_time ... ok
test tests::fresh_stub_has_zero_time ... ok
test tests::innovation_is_quiet_in_stub ... ok
test tests::tick_passes_time_through ... ok
test tests::tick_returns_identity_quaternion ... ok
test tests::tick_returns_zero_position_and_velocity ... ok
test tests::unit_quaternion_check_rejects_clearly_non_unit ... ok
test tests::tick_innovation_within_healthy_range ... ok
test tests::tick_always_emits_unit_quaternion ... ok

test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 9 tests
test tests::deterministic_across_ticks_with_same_time ... ok
test tests::fresh_stub_has_zero_time ... ok
test tests::innovation_is_quiet_in_stub ... ok
test tests::tick_passes_time_through ... ok
test tests::tick_returns_identity_quaternion ... ok
test tests::unit_quaternion_check_rejects_clearly_non_unit ... ok
test tests::tick_returns_zero_position_and_velocity ... ok
test tests::tick_always_emits_unit_quaternion ... ok
test tests::tick_innovation_within_healthy_range ... ok

test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 9 tests
test tests::fresh_stub_has_zero_time ... ok
test tests::deterministic_across_ticks_with_same_time ... ok
test tests::innovation_is_quiet_in_stub ... ok
test tests::tick_passes_time_through ... ok
test tests::tick_returns_identity_quaternion ... ok
test tests::tick_returns_zero_position_and_velocity ... ok
test tests::unit_quaternion_check_rejects_clearly_non_unit ... ok
test tests::tick_innovation_within_healthy_range ... ok
test tests::tick_always_emits_unit_quaternion ... ok

test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 13 tests
test tests::at_zero_error_output_is_zero ... ok
test tests::negative_error_drives_negative_torque ... ok
test tests::out_of_range_dt_clamped_safely ... ok
test tests::positive_error_drives_positive_torque ... ok
test tests::fresh_pid_has_zero_state ... ok
test tests::rate_p02_infinite_setpoint_does_not_propagate ... ok
test tests::rate_p02_nan_input_does_not_propagate ... ok
test tests::output_clamped_to_torque_max ... ok
test tests::rate_p03_step_response_drives_error_to_zero ... ok
test tests::reset_clears_state ... ok
test tests::rate_p02_property ... ok
test tests::rate_p01_anti_windup_holds_integral_at_bound ... ok
test tests::rate_p01_property ... ok

test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 13 tests
test tests::at_zero_error_output_is_zero ... ok
test tests::fresh_pid_has_zero_state ... ok
test tests::out_of_range_dt_clamped_safely ... ok
test tests::negative_error_drives_negative_torque ... ok
test tests::positive_error_drives_positive_torque ... ok
test tests::rate_p02_infinite_setpoint_does_not_propagate ... ok
test tests::rate_p02_nan_input_does_not_propagate ... ok
test tests::rate_p02_property ... ok
test tests::output_clamped_to_torque_max ... ok
test tests::reset_clears_state ... ok
test tests::rate_p03_step_response_drives_error_to_zero ... ok
test tests::rate_p01_property ... ok
test tests::rate_p01_anti_windup_holds_integral_at_bound ... ok

test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 13 tests
test tests::at_zero_error_output_is_zero ... ok
test tests::fresh_pid_has_zero_state ... ok
test tests::negative_error_drives_negative_torque ... ok
test tests::out_of_range_dt_clamped_safely ... ok
test tests::positive_error_drives_positive_torque ... ok
test tests::rate_p02_infinite_setpoint_does_not_propagate ... ok
test tests::rate_p02_nan_input_does_not_propagate ... ok
test tests::output_clamped_to_torque_max ... ok
test tests::rate_p03_step_response_drives_error_to_zero ... ok
test tests::reset_clears_state ... ok
test tests::rate_p01_anti_windup_holds_integral_at_bound ... ok
test tests::rate_p02_property ... ok
test tests::rate_p01_property ... ok

test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.43s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 17 tests
test tests::deterministic_disturbance_recovers ... ok
test tests::deterministic_attitude_cascade_passes ... ok
test tests::deterministic_hover_settles ... ok
test tests::deterministic_step_response_passes ... ok
test tests::deterministic_mission_passes ... ok
test tests::ekf_watchdog_catches_intermittent_fault ... ok
test tests::ekf_watchdog_debounces_transient_spikes ... ok
test tests::ekf_watchdog_ignores_healthy_innovation ... ok
test tests::deterministic_fault_triggers_rtl ... ok
test tests::deterministic_geofence_catches_spoof_and_triggers_rtl ... ok
test tests::noisy_attitude_cascade_still_passes ... ok
test tests::noisy_step_response_still_passes ... ok
test tests::plant_step_full_preserves_unit_quaternion_and_finite_state ... ok
test tests::plant_step_preserves_unit_quaternion ... ok
test tests::noisy_mission_still_reaches_waypoint ... ok
test tests::noisy_fault_still_triggers_rtl ... ok
test tests::deterministic_untethered_mission_visits_all_waypoints ... ok

test result: ok. 17 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s

--- scenario: step ---
samples 5000
final ω (rad/s) [+0.5007, -0.3003, +0.4006]
peak ω above sp 0.0061 rad/s
overshoot 1.2 %
RMS error (steady) 0.0012 rad/s
convergence time 0.139s
loop wall time 687 µs
NaN/∞ seen false
outcome PASS
--- scenario: disturbance ---
samples 5000
final ω (rad/s) [+0.0000, -0.0042, +0.0000]
peak ω above sp 0.8958 rad/s
recovery time 0.141s after impulse
loop wall time 663 µs
NaN/∞ seen false
outcome PASS
--- scenario: hover ---
samples 5000
final ω (rad/s) [-0.0020, +0.0013, -0.0007]
peak ω above sp 0.7683 rad/s
convergence time 0.175s
loop wall time 701 µs
NaN/∞ seen false
outcome PASS
--- scenario: attitude ---
samples 5000
final ω (rad/s) [-0.0001, +0.0000, +0.0000]
peak attitude err 19.989°
RMS error (steady) 0.029° (last 1s)
convergence time 0.352s
loop wall time 894 µs
NaN/∞ seen false
outcome PASS
--- scenario: mission ---
samples 12000
final v (m/s NED) [-0.004, +0.000, +0.003]
peak distance error 10.000 m
final distance 0.010 m
RMS distance (steady)0.015 m (last 2s)
convergence time 4.045s
loop wall time 2436 µs
NaN/∞ seen false
outcome PASS
--- scenario: fault ---
samples 16000
final position (NED) [-37.92, +0.00, +137.55] m
peak EKF innovation 0.9521
RTL detection 0.047s after fault injection
loop wall time 5471 µs
NaN/∞ seen false
outcome PASS
--- scenario: untethered ---
samples 36000
final position (NED) [+0.00, -0.00, -0.01] m
worst waypoint min 0.082 m
final distance home 0.011 m
mission completed in 32.0s
loop wall time 12468 µs
NaN/∞ seen false
outcome PASS
--- scenario: geofence ---
samples 16000
final position (NED) [+9.99, +0.00, -0.02] m
peak true-N (truth) +16.35 m (fence at +15.00 m)
geofence violation at 5.834s
loop wall time 5429 µs
NaN/∞ seen false
outcome PASS
falcon-sitl-hover: PASS

running 9 tests
test engine::tests::test_action_types ... ok
test engine::tests::test_alert_count_bounded ... ok
test engine::tests::test_counter_incrementing_no_alert ... ok
test engine::tests::test_disabled_app_ignored ... ok
test engine::tests::test_counter_reset_on_activity ... ok
test engine::tests::test_empty_table ... ok
test engine::tests::test_multiple_apps ... ok
test engine::tests::test_stalled_app_alert_after_max_miss ... ok
test engine::tests::test_table_full ... ok

test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 17 tests
test tests::deterministic_disturbance_recovers ... ok
test tests::deterministic_attitude_cascade_passes ... ok
test tests::deterministic_hover_settles ... ok
test tests::deterministic_step_response_passes ... ok
test tests::deterministic_mission_passes ... ok
test tests::ekf_watchdog_catches_intermittent_fault ... ok
test tests::ekf_watchdog_debounces_transient_spikes ... ok
test tests::ekf_watchdog_ignores_healthy_innovation ... ok
test tests::deterministic_fault_triggers_rtl ... ok
test tests::deterministic_geofence_catches_spoof_and_triggers_rtl ... ok
test tests::noisy_attitude_cascade_still_passes ... ok
test tests::noisy_step_response_still_passes ... ok
test tests::plant_step_full_preserves_unit_quaternion_and_finite_state ... ok
test tests::plant_step_preserves_unit_quaternion ... ok
test tests::noisy_mission_still_reaches_waypoint ... ok
test tests::noisy_fault_still_triggers_rtl ... ok
test tests::deterministic_untethered_mission_visits_all_waypoints ... ok

test result: ok. 17 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s

Filename Regions Missed Regions Cover Functions Missed Functions Executed Lines Missed Lines Cover Branches Missed Branches Cover

coverage_subjects/geofence_subject_rs/src/lib.rs 48 48 0.00% 5 5 0.00% 23 23 0.00% 0 0 -
crates/relay-att/plain/src/lib.rs 380 31 91.84% 27 6 77.78% 207 29 85.99% 0 0 -
crates/relay-ccsds/plain/src/engine.rs 227 0 100.00% 15 0 100.00% 172 0 100.00% 0 0 -
crates/relay-ccsds/plain/src/sensor_wire.rs 209 4 98.09% 16 0 100.00% 174 0 100.00% 0 0 -
crates/relay-cfdp/plain/src/engine.rs 371 27 92.72% 20 0 100.00% 240 25 89.58% 0 0 -
crates/relay-ci/plain/src/engine.rs 135 3 97.78% 14 1 92.86% 125 3 97.60% 0 0 -
crates/relay-cs/plain/src/engine.rs 237 1 99.58% 18 0 100.00% 162 1 99.38% 0 0 -
crates/relay-ds/plain/src/engine.rs 157 0 100.00% 14 0 100.00% 156 0 100.00% 0 0 -
crates/relay-ekf-stub/plain/src/lib.rs 105 0 100.00% 11 0 100.00% 63 0 100.00% 0 0 -
crates/relay-ekf/plain/src/lib.rs 458 36 92.14% 38 7 81.58% 264 37 85.98% 0 0 -
crates/relay-fm/plain/src/engine.rs 231 6 97.40% 16 0 100.00% 141 5 96.45% 0 0 -
crates/relay-hk/plain/src/engine.rs 239 4 98.33% 15 1 93.33% 159 1 99.37% 0 0 -
crates/relay-hs/plain/src/engine.rs 274 7 97.45% 20 1 95.00% 194 3 98.45% 0 0 -
crates/relay-lc-diff/src/lib.rs 50 1 98.00% 4 0 100.00% 44 1 97.73% 0 0 -
crates/relay-lc/plain/src/engine.rs 270 4 98.52% 23 1 95.65% 106 1 99.06% 0 0 -
crates/relay-mavlink/plain/src/command_long.rs 145 0 100.00% 13 0 100.00% 96 0 100.00% 0 0 -
crates/relay-mavlink/plain/src/crc.rs 85 3 96.47% 10 1 90.00% 53 3 94.34% 0 0 -
crates/relay-mavlink/plain/src/frame.rs 300 3 99.00% 18 1 94.44% 212 3 98.58% 0 0 -
crates/relay-mavlink/plain/src/global_position_int.rs 153 0 100.00% 13 0 100.00% 100 0 100.00% 0 0 -
crates/relay-mavlink/plain/src/heartbeat.rs 161 3 98.14% 19 1 94.74% 144 3 97.92% 0 0 -
crates/relay-md/plain/src/engine.rs 149 0 100.00% 12 0 100.00% 142 0 100.00% 0 0 -
crates/relay-mix-quad/plain/src/lib.rs 201 2 99.00% 14 0 100.00% 105 1 99.05% 0 0 -
crates/relay-mm/plain/src/engine.rs 124 4 96.77% 12 1 91.67% 125 9 92.80% 0 0 -
crates/relay-nid/plain/src/bitpack.rs 281 7 97.51% 14 0 100.00% 164 1 99.39% 0 0 -
crates/relay-nid/plain/src/lib.rs 275 8 97.09% 17 0 100.00% 162 0 100.00% 0 0 -
crates/relay-pos/plain/src/lib.rs 472 26 94.49% 30 5 83.33% 318 29 90.88% 0 0 -
crates/relay-primitives/plain/src/ccsds.rs 174 5 97.13% 12 0 100.00% 116 3 97.41% 0 0 -
crates/relay-primitives/plain/src/compare.rs 35 0 100.00% 4 0 100.00% 35 0 100.00% 0 0 -
crates/relay-primitives/plain/src/crc32.rs 34 0 100.00% 4 0 100.00% 20 0 100.00% 0 0 -
crates/relay-primitives/plain/src/filter.rs 24 0 100.00% 4 0 100.00% 14 0 100.00% 0 0 -
crates/relay-primitives/plain/src/merge.rs 73 1 98.63% 8 0 100.00% 53 1 98.11% 0 0 -
crates/relay-primitives/plain/src/persistence.rs 47 0 100.00% 8 0 100.00% 38 0 100.00% 0 0 -
crates/relay-primitives/plain/src/rate_divide.rs 32 0 100.00% 4 0 100.00% 22 0 100.00% 0 0 -
crates/relay-primitives/plain/src/time_gate.rs 34 0 100.00% 6 0 100.00% 22 0 100.00% 0 0 -
crates/relay-rate/plain/src/lib.rs 358 30 91.62% 27 5 81.48% 211 25 88.15% 0 0 -
crates/relay-sc/plain/src/engine.rs 252 6 97.62% 21 1 95.24% 215 1 99.53% 0 0 -
crates/relay-sca/plain/src/engine.rs 161 3 98.14% 14 1 92.86% 176 3 98.30% 0 0 -
crates/relay-sch/plain/src/engine.rs 140 3 97.86% 14 1 92.86% 47 1 97.87% 0 0 -
crates/relay-tbl/plain/src/engine.rs 236 5 97.88% 15 0 100.00% 152 5 96.71% 0 0 -
crates/relay-to/plain/src/engine.rs 150 0 100.00% 13 0 100.00% 97 0 100.00% 0 0 -
host/relay-sb/src/core.rs 367 4 98.91% 28 0 100.00% 221 3 98.64% 0 0 -
host/witness-wasi-harness/src/main.rs 356 356 0.00% 14 14 0.00% 161 161 0.00% 0 0 -

TOTAL 8210 641 92.19% 624 53 91.51% 5451 381 93.01% 0 0 -

running 5 tests
test tests::phases_are_consistent_with_trajectory_duration ... ok
test tests::quat_error_is_zero_for_identical_quaternions ... ok
test tests::rotate_ned_to_body_identity_passes_through ... ok
test tests::noisy_bench_passes_loose ... ok
test tests::deterministic_bench_passes ... ok

test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

running 9 tests
test tests::args_default_ports_for_gcs_mode ... ok
test tests::args_rejects_missing_mode ... ok
test tests::args_default_ports_for_vehicle_mode ... ok
test tests::handle_inbound_propagates_bad_crc ... ok
test tests::args_rejects_unknown_mode ... ok
test tests::handle_inbound_rejects_unsupported_message ... ok
test tests::handle_inbound_truncated ... ok
test tests::current_timestamp_is_monotone_within_a_run ... ok
test tests::vehicle_and_gcs_exchange_heartbeats_over_udp ... ok

test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s

running 10 tests
test hackrf::tests::gps_sdr_sim_argv_shape_is_stable ... ok
test hackrf::tests::hackrf_argv_shape_is_stable ... ok
test mavlink::tests::altitude_translates_to_down ... ok
test mavlink::tests::build_frame_carries_correct_message_id ... ok
test mavlink::tests::home_projects_to_origin ... ok
test mavlink::tests::mavlink_bench_trips_and_dispatches_on_spoof ... ok
test mavlink::tests::one_hundred_metres_north_projects_to_10000_cm_n ... ok
test mavlink::tests::mavlink_bench_no_violation_no_latch ... ok
test stub::tests::stub_bench_no_violation_no_latch ... ok
test stub::tests::stub_bench_trips_and_dispatches ... ok

test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 8 tests
test physics::tests::gazebo_stub_compiles_and_returns_zeros ... ok
test physics::tests::mock_physics_measure_returns_sensible_imu ... ok
test physics::tests::mock_physics_at_rest_stays_quiet ... ok
test physics::tests::mock_physics_hover_with_full_thrust_climbs ... ok
test tests::gazebo_stub_does_not_panic ... ok
test tests::mock_backend_climbs_under_full_thrust ... ok
test tests::closed_loop_hover_compiles_and_ticks_on_mock ... ok
test tests::evidence_sink_produces_log_and_csv ... ok

test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 17 tests
test tests::deterministic_disturbance_recovers ... ok
test tests::deterministic_attitude_cascade_passes ... ok
test tests::deterministic_hover_settles ... ok
test tests::deterministic_step_response_passes ... ok
test tests::deterministic_mission_passes ... ok
test tests::ekf_watchdog_catches_intermittent_fault ... ok
test tests::ekf_watchdog_debounces_transient_spikes ... ok
test tests::ekf_watchdog_ignores_healthy_innovation ... ok
test tests::deterministic_fault_triggers_rtl ... ok
test tests::deterministic_geofence_catches_spoof_and_triggers_rtl ... ok
test tests::noisy_attitude_cascade_still_passes ... ok
test tests::noisy_step_response_still_passes ... ok
test tests::plant_step_full_preserves_unit_quaternion_and_finite_state ... ok
test tests::plant_step_preserves_unit_quaternion ... ok
test tests::noisy_mission_still_reaches_waypoint ... ok
test tests::noisy_fault_still_triggers_rtl ... ok
test tests::deterministic_untethered_mission_visits_all_waypoints ... ok

test result: ok. 17 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.18s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 10 tests
test tests::att_p01_quaternion_error_is_unit_for_unit_inputs ... ok
test tests::att_p01_shortest_arc_q_err_scalar_non_negative ... ok
test tests::degenerate_input_does_not_propagate_nan ... ok
test tests::att_p03_small_angle_within_one_percent ... ok
test tests::negative_roll_setpoint_gives_negative_x_rate ... ok
test tests::identity_setpoint_at_identity_gives_zero_rate ... ok
test tests::rate_command_clamped_to_rate_max ... ok
test tests::sqrt_f32_matches_libm_within_tolerance ... ok
test tests::twenty_deg_roll_setpoint_gives_positive_x_rate ... ok
test tests::att_p01_property ... ok

test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 22 tests
test engine::tests::test_apid_masking ... ok
test engine::tests::test_checksum_empty ... ok
test engine::tests::test_checksum_single_byte ... ok
test engine::tests::test_encode_decode_roundtrip_telemetry ... ok
test engine::tests::test_checksum_xor ... ok
test engine::tests::test_invalid_version ... ok
test engine::tests::test_too_short_buffer ... ok
test engine::tests::test_validate_packet_too_short ... ok
test engine::tests::test_encode_decode_roundtrip_command ... ok
test engine::tests::test_validate_packet_valid ... ok
test engine::tests::test_version_always_zero_in_output ... ok
test sensor_wire::tests::test_celsius_conversion ... ok
test sensor_wire::tests::test_contact_sensor ... ok
test sensor_wire::tests::test_all_sensor_types ... ok
test sensor_wire::tests::test_encode_decode_roundtrip ... ok
test sensor_wire::tests::test_max_device_id ... ok
test sensor_wire::tests::test_negative_temperature ... ok
test sensor_wire::tests::test_invalid_version ... ok
test sensor_wire::tests::test_too_short ... ok
test sensor_wire::tests::test_packet_size ... ok
test sensor_wire::tests::test_watts_conversion ... ok
test sensor_wire::tests::test_water_sensor ... ok

test result: ok. 22 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 10 tests
test engine::tests::test_bounded_transactions ... ok
test engine::tests::test_cancel_on_max_retransmit ... ok
test engine::tests::test_create_transaction ... ok
test engine::tests::test_get_state_invalid_id ... ok
test engine::tests::test_max_retransmit_cancels ... ok
test engine::tests::test_nak_in_wrong_state_ignored ... ok
test engine::tests::test_nak_retransmit ... ok
test engine::tests::test_state_progression ... ok
test engine::tests::test_eof_transition ... ok
test engine::tests::test_tick_idle_sends_metadata ... ok

test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 8 tests
test engine::tests::test_bad_checksum ... ok
test engine::tests::test_bad_stream_id ... ok
test engine::tests::test_compute_checksum_empty ... ok
test engine::tests::test_compute_checksum_xor ... ok
test engine::tests::test_invalid_cmd_code ... ok
test engine::tests::test_length_mismatch ... ok
test engine::tests::test_valid_command ... ok
test engine::tests::test_valid_stream_id_lookup ... ok

test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 10 tests
test engine::tests::test_batch_check_bounded ... ok
test engine::tests::test_check_nonexistent_region ... ok
test engine::tests::test_check_updates_last_checked ... ok
test engine::tests::test_crc32_empty ... ok
test engine::tests::test_empty_table ... ok
test engine::tests::test_matching_baseline ... ok
test engine::tests::test_mismatched_baseline ... ok
test engine::tests::test_register_region ... ok
test engine::tests::test_table_full ... ok
test engine::tests::test_crc32_known_value ... ok

test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 8 tests
test engine::tests::test_bounded_output ... ok
test engine::tests::test_disabled_filter ... ok
test engine::tests::test_empty_table ... ok
test engine::tests::test_filter_count_bounded ... ok
test engine::tests::test_multiple_destinations ... ok
test engine::tests::test_matching_filter ... ok
test engine::tests::test_no_match ... ok
test engine::tests::test_table_full ... ok

test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 16 tests
test tests::cross_of_parallel_is_zero ... ok
test tests::ekf_p01_tick_preserves_unit_quaternion ... ok
test tests::ekf_p02_extreme_accel_does_not_produce_nan ... ok
test tests::ekf_p02_zero_accel_does_not_produce_nan ... ok
test tests::ekf_p03_innovation_monotone_with_tilt_disagreement ... ok
test tests::ekf_p04_static_rest_converges_to_gravity_aligned ... ok
test tests::ekf_p05_pure_yaw_gyro_does_not_destabilise_attitude ... ok
test tests::fresh_estimator_is_at_identity ... ok
test tests::normalise_nan_returns_none ... ok
test tests::normalise_zero_returns_none ... ok
test tests::quat_mul_identity_left ... ok
test tests::quat_mul_identity_right ... ok
test tests::rotate_inverse_identity_passes_through ... ok
test tests::ekf_p01_property ... ok
test tests::ekf_p02_property_sequence ... ok
test tests::bias_estimate_bounded ... ok

test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s

running 9 tests
test tests::deterministic_across_ticks_with_same_time ... ok
test tests::fresh_stub_has_zero_time ... ok
test tests::innovation_is_quiet_in_stub ... ok
test tests::tick_passes_time_through ... ok
test tests::tick_returns_identity_quaternion ... ok
test tests::tick_returns_zero_position_and_velocity ... ok
test tests::unit_quaternion_check_rejects_clearly_non_unit ... ok
test tests::tick_innovation_within_healthy_range ... ok
test tests::tick_always_emits_unit_quaternion ... ok

test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 10 tests
test engine::tests::test_all_commands_valid ... ok
test engine::tests::test_all_validation_variants ... ok
test engine::tests::test_delete_no_dest_needed ... ok
test engine::tests::test_null_byte_rejected ... ok
test engine::tests::test_empty_path_rejected ... ok
test engine::tests::test_path_too_long ... ok
test engine::tests::test_paths_equal_symmetric ... ok
test engine::tests::test_source_eq_dest_rejected ... ok
test engine::tests::test_valid_path ... ok
test engine::tests::test_valid_copy_command ... ok

test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 8 tests
test engine::tests::test_empty_table_collect_succeeds ... ok
test engine::tests::test_multiple_copies ... ok
test engine::tests::test_output_bounds_check ... ok
test engine::tests::test_sequence_increments ... ok
test engine::tests::test_single_copy ... ok
test engine::tests::test_source_bounds_check ... ok
test engine::tests::test_source_not_found ... ok
test engine::tests::test_table_full_returns_false ... ok

test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 9 tests
test engine::tests::test_action_types ... ok
test engine::tests::test_alert_count_bounded ... ok
test engine::tests::test_counter_incrementing_no_alert ... ok
test engine::tests::test_counter_reset_on_activity ... ok
test engine::tests::test_disabled_app_ignored ... ok
test engine::tests::test_empty_table ... ok
test engine::tests::test_multiple_apps ... ok
test engine::tests::test_stalled_app_alert_after_max_miss ... ok
test engine::tests::test_table_full ... ok

test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 17 tests
test engine::proptests::compare_matches_rust ... ok
test engine::proptests::disabled_never_fires ... ok
test engine::proptests::persistence_requires_consecutive ... ok
test engine::tests::geofence_boundary_inclusive ... ok
test engine::tests::geofence_inside_does_not_trip ... ok
test engine::tests::geofence_outside_e_trips ... ok
test engine::tests::geofence_outside_d_trips ... ok
test engine::tests::geofence_outside_n_trips_once ... ok
test engine::tests::test_bounded ... ok
test engine::tests::test_disabled ... ok
test engine::tests::test_gt_violation ... ok
test engine::tests::test_empty ... ok
test engine::tests::test_ops ... ok
test engine::tests::test_persistence_reset ... ok
test engine::tests::test_persistence ... ok
test engine::tests::test_sensor_filter ... ok
test engine::proptests::output_always_bounded ... ok

test result: ok. 17 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

running 3 tests
test tests::compare_agrees ... ok
test tests::persistence_sequence_agrees ... ok
test tests::single_eval_agrees ... ok

test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

running 55 tests
test command_long::tests::decode_rejects_long_payload ... ok
test command_long::tests::field_offsets_match_spec ... ok
test command_long::tests::crc_extra_is_152 ... ok
test command_long::tests::decode_rejects_short_payload ... ok
test command_long::tests::msg_id_is_76 ... ok
test command_long::tests::payload_length_is_33 ... ok
test command_long::tests::round_trip_rtl ... ok
test command_long::tests::round_trip_with_params ... ok
test command_long::tests::rtl_builder_has_zero_params ... ok
test command_long::tests::rtl_command_id_is_20 ... ok
test crc::tests::empty_input_keeps_seed ... ok
test crc::tests::accumulate_slice_equals_individual ... ok
test crc::tests::mavlink_reference_vector_123456789 ... ok
test crc::tests::order_matters ... ok
test crc::tests::single_byte_zero ... ok
test frame::tests::encode_rejects_payload_length_mismatch ... ok
test frame::tests::encode_rejects_too_small_output ... ok
test frame::tests::frame_msg_id_three_bytes_little_endian ... ok
test frame::tests::frame_payload_length_byte_matches ... ok
test frame::tests::frame_starts_with_magic_v2 ... ok
test frame::tests::peek_message_id_finds_heartbeat ... ok
test frame::tests::peek_rejects_v1_magic ... ok
test frame::tests::rejects_bad_crc ... ok
test frame::tests::rejects_truncated_header ... ok
test frame::tests::rejects_truncated_payload ... ok
test frame::tests::rejects_v1_magic ... ok
test frame::tests::rejects_wrong_crc_extra ... ok
test frame::tests::round_trip_heartbeat_through_frame ... ok
test global_position_int::tests::crc_extra_is_104 ... ok
test global_position_int::tests::decode_rejects_empty ... ok
test global_position_int::tests::decode_rejects_long_payload ... ok
test global_position_int::tests::decode_rejects_short_payload ... ok
test global_position_int::tests::field_offsets_match_spec ... ok
test global_position_int::tests::msg_id_is_33 ... ok
test global_position_int::tests::payload_length_is_28 ... ok
test command_long::tests::round_trip_arbitrary ... ok
test global_position_int::tests::round_trip_extremes ... ok
test global_position_int::tests::round_trip_sample ... ok
test frame::tests::encode_parse_round_trip_arbitrary_seq ... ok
test global_position_int::tests::round_trip_zero ... ok
test heartbeat::tests::crc_extra_is_fifty ... ok
test global_position_int::tests::round_trip_arbitrary ... ok
test heartbeat::tests::custom_mode_little_endian ... ok
test heartbeat::tests::decode_rejects_long_payload ... ok
test heartbeat::tests::decode_empty_payload ... ok
test heartbeat::tests::decode_rejects_short_payload ... ok
test heartbeat::tests::field_offsets_match_spec ... ok
test heartbeat::tests::mav_mode_flag_or_and_contains ... ok
test heartbeat::tests::payload_length_constant ... ok
test heartbeat::tests::round_trip_falcon_default ... ok
test heartbeat::tests::round_trip_gcs_default ... ok
test heartbeat::tests::round_trip_max_values ... ok
test heartbeat::tests::round_trip_zero ... ok
test heartbeat::tests::round_trip_arbitrary ... ok
test frame::tests::parser_never_panics ... ok

test result: ok. 55 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s

running 7 tests
test engine::tests::test_bounded_output ... ok
test engine::tests::test_disabled_entry ... ok
test engine::tests::test_multiple_entries ... ok
test engine::tests::test_empty_table ... ok
test engine::tests::test_rate_divisor_filtering ... ok
test engine::tests::test_single_dwell ... ok
test engine::tests::test_table_full ... ok

test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 10 tests
test tests::high_thrust_with_torque_saturates_gracefully ... ok
test tests::mix_p01_zero_command_gives_thrust_only ... ok
test tests::mix_p02_outputs_in_unit_interval ... ok
test tests::mix_p03_pure_pitch_drives_front_and_back_motors_opposite ... ok
test tests::mix_p03_pure_roll_drives_diagonal_motor_pairs_opposite ... ok
test tests::nan_input_does_not_propagate ... ok
test tests::mix_p03_pure_yaw_drives_cw_and_ccw_pairs_opposite ... ok
test tests::negative_thrust_clipped_to_zero ... ok
test tests::mix_p03_property_single_axis ... ok
test tests::mix_p02_property ... ok

test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

running 8 tests
test engine::tests::test_alignment_error ... ok
test engine::tests::test_boundary_address ... ok
test engine::tests::test_fill_no_alignment_check ... ok
test engine::tests::test_is_aligned ... ok
test engine::tests::test_out_of_range ... ok
test engine::tests::test_size_too_large ... ok
test engine::tests::test_size_zero ... ok
test engine::tests::test_valid_request ... ok

test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 20 tests
test bitpack::tests::bitpack_basic_id_packs_id_and_ua_type_in_same_byte ... ok
test bitpack::tests::bitpack_basic_id_round_trip ... ok
test bitpack::tests::bitpack_decoder_rejects_unknown_protocol_version ... ok
test bitpack::tests::bitpack_location_rejects_oversize_track_byte ... ok
test bitpack::tests::bitpack_location_rejects_wrong_message_type ... ok
test bitpack::tests::bitpack_location_round_trip_on_canonical ... ok
test bitpack::tests::bitpack_location_idempotent_after_canonicalize ... ok
test tests::basic_id_header_byte_is_well_formed ... ok
test tests::basic_id_round_trip ... ok
test tests::decoder_rejects_unknown_protocol_version ... ok
test tests::location_rejects_out_of_range_timestamp ... ok
test tests::location_rejects_out_of_range_track ... ok
test tests::location_rejects_wrong_message_type ... ok
test tests::location_round_trip ... ok
test bitpack::tests::proptest_bitpack_basic_id_round_trip ... ok
test bitpack::tests::proptest_bitpack_location_round_trip_on_canonical ... ok
test tests::proptest_basic_id_round_trip ... ok
test bitpack::tests::proptest_bitpack_decoder_never_panics ... ok
test tests::proptest_location_round_trip_in_range ... ok
test tests::proptest_decoder_never_panics ... ok

test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

running 13 tests
test tests::altitude_above_setpoint_reduces_thrust ... ok
test tests::altitude_below_setpoint_increases_thrust ... ok
test tests::degenerate_input_does_not_propagate ... ok
test tests::at_setpoint_with_zero_velocity_gives_hover_thrust ... ok
test tests::east_position_error_rolls_right ... ok
test tests::forward_position_error_pitches_nose_down ... ok
test tests::pos_p01_bounds_enforced ... ok
test tests::reset_clears_integral ... ok
test tests::yaw_held_when_setpoint_is_nan ... ok
test tests::yaw_setpoint_is_followed ... ok
test tests::tilt_clamped_to_tilt_max ... ok
test tests::v_setpoint_clamped_to_v_max ... ok
test tests::pos_p01_property ... ok

test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

running 34 tests
test ccsds::tests::apid_masked_to_eleven_bits ... ok
test ccsds::tests::checksum_empty_is_zero ... ok
test ccsds::tests::checksum_self_inverse ... ok
test ccsds::tests::decode_too_short ... ok
test ccsds::tests::encode_then_decode_roundtrip ... ok
test ccsds::tests::header_size_is_six ... ok
test ccsds::tests::version_bits_always_zero ... ok
test compare::tests::all_ops_total_on_zero_zero ... ok
test compare::tests::less_than ... ok
test crc32::tests::deterministic ... ok
test crc32::tests::empty_is_zero ... ok
test crc32::tests::known_value_123456789 ... ok
test filter::tests::false_is_drop ... ok
test filter::tests::total_deterministic ... ok
test filter::tests::true_is_keep ... ok
test merge::tests::alternates_under_contention ... ok
test merge::tests::both_empty_is_none ... ok
test merge::tests::fairness_over_four_rounds ... ok
test ccsds::tests::checksum_xor ... ok
test merge::tests::last_flag_updates_correctly ... ok
test merge::tests::only_left_picks_left ... ok
test merge::tests::only_right_picks_right ... ok
test persistence::tests::event_at_threshold_fires ... ok
test persistence::tests::event_below_threshold_is_pending ... ok
test persistence::tests::counter_saturates ... ok
test persistence::tests::no_event_resets ... ok
test rate_divide::tests::divisor_five_emits_every_fifth ... ok
test persistence::tests::persistence_zero_always_fires_on_event ... ok
test rate_divide::tests::divisor_one_always_emits ... ok
test rate_divide::tests::divisor_zero_never_emits ... ok
test time_gate::tests::absolute_due_after ... ok
test time_gate::tests::absolute_due_at_exact ... ok
test time_gate::tests::absolute_not_due_before ... ok
test time_gate::tests::relative_equivalent_to_absolute ... ok

test result: ok. 34 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 13 tests
test tests::at_zero_error_output_is_zero ... ok
test tests::fresh_pid_has_zero_state ... ok
test tests::negative_error_drives_negative_torque ... ok
test tests::positive_error_drives_positive_torque ... ok
test tests::out_of_range_dt_clamped_safely ... ok
test tests::rate_p02_infinite_setpoint_does_not_propagate ... ok
test tests::rate_p02_nan_input_does_not_propagate ... ok
test tests::rate_p02_property ... ok
test tests::rate_p03_step_response_drives_error_to_zero ... ok
test tests::reset_clears_state ... ok
test tests::output_clamped_to_torque_max ... ok
test tests::rate_p01_property ... ok
test tests::rate_p01_anti_windup_holds_integral_at_bound ... ok

test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s

running 11 tests
test core::tests::test_channel_isolation ... ok
test core::tests::test_duplicate_subscribe_idempotent ... ok
test core::tests::test_max_subscribers_per_channel ... ok
test core::tests::test_publish_multiple_subscribers ... ok
test core::tests::test_publish_no_subscribers ... ok
test core::tests::test_queue_full_drops_message ... ok
test core::tests::test_subscribe_and_get ... ok
test core::tests::test_stats_after_unsubscribe ... ok
test core::tests::test_stats_tracking ... ok
test core::tests::test_unsubscribe ... ok
test core::tests::test_unsubscribe_nonexistent ... ok

test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 13 tests
test engine::tests::test_ats_dispatch_at_correct_time ... ok
test engine::tests::test_ats_not_dispatched_early ... ok
test engine::tests::test_ats_not_redispatched ... ok
test engine::tests::test_ats_table_full_returns_false ... ok
test engine::tests::test_dispatch_count_bounded ... ok
test engine::tests::test_empty_store_no_dispatches ... ok
test engine::tests::test_rts_sequence_execution ... ok
test engine::tests::test_rts_stop ... ok
test engine::tests::test_start_rts_empty_sequence_returns_false ... ok
test engine::tests::test_start_rts_invalid_id_returns_false ... ok
test engine::proptests::dispatched_commands_not_redispatched ... ok
test engine::proptests::ats_not_dispatched_early ... ok
test engine::proptests::dispatch_count_always_bounded ... ok

test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

running 8 tests
test engine::tests::test_disabled_not_dispatched ... ok
test engine::tests::test_dispatch_at_exact_time ... ok
test engine::tests::test_dispatch_count_bounded ... ok
test engine::tests::test_multiple_commands_different_times ... ok
test engine::tests::test_not_dispatched_early ... ok
test engine::tests::test_not_redispatched ... ok
test engine::tests::test_table_full_returns_false ... ok
test engine::tests::test_empty_table_no_dispatches ... ok

test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 10 tests
test engine::tests::test_bounded ... ok
test engine::tests::test_disabled ... ok
test engine::tests::test_empty ... ok
test engine::tests::test_enable ... ok
test engine::tests::test_full ... ok
test engine::tests::test_major ... ok
test engine::tests::test_match ... ok
test engine::proptests::major_frame_zero_is_wildcard ... ok
test engine::proptests::disabled_slot_never_fires ... ok
test engine::proptests::tick_output_always_bounded ... ok

test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

running 8 tests
test engine::tests::test_double_buffer_swap ... ok
test engine::tests::test_activate_without_load_fails ... ok
test engine::tests::test_not_found ... ok
test engine::tests::test_load_and_activate ... ok
test engine::tests::test_empty_registry ... ok
test engine::tests::test_register_and_get ... ok
test engine::tests::test_registry_full ... ok
test engine::tests::test_size_mismatch ... ok

test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 7 tests
test engine::tests::test_active_count ... ok
test engine::tests::test_bounded_table ... ok
test engine::tests::test_disabled_subscription ... ok
test engine::tests::test_subscribe_and_include ... ok
test engine::tests::test_empty_table ... ok
test engine::tests::test_not_subscribed ... ok
test engine::tests::test_unsubscribe ... ok

test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 55 tests
test command_long::tests::crc_extra_is_152 ... ok
test command_long::tests::decode_rejects_long_payload ... ok
test command_long::tests::field_offsets_match_spec ... ok
test command_long::tests::msg_id_is_76 ... ok
test command_long::tests::payload_length_is_33 ... ok
test command_long::tests::decode_rejects_short_payload ... ok
test command_long::tests::round_trip_rtl ... ok
test command_long::tests::round_trip_with_params ... ok
test command_long::tests::rtl_builder_has_zero_params ... ok
test command_long::tests::rtl_command_id_is_20 ... ok
test crc::tests::accumulate_slice_equals_individual ... ok
test crc::tests::empty_input_keeps_seed ... ok
test crc::tests::mavlink_reference_vector_123456789 ... ok
test crc::tests::order_matters ... ok
test crc::tests::single_byte_zero ... ok
test frame::tests::encode_rejects_payload_length_mismatch ... ok
test frame::tests::encode_rejects_too_small_output ... ok
test frame::tests::frame_msg_id_three_bytes_little_endian ... ok
test frame::tests::frame_payload_length_byte_matches ... ok
test frame::tests::frame_starts_with_magic_v2 ... ok
test frame::tests::peek_message_id_finds_heartbeat ... ok
test frame::tests::peek_rejects_v1_magic ... ok
test frame::tests::rejects_bad_crc ... ok
test frame::tests::rejects_truncated_header ... ok
test frame::tests::rejects_truncated_payload ... ok
test frame::tests::rejects_v1_magic ... ok
test frame::tests::rejects_wrong_crc_extra ... ok
test frame::tests::round_trip_heartbeat_through_frame ... ok
test global_position_int::tests::crc_extra_is_104 ... ok
test global_position_int::tests::decode_rejects_empty ... ok
test global_position_int::tests::decode_rejects_long_payload ... ok
test global_position_int::tests::decode_rejects_short_payload ... ok
test global_position_int::tests::field_offsets_match_spec ... ok
test global_position_int::tests::msg_id_is_33 ... ok
test global_position_int::tests::payload_length_is_28 ... ok
test frame::tests::encode_parse_round_trip_arbitrary_seq ... ok
test global_position_int::tests::round_trip_extremes ... ok
test global_position_int::tests::round_trip_sample ... ok
test global_position_int::tests::round_trip_zero ... ok
test heartbeat::tests::crc_extra_is_fifty ... ok
test heartbeat::tests::custom_mode_little_endian ... ok
test heartbeat::tests::decode_empty_payload ... ok
test heartbeat::tests::decode_rejects_long_payload ... ok
test heartbeat::tests::decode_rejects_short_payload ... ok
test heartbeat::tests::field_offsets_match_spec ... ok
test heartbeat::tests::mav_mode_flag_or_and_contains ... ok
test heartbeat::tests::payload_length_constant ... ok
test command_long::tests::round_trip_arbitrary ... ok
test heartbeat::tests::round_trip_falcon_default ... ok
test heartbeat::tests::round_trip_gcs_default ... ok
test heartbeat::tests::round_trip_max_values ... ok
test heartbeat::tests::round_trip_zero ... ok
test global_position_int::tests::round_trip_arbitrary ... ok
test heartbeat::tests::round_trip_arbitrary ... ok
test frame::tests::parser_never_panics ... ok

test result: ok. 55 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 10 tests
test hackrf::tests::gps_sdr_sim_argv_shape_is_stable ... ok
test hackrf::tests::hackrf_argv_shape_is_stable ... ok
test mavlink::tests::altitude_translates_to_down ... ok
test mavlink::tests::home_projects_to_origin ... ok
test mavlink::tests::mavlink_bench_no_violation_no_latch ... ok
test mavlink::tests::build_frame_carries_correct_message_id ... ok
test mavlink::tests::mavlink_bench_trips_and_dispatches_on_spoof ... ok
test mavlink::tests::one_hundred_metres_north_projects_to_10000_cm_n ... ok
test stub::tests::stub_bench_no_violation_no_latch ... ok
test stub::tests::stub_bench_trips_and_dispatches ... ok

test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 10 tests
test tests::att_p01_quaternion_error_is_unit_for_unit_inputs ... ok
test tests::degenerate_input_does_not_propagate_nan ... ok
test tests::att_p03_small_angle_within_one_percent ... ok
test tests::att_p01_shortest_arc_q_err_scalar_non_negative ... ok
test tests::identity_setpoint_at_identity_gives_zero_rate ... ok
test tests::negative_roll_setpoint_gives_negative_x_rate ... ok
test tests::rate_command_clamped_to_rate_max ... ok
test tests::sqrt_f32_matches_libm_within_tolerance ... ok
test tests::twenty_deg_roll_setpoint_gives_positive_x_rate ... ok
test tests::att_p01_property ... ok

test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 10 tests
test tests::att_p01_quaternion_error_is_unit_for_unit_inputs ... ok
test tests::att_p01_shortest_arc_q_err_scalar_non_negative ... ok
test tests::att_p03_small_angle_within_one_percent ... ok
test tests::degenerate_input_does_not_propagate_nan ... ok
test tests::identity_setpoint_at_identity_gives_zero_rate ... ok
test tests::negative_roll_setpoint_gives_negative_x_rate ... ok
test tests::rate_command_clamped_to_rate_max ... ok
test tests::sqrt_f32_matches_libm_within_tolerance ... ok
test tests::twenty_deg_roll_setpoint_gives_positive_x_rate ... ok
test tests::att_p01_property ... ok

test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 10 tests
test tests::att_p01_quaternion_error_is_unit_for_unit_inputs ... ok
test tests::att_p03_small_angle_within_one_percent ... ok
test tests::att_p01_shortest_arc_q_err_scalar_non_negative ... ok
test tests::degenerate_input_does_not_propagate_nan ... ok
test tests::identity_setpoint_at_identity_gives_zero_rate ... ok
test tests::negative_roll_setpoint_gives_negative_x_rate ... ok
test tests::sqrt_f32_matches_libm_within_tolerance ... ok
test tests::twenty_deg_roll_setpoint_gives_positive_x_rate ... ok
test tests::rate_command_clamped_to_rate_max ... ok
test tests::att_p01_property ... ok

test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 17 tests
test tests::deterministic_disturbance_recovers ... ok
test tests::deterministic_attitude_cascade_passes ... ok
test tests::deterministic_hover_settles ... ok
test tests::deterministic_step_response_passes ... ok
test tests::deterministic_mission_passes ... ok
test tests::ekf_watchdog_catches_intermittent_fault ... ok
test tests::ekf_watchdog_debounces_transient_spikes ... ok
test tests::ekf_watchdog_ignores_healthy_innovation ... ok
test tests::deterministic_fault_triggers_rtl ... ok
test tests::deterministic_geofence_catches_spoof_and_triggers_rtl ... ok
test tests::noisy_attitude_cascade_still_passes ... ok
test tests::noisy_step_response_still_passes ... ok
test tests::plant_step_full_preserves_unit_quaternion_and_finite_state ... ok
test tests::plant_step_preserves_unit_quaternion ... ok
test tests::noisy_mission_still_reaches_waypoint ... ok
test tests::noisy_fault_still_triggers_rtl ... ok
test tests::deterministic_untethered_mission_visits_all_waypoints ... ok

test result: ok. 17 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s

--- scenario: attitude ---
samples 5000
final ω (rad/s) [-0.0001, +0.0000, +0.0000]
peak attitude err 19.989°
RMS error (steady) 0.029° (last 1s)
convergence time 0.352s
loop wall time 875 µs
NaN/∞ seen false
outcome PASS
falcon-sitl-hover: PASS

running 17 tests
test engine::proptests::compare_matches_rust ... ok
test engine::proptests::disabled_never_fires ... ok
test engine::tests::geofence_boundary_inclusive ... ok
test engine::tests::geofence_inside_does_not_trip ... ok
test engine::tests::geofence_outside_d_trips ... ok
test engine::tests::geofence_outside_e_trips ... ok
test engine::tests::geofence_outside_n_trips_once ... ok
test engine::tests::test_bounded ... ok
test engine::tests::test_disabled ... ok
test engine::proptests::persistence_requires_consecutive ... ok
test engine::tests::test_empty ... ok
test engine::tests::test_gt_violation ... ok
test engine::tests::test_ops ... ok
test engine::tests::test_persistence ... ok
test engine::tests::test_persistence_reset ... ok
test engine::tests::test_sensor_filter ... ok
test engine::proptests::output_always_bounded ... ok

test result: ok. 17 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 1 test
test tests::deterministic_geofence_catches_spoof_and_triggers_rtl ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 16 filtered out; finished in 0.02s

running 16 tests
test tests::cross_of_parallel_is_zero ... ok
test tests::ekf_p02_extreme_accel_does_not_produce_nan ... ok
test tests::ekf_p01_tick_preserves_unit_quaternion ... ok
test tests::ekf_p02_zero_accel_does_not_produce_nan ... ok
test tests::ekf_p03_innovation_monotone_with_tilt_disagreement ... ok
test tests::ekf_p04_static_rest_converges_to_gravity_aligned ... ok
test tests::ekf_p05_pure_yaw_gyro_does_not_destabilise_attitude ... ok
test tests::fresh_estimator_is_at_identity ... ok
test tests::normalise_nan_returns_none ... ok
test tests::normalise_zero_returns_none ... ok
test tests::quat_mul_identity_left ... ok
test tests::quat_mul_identity_right ... ok
test tests::rotate_inverse_identity_passes_through ... ok
test tests::ekf_p01_property ... ok
test tests::bias_estimate_bounded ... ok
test tests::ekf_p02_property_sequence ... ok

test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 16 tests
test tests::cross_of_parallel_is_zero ... ok
test tests::ekf_p01_tick_preserves_unit_quaternion ... ok
test tests::ekf_p02_extreme_accel_does_not_produce_nan ... ok
test tests::ekf_p02_zero_accel_does_not_produce_nan ... ok
test tests::ekf_p03_innovation_monotone_with_tilt_disagreement ... ok
test tests::ekf_p04_static_rest_converges_to_gravity_aligned ... ok
test tests::ekf_p05_pure_yaw_gyro_does_not_destabilise_attitude ... ok
test tests::fresh_estimator_is_at_identity ... ok
test tests::normalise_nan_returns_none ... ok
test tests::normalise_zero_returns_none ... ok
test tests::quat_mul_identity_left ... ok
test tests::quat_mul_identity_right ... ok
test tests::rotate_inverse_identity_passes_through ... ok
test tests::ekf_p01_property ... ok
test tests::ekf_p02_property_sequence ... ok
test tests::bias_estimate_bounded ... ok

test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 16 tests
test tests::cross_of_parallel_is_zero ... ok
test tests::ekf_p01_tick_preserves_unit_quaternion ... ok
test tests::ekf_p02_extreme_accel_does_not_produce_nan ... ok
test tests::ekf_p02_zero_accel_does_not_produce_nan ... ok
test tests::ekf_p03_innovation_monotone_with_tilt_disagreement ... ok
test tests::ekf_p04_static_rest_converges_to_gravity_aligned ... ok
test tests::ekf_p05_pure_yaw_gyro_does_not_destabilise_attitude ... ok
test tests::fresh_estimator_is_at_identity ... ok
test tests::normalise_nan_returns_none ... ok
test tests::normalise_zero_returns_none ... ok
test tests::quat_mul_identity_left ... ok
test tests::quat_mul_identity_right ... ok
test tests::rotate_inverse_identity_passes_through ... ok
test tests::bias_estimate_bounded ... ok
test tests::ekf_p01_property ... ok
test tests::ekf_p02_property_sequence ... ok

test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.58s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 5 tests
test tests::phases_are_consistent_with_trajectory_duration ... ok
test tests::quat_error_is_zero_for_identical_quaternions ... ok
test tests::rotate_ned_to_body_identity_passes_through ... ok
test tests::deterministic_bench_passes ... ok
test tests::noisy_bench_passes_loose ... ok

test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

--- noise=0 (deterministic) ---
samples 5000
RMS error (full) 3.306°
RMS error (steady) 3.312° (last 2.5 s)
peak error 19.804°
final error 3.023°
convergence time 0.68s (first sustained <5°)
estimator wall time 625 µs
NaN/∞ seen false
falcon-ekf-bench: PASS

running 17 tests
test engine::proptests::compare_matches_rust ... ok
test engine::tests::geofence_boundary_inclusive ... ok
test engine::proptests::disabled_never_fires ... ok
test engine::tests::geofence_inside_does_not_trip ... ok
test engine::tests::geofence_outside_d_trips ... ok
test engine::tests::geofence_outside_e_trips ... ok
test engine::tests::geofence_outside_n_trips_once ... ok
test engine::tests::test_bounded ... ok
test engine::tests::test_disabled ... ok
test engine::proptests::persistence_requires_consecutive ... ok
test engine::tests::test_gt_violation ... ok
test engine::tests::test_empty ... ok
test engine::tests::test_ops ... ok
test engine::tests::test_persistence ... ok
test engine::tests::test_persistence_reset ... ok
test engine::tests::test_sensor_filter ... ok
test engine::proptests::output_always_bounded ... ok

test result: ok. 17 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 20 tests
test bitpack::tests::bitpack_basic_id_packs_id_and_ua_type_in_same_byte ... ok
test bitpack::tests::bitpack_basic_id_round_trip ... ok
test bitpack::tests::bitpack_decoder_rejects_unknown_protocol_version ... ok
test bitpack::tests::bitpack_location_idempotent_after_canonicalize ... ok
test bitpack::tests::bitpack_location_rejects_oversize_track_byte ... ok
test bitpack::tests::bitpack_location_rejects_wrong_message_type ... ok
test bitpack::tests::bitpack_location_round_trip_on_canonical ... ok
test tests::basic_id_header_byte_is_well_formed ... ok
test tests::basic_id_round_trip ... ok
test tests::decoder_rejects_unknown_protocol_version ... ok
test tests::location_rejects_out_of_range_timestamp ... ok
test tests::location_rejects_out_of_range_track ... ok
test tests::location_rejects_wrong_message_type ... ok
test tests::location_round_trip ... ok
test bitpack::tests::proptest_bitpack_location_round_trip_on_canonical ... ok
test bitpack::tests::proptest_bitpack_basic_id_round_trip ... ok
test tests::proptest_basic_id_round_trip ... ok
test bitpack::tests::proptest_bitpack_decoder_never_panics ... ok
test tests::proptest_decoder_never_panics ... ok
test tests::proptest_location_round_trip_in_range ... ok

test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 20 tests
test bitpack::tests::bitpack_basic_id_packs_id_and_ua_type_in_same_byte ... ok
test bitpack::tests::bitpack_basic_id_round_trip ... ok
test bitpack::tests::bitpack_decoder_rejects_unknown_protocol_version ... ok
test bitpack::tests::bitpack_location_rejects_oversize_track_byte ... ok
test bitpack::tests::bitpack_location_rejects_wrong_message_type ... ok
test bitpack::tests::bitpack_location_round_trip_on_canonical ... ok
test bitpack::tests::bitpack_location_idempotent_after_canonicalize ... ok
test tests::basic_id_header_byte_is_well_formed ... ok
test tests::basic_id_round_trip ... ok
test tests::decoder_rejects_unknown_protocol_version ... ok
test tests::location_rejects_out_of_range_timestamp ... ok
test tests::location_rejects_out_of_range_track ... ok
test tests::location_rejects_wrong_message_type ... ok
test tests::location_round_trip ... ok
test bitpack::tests::proptest_bitpack_location_round_trip_on_canonical ... ok
test bitpack::tests::proptest_bitpack_basic_id_round_trip ... ok
test tests::proptest_basic_id_round_trip ... ok
test bitpack::tests::proptest_bitpack_decoder_never_panics ... ok
test tests::proptest_decoder_never_panics ... ok
test tests::proptest_location_round_trip_in_range ... ok

test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.19s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 55 tests
test command_long::tests::crc_extra_is_152 ... ok
test command_long::tests::decode_rejects_long_payload ... ok
test command_long::tests::field_offsets_match_spec ... ok
test command_long::tests::decode_rejects_short_payload ... ok
test command_long::tests::msg_id_is_76 ... ok
test command_long::tests::payload_length_is_33 ... ok
test command_long::tests::round_trip_rtl ... ok
test command_long::tests::round_trip_with_params ... ok
test command_long::tests::rtl_builder_has_zero_params ... ok
test crc::tests::accumulate_slice_equals_individual ... ok
test crc::tests::empty_input_keeps_seed ... ok
test command_long::tests::rtl_command_id_is_20 ... ok
test crc::tests::mavlink_reference_vector_123456789 ... ok
test crc::tests::order_matters ... ok
test crc::tests::single_byte_zero ... ok
test frame::tests::encode_rejects_payload_length_mismatch ... ok
test frame::tests::encode_rejects_too_small_output ... ok
test frame::tests::frame_payload_length_byte_matches ... ok
test frame::tests::frame_msg_id_three_bytes_little_endian ... ok
test frame::tests::frame_starts_with_magic_v2 ... ok
test frame::tests::peek_message_id_finds_heartbeat ... ok
test frame::tests::peek_rejects_v1_magic ... ok
test frame::tests::rejects_bad_crc ... ok
test frame::tests::rejects_truncated_header ... ok
test frame::tests::rejects_truncated_payload ... ok
test frame::tests::rejects_v1_magic ... ok
test frame::tests::rejects_wrong_crc_extra ... ok
test frame::tests::round_trip_heartbeat_through_frame ... ok
test global_position_int::tests::crc_extra_is_104 ... ok
test global_position_int::tests::decode_rejects_empty ... ok
test global_position_int::tests::decode_rejects_long_payload ... ok
test global_position_int::tests::decode_rejects_short_payload ... ok
test global_position_int::tests::field_offsets_match_spec ... ok
test global_position_int::tests::msg_id_is_33 ... ok
test global_position_int::tests::payload_length_is_28 ... ok
test command_long::tests::round_trip_arbitrary ... ok
test frame::tests::encode_parse_round_trip_arbitrary_seq ... ok
test global_position_int::tests::round_trip_extremes ... ok
test global_position_int::tests::round_trip_arbitrary ... ok
test global_position_int::tests::round_trip_sample ... ok
test global_position_int::tests::round_trip_zero ... ok
test heartbeat::tests::crc_extra_is_fifty ... ok
test heartbeat::tests::custom_mode_little_endian ... ok
test heartbeat::tests::decode_empty_payload ... ok
test heartbeat::tests::decode_rejects_long_payload ... ok
test heartbeat::tests::decode_rejects_short_payload ... ok
test heartbeat::tests::field_offsets_match_spec ... ok
test heartbeat::tests::mav_mode_flag_or_and_contains ... ok
test heartbeat::tests::payload_length_constant ... ok
test heartbeat::tests::round_trip_falcon_default ... ok
test heartbeat::tests::round_trip_gcs_default ... ok
test heartbeat::tests::round_trip_max_values ... ok
test heartbeat::tests::round_trip_zero ... ok
test heartbeat::tests::round_trip_arbitrary ... ok
test frame::tests::parser_never_panics ... ok

test result: ok. 55 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

Kani-TQ.md
README.md
Verus-TQ.md
miri-TQ.md
spar-TQ.md
witness-TQ.md
64 docs/dossier/tool-qualification/Kani-TQ.md
64 docs/dossier/tool-qualification/README.md
75 docs/dossier/tool-qualification/Verus-TQ.md
82 docs/dossier/tool-qualification/miri-TQ.md
85 docs/dossier/tool-qualification/spar-TQ.md
78 docs/dossier/tool-qualification/witness-TQ.md
448 total

running 8 tests
test physics::tests::gazebo_stub_compiles_and_returns_zeros ... ok
test physics::tests::mock_physics_at_rest_stays_quiet ... ok
test physics::tests::mock_physics_hover_with_full_thrust_climbs ... ok
test physics::tests::mock_physics_measure_returns_sensible_imu ... ok
test tests::gazebo_stub_does_not_panic ... ok
test tests::mock_backend_climbs_under_full_thrust ... ok
test tests::closed_loop_hover_compiles_and_ticks_on_mock ... ok
test tests::evidence_sink_produces_log_and_csv ... ok

test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 1 test
test tests::deterministic_untethered_mission_visits_all_waypoints ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 16 filtered out; finished in 0.04s

running 10 tests
test tests::mix_p01_zero_command_gives_thrust_only ... ok
test tests::high_thrust_with_torque_saturates_gracefully ... ok
test tests::mix_p02_outputs_in_unit_interval ... ok
test tests::mix_p03_pure_pitch_drives_front_and_back_motors_opposite ... ok
test tests::mix_p03_pure_roll_drives_diagonal_motor_pairs_opposite ... ok
test tests::mix_p03_pure_yaw_drives_cw_and_ccw_pairs_opposite ... ok
test tests::nan_input_does_not_propagate ... ok
test tests::negative_thrust_clipped_to_zero ... ok
test tests::mix_p03_property_single_axis ... ok
test tests::mix_p02_property ... ok

test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 13 tests
test tests::at_zero_error_output_is_zero ... ok
test tests::negative_error_drives_negative_torque ... ok
test tests::fresh_pid_has_zero_state ... ok
test tests::out_of_range_dt_clamped_safely ... ok
test tests::positive_error_drives_positive_torque ... ok
test tests::rate_p02_infinite_setpoint_does_not_propagate ... ok
test tests::rate_p02_nan_input_does_not_propagate ... ok
test tests::output_clamped_to_torque_max ... ok
test tests::rate_p02_property ... ok
test tests::reset_clears_state ... ok
test tests::rate_p03_step_response_drives_error_to_zero ... ok
test tests::rate_p01_anti_windup_holds_integral_at_bound ... ok
test tests::rate_p01_property ... ok

test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 17 tests
test tests::deterministic_disturbance_recovers ... ok
test tests::deterministic_attitude_cascade_passes ... ok
test tests::deterministic_hover_settles ... ok
test tests::deterministic_step_response_passes ... ok
test tests::deterministic_mission_passes ... ok
test tests::deterministic_geofence_catches_spoof_and_triggers_rtl ... ok
test tests::ekf_watchdog_catches_intermittent_fault ... ok
test tests::ekf_watchdog_ignores_healthy_innovation ... ok
test tests::ekf_watchdog_debounces_transient_spikes ... ok
test tests::deterministic_fault_triggers_rtl ... ok
test tests::noisy_attitude_cascade_still_passes ... ok
test tests::noisy_step_response_still_passes ... ok
test tests::plant_step_full_preserves_unit_quaternion_and_finite_state ... ok
test tests::plant_step_preserves_unit_quaternion ... ok
test tests::noisy_mission_still_reaches_waypoint ... ok
test tests::noisy_fault_still_triggers_rtl ... ok
test tests::deterministic_untethered_mission_visits_all_waypoints ... ok

test result: ok. 17 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s

running 55 tests
test command_long::tests::crc_extra_is_152 ... ok
test command_long::tests::decode_rejects_long_payload ... ok
test command_long::tests::decode_rejects_short_payload ... ok
test command_long::tests::field_offsets_match_spec ... ok
test command_long::tests::msg_id_is_76 ... ok
test command_long::tests::payload_length_is_33 ... ok
test command_long::tests::round_trip_rtl ... ok
test command_long::tests::round_trip_with_params ... ok
test command_long::tests::rtl_builder_has_zero_params ... ok
test command_long::tests::rtl_command_id_is_20 ... ok
test crc::tests::accumulate_slice_equals_individual ... ok
test crc::tests::empty_input_keeps_seed ... ok
test crc::tests::mavlink_reference_vector_123456789 ... ok
test crc::tests::order_matters ... ok
test crc::tests::single_byte_zero ... ok
test frame::tests::encode_rejects_payload_length_mismatch ... ok
test frame::tests::encode_rejects_too_small_output ... ok
test frame::tests::frame_msg_id_three_bytes_little_endian ... ok
test frame::tests::frame_payload_length_byte_matches ... ok
test frame::tests::frame_starts_with_magic_v2 ... ok
test frame::tests::peek_message_id_finds_heartbeat ... ok
test frame::tests::peek_rejects_v1_magic ... ok
test frame::tests::rejects_bad_crc ... ok
test frame::tests::rejects_truncated_header ... ok
test frame::tests::rejects_truncated_payload ... ok
test frame::tests::rejects_v1_magic ... ok
test frame::tests::rejects_wrong_crc_extra ... ok
test frame::tests::round_trip_heartbeat_through_frame ... ok
test global_position_int::tests::crc_extra_is_104 ... ok
test global_position_int::tests::decode_rejects_empty ... ok
test global_position_int::tests::decode_rejects_long_payload ... ok
test global_position_int::tests::decode_rejects_short_payload ... ok
test global_position_int::tests::field_offsets_match_spec ... ok
test global_position_int::tests::msg_id_is_33 ... ok
test global_position_int::tests::payload_length_is_28 ... ok
test command_long::tests::round_trip_arbitrary ... ok
test frame::tests::encode_parse_round_trip_arbitrary_seq ... ok
test global_position_int::tests::round_trip_extremes ... ok
test global_position_int::tests::round_trip_sample ... ok
test global_position_int::tests::round_trip_arbitrary ... ok
test global_position_int::tests::round_trip_zero ... ok
test heartbeat::tests::crc_extra_is_fifty ... ok
test heartbeat::tests::decode_empty_payload ... ok
test heartbeat::tests::decode_rejects_long_payload ... ok
test heartbeat::tests::decode_rejects_short_payload ... ok
test heartbeat::tests::custom_mode_little_endian ... ok
test heartbeat::tests::field_offsets_match_spec ... ok
test heartbeat::tests::mav_mode_flag_or_and_contains ... ok
test heartbeat::tests::payload_length_constant ... ok
test heartbeat::tests::round_trip_falcon_default ... ok
test heartbeat::tests::round_trip_gcs_default ... ok
test heartbeat::tests::round_trip_max_values ... ok
test heartbeat::tests::round_trip_zero ... ok
test heartbeat::tests::round_trip_arbitrary ... ok
test frame::tests::parser_never_panics ... ok

test result: ok. 55 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 55 tests
test command_long::tests::crc_extra_is_152 ... ok
test command_long::tests::decode_rejects_long_payload ... ok
test command_long::tests::decode_rejects_short_payload ... ok
test command_long::tests::msg_id_is_76 ... ok
test command_long::tests::field_offsets_match_spec ... ok
test command_long::tests::payload_length_is_33 ... ok
test command_long::tests::round_trip_rtl ... ok
test command_long::tests::round_trip_with_params ... ok
test command_long::tests::rtl_builder_has_zero_params ... ok
test command_long::tests::rtl_command_id_is_20 ... ok
test crc::tests::accumulate_slice_equals_individual ... ok
test crc::tests::empty_input_keeps_seed ... ok
test crc::tests::mavlink_reference_vector_123456789 ... ok
test crc::tests::order_matters ... ok
test crc::tests::single_byte_zero ... ok
test frame::tests::encode_rejects_payload_length_mismatch ... ok
test frame::tests::encode_rejects_too_small_output ... ok
test command_long::tests::round_trip_arbitrary ... ok
test frame::tests::frame_msg_id_three_bytes_little_endian ... ok
test frame::tests::frame_payload_length_byte_matches ... ok
test frame::tests::frame_starts_with_magic_v2 ... ok
test frame::tests::peek_message_id_finds_heartbeat ... ok
test frame::tests::peek_rejects_v1_magic ... ok
test frame::tests::encode_parse_round_trip_arbitrary_seq ... ok
test frame::tests::rejects_bad_crc ... ok
test frame::tests::rejects_truncated_header ... ok
test frame::tests::rejects_truncated_payload ... ok
test frame::tests::rejects_v1_magic ... ok
test frame::tests::rejects_wrong_crc_extra ... ok
test frame::tests::round_trip_heartbeat_through_frame ... ok
test global_position_int::tests::crc_extra_is_104 ... ok
test global_position_int::tests::decode_rejects_empty ... ok
test global_position_int::tests::decode_rejects_short_payload ... ok
test global_position_int::tests::field_offsets_match_spec ... ok
test global_position_int::tests::decode_rejects_long_payload ... ok
test global_position_int::tests::msg_id_is_33 ... ok
test global_position_int::tests::payload_length_is_28 ... ok
test global_position_int::tests::round_trip_extremes ... ok
test global_position_int::tests::round_trip_sample ... ok
test global_position_int::tests::round_trip_zero ... ok
test heartbeat::tests::crc_extra_is_fifty ... ok
test heartbeat::tests::custom_mode_little_endian ... ok
test heartbeat::tests::decode_empty_payload ... ok
test heartbeat::tests::decode_rejects_long_payload ... ok
test global_position_int::tests::round_trip_arbitrary ... ok
test heartbeat::tests::decode_rejects_short_payload ... ok
test heartbeat::tests::field_offsets_match_spec ... ok
test heartbeat::tests::mav_mode_flag_or_and_contains ... ok
test heartbeat::tests::payload_length_constant ... ok
test heartbeat::tests::round_trip_falcon_default ... ok
test heartbeat::tests::round_trip_gcs_default ... ok
test heartbeat::tests::round_trip_max_values ... ok
test heartbeat::tests::round_trip_zero ... ok
test heartbeat::tests::round_trip_arbitrary ... ok
test frame::tests::parser_never_panics ... ok

test result: ok. 55 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 55 tests
test command_long::tests::crc_extra_is_152 ... ok
test command_long::tests::decode_rejects_long_payload ... ok
test command_long::tests::field_offsets_match_spec ... ok
test command_long::tests::decode_rejects_short_payload ... ok
test command_long::tests::msg_id_is_76 ... ok
test command_long::tests::payload_length_is_33 ... ok
test command_long::tests::round_trip_rtl ... ok
test command_long::tests::round_trip_with_params ... ok
test command_long::tests::rtl_builder_has_zero_params ... ok
test command_long::tests::rtl_command_id_is_20 ... ok
test crc::tests::accumulate_slice_equals_individual ... ok
test crc::tests::empty_input_keeps_seed ... ok
test crc::tests::mavlink_reference_vector_123456789 ... ok
test crc::tests::order_matters ... ok
test crc::tests::single_byte_zero ... ok
test frame::tests::encode_rejects_payload_length_mismatch ... ok
test frame::tests::encode_rejects_too_small_output ... ok
test frame::tests::frame_msg_id_three_bytes_little_endian ... ok
test frame::tests::frame_payload_length_byte_matches ... ok
test frame::tests::frame_starts_with_magic_v2 ... ok
test frame::tests::peek_message_id_finds_heartbeat ... ok
test frame::tests::peek_rejects_v1_magic ... ok
test frame::tests::rejects_bad_crc ... ok
test frame::tests::rejects_truncated_header ... ok
test frame::tests::rejects_truncated_payload ... ok
test frame::tests::rejects_v1_magic ... ok
test frame::tests::rejects_wrong_crc_extra ... ok
test frame::tests::round_trip_heartbeat_through_frame ... ok
test global_position_int::tests::crc_extra_is_104 ... ok
test global_position_int::tests::decode_rejects_empty ... ok
test global_position_int::tests::decode_rejects_long_payload ... ok
test global_position_int::tests::decode_rejects_short_payload ... ok
test global_position_int::tests::field_offsets_match_spec ... ok
test global_position_int::tests::msg_id_is_33 ... ok
test global_position_int::tests::payload_length_is_28 ... ok
test command_long::tests::round_trip_arbitrary ... ok
test frame::tests::encode_parse_round_trip_arbitrary_seq ... ok
test global_position_int::tests::round_trip_extremes ... ok
test global_position_int::tests::round_trip_zero ... ok
test global_position_int::tests::round_trip_sample ... ok
test heartbeat::tests::crc_extra_is_fifty ... ok
test heartbeat::tests::custom_mode_little_endian ... ok
test heartbeat::tests::decode_empty_payload ... ok
test heartbeat::tests::decode_rejects_long_payload ... ok
test heartbeat::tests::decode_rejects_short_payload ... ok
test heartbeat::tests::field_offsets_match_spec ... ok
test heartbeat::tests::mav_mode_flag_or_and_contains ... ok
test heartbeat::tests::payload_length_constant ... ok
test heartbeat::tests::round_trip_falcon_default ... ok
test heartbeat::tests::round_trip_gcs_default ... ok
test heartbeat::tests::round_trip_max_values ... ok
test heartbeat::tests::round_trip_zero ... ok
test global_position_int::tests::round_trip_arbitrary ... ok
test heartbeat::tests::round_trip_arbitrary ... ok
test frame::tests::parser_never_panics ... ok

test result: ok. 55 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.28s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 10 tests
test hackrf::tests::gps_sdr_sim_argv_shape_is_stable ... ok
test hackrf::tests::hackrf_argv_shape_is_stable ... ok
test mavlink::tests::altitude_translates_to_down ... ok
test mavlink::tests::home_projects_to_origin ... ok
test mavlink::tests::mavlink_bench_no_violation_no_latch ... ok
test mavlink::tests::build_frame_carries_correct_message_id ... ok
test mavlink::tests::mavlink_bench_trips_and_dispatches_on_spoof ... ok
test mavlink::tests::one_hundred_metres_north_projects_to_10000_cm_n ... ok
test stub::tests::stub_bench_no_violation_no_latch ... ok
test stub::tests::stub_bench_trips_and_dispatches ... ok

test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

falcon-hitl-rfspoof: backend=stub duration=5s
fence: ±100 m × ±100 m × ±100 m (NED, centred on home)
verdict = HitlVerdict {
backend: "stub",
duration_s: 5.0,
steps: 500,
latched: true,
latched_at_s: Some(
1.9999985,
),
rtl_dispatched: true,
rtl_frame_sent: true,
spoof_first_seen_at_s: Some(
1.9999985,
),
failure: None,
}
PASS

running 13 tests
test tests::at_setpoint_with_zero_velocity_gives_hover_thrust ... ok
test tests::altitude_above_setpoint_reduces_thrust ... ok
test tests::altitude_below_setpoint_increases_thrust ... ok
test tests::degenerate_input_does_not_propagate ... ok
test tests::pos_p01_bounds_enforced ... ok
test tests::east_position_error_rolls_right ... ok
test tests::forward_position_error_pitches_nose_down ... ok
test tests::reset_clears_integral ... ok
test tests::tilt_clamped_to_tilt_max ... ok
test tests::v_setpoint_clamped_to_v_max ... ok
test tests::yaw_held_when_setpoint_is_nan ... ok
test tests::yaw_setpoint_is_followed ... ok
test tests::pos_p01_property ... ok

test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 13 tests
test tests::altitude_above_setpoint_reduces_thrust ... ok
test tests::at_setpoint_with_zero_velocity_gives_hover_thrust ... ok
test tests::altitude_below_setpoint_increases_thrust ... ok
test tests::east_position_error_rolls_right ... ok
test tests::forward_position_error_pitches_nose_down ... ok
test tests::degenerate_input_does_not_propagate ... ok
test tests::pos_p01_bounds_enforced ... ok
test tests::reset_clears_integral ... ok
test tests::tilt_clamped_to_tilt_max ... ok
test tests::yaw_held_when_setpoint_is_nan ... ok
test tests::yaw_setpoint_is_followed ... ok
test tests::v_setpoint_clamped_to_v_max ... ok
test tests::pos_p01_property ... ok

test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 13 tests
test tests::altitude_above_setpoint_reduces_thrust ... ok
test tests::altitude_below_setpoint_increases_thrust ... ok
test tests::at_setpoint_with_zero_velocity_gives_hover_thrust ... ok
test tests::degenerate_input_does_not_propagate ... ok
test tests::east_position_error_rolls_right ... ok
test tests::forward_position_error_pitches_nose_down ... ok
test tests::pos_p01_bounds_enforced ... ok
test tests::reset_clears_integral ... ok
test tests::yaw_held_when_setpoint_is_nan ... ok
test tests::yaw_setpoint_is_followed ... ok
test tests::tilt_clamped_to_tilt_max ... ok
test tests::v_setpoint_clamped_to_v_max ... ok
test tests::pos_p01_property ... ok

test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 17 tests
test tests::deterministic_disturbance_recovers ... ok
test tests::deterministic_attitude_cascade_passes ... ok
test tests::deterministic_hover_settles ... ok
test tests::deterministic_step_response_passes ... ok
test tests::deterministic_mission_passes ... ok
test tests::ekf_watchdog_catches_intermittent_fault ... ok
test tests::ekf_watchdog_debounces_transient_spikes ... ok
test tests::ekf_watchdog_ignores_healthy_innovation ... ok
test tests::deterministic_fault_triggers_rtl ... ok
test tests::deterministic_geofence_catches_spoof_and_triggers_rtl ... ok
test tests::noisy_attitude_cascade_still_passes ... ok
test tests::noisy_step_response_still_passes ... ok
test tests::plant_step_full_preserves_unit_quaternion_and_finite_state ... ok
test tests::plant_step_preserves_unit_quaternion ... ok
test tests::noisy_mission_still_reaches_waypoint ... ok
test tests::noisy_fault_still_triggers_rtl ... ok
test tests::deterministic_untethered_mission_visits_all_waypoints ... ok

test result: ok. 17 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s

--- scenario: mission ---
samples 12000
final v (m/s NED) [-0.004, +0.000, +0.003]
peak distance error 10.000 m
final distance 0.010 m
RMS distance (steady)0.015 m (last 2s)
convergence time 4.045s
loop wall time 2408 µs
NaN/∞ seen false
outcome PASS
falcon-sitl-hover: PASS

running 9 tests
test tests::args_default_ports_for_gcs_mode ... ok
test tests::args_default_ports_for_vehicle_mode ... ok
test tests::args_rejects_missing_mode ... ok
test tests::args_rejects_unknown_mode ... ok
test tests::handle_inbound_propagates_bad_crc ... ok
test tests::handle_inbound_rejects_unsupported_message ... ok
test tests::handle_inbound_truncated ... ok
test tests::current_timestamp_is_monotone_within_a_run ... ok
test tests::vehicle_and_gcs_exchange_heartbeats_over_udp ... ok

test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s

[falcon-hello-demo] building release binary...
[falcon-hello-demo] launching gcs on 127.0.0.1:14700
[falcon-hello-demo] launching vehicle (4 Hz × 4s)
[falcon-hello-demo] vehicle sent 13 heartbeat(s)
[falcon-hello-demo] gcs received 13 heartbeat(s)
[falcon-hello-demo] PASS

running 20 tests
test bitpack::tests::bitpack_basic_id_packs_id_and_ua_type_in_same_byte ... ok
test bitpack::tests::bitpack_basic_id_round_trip ... ok
test bitpack::tests::bitpack_decoder_rejects_unknown_protocol_version ... ok
test bitpack::tests::bitpack_location_rejects_oversize_track_byte ... ok
test bitpack::tests::bitpack_location_rejects_wrong_message_type ... ok
test bitpack::tests::bitpack_location_round_trip_on_canonical ... ok
test bitpack::tests::bitpack_location_idempotent_after_canonicalize ... ok
test tests::basic_id_header_byte_is_well_formed ... ok
test tests::basic_id_round_trip ... ok
test tests::decoder_rejects_unknown_protocol_version ... ok
test tests::location_rejects_out_of_range_timestamp ... ok
test tests::location_rejects_out_of_range_track ... ok
test tests::location_rejects_wrong_message_type ... ok
test tests::location_round_trip ... ok
test bitpack::tests::proptest_bitpack_basic_id_round_trip ... ok
test bitpack::tests::proptest_bitpack_location_round_trip_on_canonical ... ok
test bitpack::tests::proptest_bitpack_decoder_never_panics ... ok
test tests::proptest_basic_id_round_trip ... ok
test tests::proptest_location_round_trip_in_range ... ok
test tests::proptest_decoder_never_panics ... ok

test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 8 tests
test physics::tests::gazebo_stub_compiles_and_returns_zeros ... ok
test physics::tests::mock_physics_at_rest_stays_quiet ... ok
test physics::tests::mock_physics_measure_returns_sensible_imu ... ok
test physics::tests::mock_physics_hover_with_full_thrust_climbs ... ok
test tests::gazebo_stub_does_not_panic ... ok
test tests::closed_loop_hover_compiles_and_ticks_on_mock ... ok
test tests::mock_backend_climbs_under_full_thrust ... ok
test tests::evidence_sink_produces_log_and_csv ... ok

test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

falcon verification gate (type: sw-verification, filter: (has-tag "falcon"))

38 artifact(s) matched: FV-FALCON-EKF-STUB-001, FV-FALCON-RATE-001, FV-FALCON-COV-005, FV-FALCON-FAULT-001, FV-FALCON-COV-002, FV-FALCON-SIM-002, FV-FALCON-ATT-001, FV-FALCON-GEO-001, FV-FALCON-EKF-001, FV-FALCON-GEO-002, FV-FALCON-NID-001, FV-FALCON-COV-004, FV-FALCON-MAVLINK-002, FV-FALCON-ARCH-002, FV-FALCON-TQ-001, FV-FALCON-SIM-006, FV-FALCON-SIM-004, FV-FALCON-UAM-001, FV-FALCON-SIM-009, FV-FALCON-SIM-001, FV-FALCON-SIM-010, FV-FALCON-PIPELINE-001, FV-FALCON-MAVLINK-001, FV-FALCON-HITL-001, FV-FALCON-SIM-008, FV-FALCON-POS-001, FV-FALCON-WORLD-001, FV-FALCON-GEO-003, FV-FALCON-NID-002, FV-FALCON-SIM-003, FV-FALCON-SIM-005, FV-FALCON-ARCH-001, FV-FALCON-HITL-002, FV-FALCON-COV-001, FV-FALCON-MIX-001, FV-FALCON-COV-003, FV-FALCON-SIM-011, FV-FALCON-SIM-007

[ PASS] ( 8.29s) FV-FALCON-EKF-STUB-001: cargo test -p relay-ekf-stub
[ PASS] ( 10.07s) FV-FALCON-EKF-STUB-001: cargo test -p relay-ekf-stub --release
[ PASS] ( 0.16s) FV-FALCON-EKF-STUB-001: PROPTEST_CASES=4096 cargo test -p relay-ekf-stub
[ PASS] ( 0.41s) FV-FALCON-RATE-001: cargo test -p relay-rate
[ PASS] ( 0.86s) FV-FALCON-RATE-001: cargo test -p relay-rate --release
[ PASS] ( 0.53s) FV-FALCON-RATE-001: PROPTEST_CASES=4096 cargo test -p relay-rate
[ PASS] ( 1.25s) FV-FALCON-RATE-001: cargo test -p falcon-sitl-hover
[ PASS] ( 1.69s) FV-FALCON-RATE-001: cargo run -q -p falcon-sitl-hover --release
[ PASS] ( 93.22s) FV-FALCON-COV-005: cargo build -p witness-wasi-harness
[ skip-bench-only] FV-FALCON-COV-005: WITNESS_HARNESS_INVOKES="run_inside" $WITNESS run /tmp/instr.wasm --harness target/debug/witness-wasi-harness -o /tmp/run.json
[ skip-bench-only] FV-FALCON-FAULT-001: bazel test //:relay_hs_verus_test
[ PASS] ( 0.19s) FV-FALCON-FAULT-001: cargo test -p relay-hs
[ PASS] ( 0.15s) FV-FALCON-FAULT-001: cargo test -p falcon-sitl-hover
[ skip-bench-only] FV-FALCON-FAULT-001: cargo kani -p relay-hs
[ PASS] ( 96.89s) FV-FALCON-COV-002: cargo llvm-cov --workspace --summary-only
[ PASS] ( 5.01s) FV-FALCON-COV-002: cargo llvm-cov --workspace --lcov --output-path coverage.lcov
[ PASS] ( 0.60s) FV-FALCON-SIM-002: cargo test -p relay-mavlink
[ PASS] ( 0.26s) FV-FALCON-SIM-002: cargo test -p falcon-hitl-rfspoof
[ skip-bench-only] FV-FALCON-SIM-002: cargo run -p falcon-hitl-rfspoof -- --preset=px4-sitl
[ PASS] ( 0.36s) FV-FALCON-ATT-001: cargo test -p relay-att
[ PASS] ( 0.61s) FV-FALCON-ATT-001: cargo test -p relay-att --release
[ PASS] ( 0.17s) FV-FALCON-ATT-001: PROPTEST_CASES=4096 cargo test -p relay-att
[ PASS] ( 0.14s) FV-FALCON-ATT-001: cargo test -p falcon-sitl-hover
[ PASS] ( 0.07s) FV-FALCON-ATT-001: cargo run -q -p falcon-sitl-hover --release -- --scenario attitude
[ skip-bench-only] FV-FALCON-GEO-001: bazel test //:relay_lc_verus_test
[ PASS] ( 0.47s) FV-FALCON-GEO-001: cargo test -p relay-lc
[ PASS] ( 0.09s) FV-FALCON-GEO-001: cargo test -p falcon-sitl-hover tests::deterministic_geofence_catches_spoof_and_triggers_rtl
[ PASS] ( 0.43s) FV-FALCON-EKF-001: cargo test -p relay-ekf
[ PASS] ( 0.86s) FV-FALCON-EKF-001: cargo test -p relay-ekf --release
[ PASS] ( 0.68s) FV-FALCON-EKF-001: PROPTEST_CASES=4096 cargo test -p relay-ekf
[ PASS] ( 0.18s) FV-FALCON-EKF-001: cargo test -p falcon-ekf-bench
[ PASS] ( 0.21s) FV-FALCON-EKF-001: cargo run -q -p falcon-ekf-bench --release
[ skip-bench-only] FV-FALCON-GEO-002: cargo kani -p relay-lc
[ PASS] ( 0.11s) FV-FALCON-GEO-002: cargo test -p relay-lc
[ PASS] ( 0.57s) FV-FALCON-NID-001: cargo test -p relay-nid
[ PASS] ( 0.29s) FV-FALCON-NID-001: PROPTEST_CASES=4096 cargo test -p relay-nid
[ skip-bench-only] FV-FALCON-NID-001: cargo kani -p relay-nid
[ PASS] (203.52s) FV-FALCON-COV-004: cargo build -p witness-wasi-harness --release
[ skip-bench-only] FV-FALCON-COV-004: $WITNESS run /path/to/instrumented.wasm --output run.json --harness target/release/witness-wasi-harness
[ skip-bench-only] FV-FALCON-MAVLINK-002: bazel test //:relay_mavlink_verus_test
[ PASS] ( 0.13s) FV-FALCON-MAVLINK-002: cargo test -p relay-mavlink
[ skip-bench-only] FV-FALCON-ARCH-002: cd /Users/r/git/pulseengine/spar && git pull --rebase && cargo install --path crates/spar-cli --locked
[ skip-bench-only] FV-FALCON-ARCH-002: spar codegen --root Falcon_System::Falcon.Quad --format wit --output /tmp/falcon-spar-wit spar/.aadl
[ skip-bench-only] FV-FALCON-ARCH-002: diff /tmp/falcon-spar-wit/wit/autopilot.wit wit/falcon-cascade/cascade.wit
[ PASS] ( 0.00s) FV-FALCON-TQ-001: ls docs/dossier/tool-qualification/
[ PASS] ( 0.00s) FV-FALCON-TQ-001: wc -l docs/dossier/tool-qualification/
.md
[ skip-no-steps] FV-FALCON-SIM-006: (no steps defined)
[ PASS] ( 0.26s) FV-FALCON-SIM-004: cargo test -p falcon-sitl-gz
[ skip-bench-only] FV-FALCON-SIM-004: cargo test -p falcon-sitl-gz --features gazebo
[ skip-bench-only] FV-FALCON-SIM-004: cargo run -p falcon-sitl-gz --features gazebo -- --backend=gazebo --world=falcon --model=quad
[ PASS] ( 0.12s) FV-FALCON-UAM-001: cargo test -p falcon-sitl-hover tests::deterministic_untethered_mission_visits_all_waypoints
[ skip-no-steps] FV-FALCON-SIM-009: (no steps defined)
[ skip-bench-only] FV-FALCON-SIM-001: cargo run -p falcon-hitl-rfspoof -- --preset=px4-sitl --duration=1
[ skip-bench-only] FV-FALCON-SIM-001: cd ~/git/PX4-Autopilot && make px4_sitl jmavsim
[ skip-bench-only] FV-FALCON-SIM-001: cargo run -p falcon-hitl-rfspoof -- --preset=px4-sitl
[ skip-no-steps] FV-FALCON-SIM-010: (no steps defined)
[ PASS] ( 0.37s) FV-FALCON-PIPELINE-001: cargo test -p relay-mix-quad
[ PASS] ( 0.13s) FV-FALCON-PIPELINE-001: cargo test -p relay-rate
[ PASS] ( 0.15s) FV-FALCON-PIPELINE-001: cargo test -p falcon-sitl-hover
[ PASS] ( 0.13s) FV-FALCON-MAVLINK-001: cargo test -p relay-mavlink
[ PASS] ( 1.70s) FV-FALCON-MAVLINK-001: cargo test -p relay-mavlink --release
[ PASS] ( 0.39s) FV-FALCON-MAVLINK-001: PROPTEST_CASES=4096 cargo test -p relay-mavlink
[ PASS] ( 0.08s) FV-FALCON-HITL-001: cargo test -p falcon-hitl-rfspoof
[ PASS] ( 0.24s) FV-FALCON-HITL-001: cargo run -p falcon-hitl-rfspoof
[ skip-bench-only] FV-FALCON-HITL-001: cargo run -p falcon-hitl-rfspoof -- --backend=hackrf --duration=30
[ skip-no-steps] FV-FALCON-SIM-008: (no steps defined)
[ PASS] ( 0.37s) FV-FALCON-POS-001: cargo test -p relay-pos
[ PASS] ( 0.58s) FV-FALCON-POS-001: cargo test -p relay-pos --release
[ PASS] ( 0.18s) FV-FALCON-POS-001: PROPTEST_CASES=4096 cargo test -p relay-pos
[ PASS] ( 0.15s) FV-FALCON-POS-001: cargo test -p falcon-sitl-hover
[ PASS] ( 0.08s) FV-FALCON-POS-001: cargo run -q -p falcon-sitl-hover --release -- --scenario mission
[ PASS] ( 0.34s) FV-FALCON-WORLD-001: cargo test -p falcon-hello
[ PASS] ( 4.73s) FV-FALCON-WORLD-001: scripts/falcon-hello-demo.sh
[ skip-bench-only] FV-FALCON-GEO-003: rustup component add miri --toolchain nightly
[ skip-bench-only] FV-FALCON-GEO-003: MIRIFLAGS=-Zmiri-disable-isolation cargo +nightly miri test -p relay-lc --lib geofence
[ skip-bench-only] FV-FALCON-GEO-003: MIRIFLAGS=-Zmiri-disable-isolation cargo +nightly miri test -p falcon-hitl-rfspoof --bin falcon-hitl-rfspoof stub::tests
[ skip-bench-only] FV-FALCON-GEO-003: MIRIFLAGS=-Zmiri-disable-isolation cargo +nightly miri test -p falcon-hitl-rfspoof --bin falcon-hitl-rfspoof mavlink::tests
[ skip-bench-only] FV-FALCON-NID-002: bazel test //:relay_nid_verus_test
[ PASS] ( 0.12s) FV-FALCON-NID-002: cargo test -p relay-nid
[ PASS] ( 0.08s) FV-FALCON-SIM-003: cargo test -p falcon-sitl-gz
falcon-sitl-gz: backend=mock scenario=hover duration=5s
verdict: backend=mock scenario=hover steps=500 final_dist=0.04m peak_dist=2.00m rms_steady=0.79m wall=0.00s
PASS

running 55 tests
test command_long::tests::crc_extra_is_152 ... ok
test command_long::tests::decode_rejects_long_payload ... ok
test command_long::tests::decode_rejects_short_payload ... ok
test command_long::tests::field_offsets_match_spec ... ok
test command_long::tests::msg_id_is_76 ... ok
test command_long::tests::payload_length_is_33 ... ok
test command_long::tests::round_trip_rtl ... ok
test command_long::tests::round_trip_with_params ... ok
test command_long::tests::rtl_builder_has_zero_params ... ok
test command_long::tests::rtl_command_id_is_20 ... ok
test crc::tests::accumulate_slice_equals_individual ... ok
test crc::tests::empty_input_keeps_seed ... ok
test crc::tests::mavlink_reference_vector_123456789 ... ok
test crc::tests::order_matters ... ok
test crc::tests::single_byte_zero ... ok
test frame::tests::encode_rejects_payload_length_mismatch ... ok
test frame::tests::encode_rejects_too_small_output ... ok
test frame::tests::frame_msg_id_three_bytes_little_endian ... ok
test frame::tests::frame_payload_length_byte_matches ... ok
test frame::tests::frame_starts_with_magic_v2 ... ok
test frame::tests::peek_message_id_finds_heartbeat ... ok
test frame::tests::peek_rejects_v1_magic ... ok
test frame::tests::rejects_bad_crc ... ok
test frame::tests::rejects_truncated_header ... ok
test frame::tests::rejects_truncated_payload ... ok
test frame::tests::rejects_v1_magic ... ok
test frame::tests::rejects_wrong_crc_extra ... ok
test frame::tests::round_trip_heartbeat_through_frame ... ok
test global_position_int::tests::crc_extra_is_104 ... ok
test global_position_int::tests::decode_rejects_empty ... ok
test global_position_int::tests::decode_rejects_long_payload ... ok
test global_position_int::tests::decode_rejects_short_payload ... ok
test global_position_int::tests::field_offsets_match_spec ... ok
test global_position_int::tests::msg_id_is_33 ... ok
test global_position_int::tests::payload_length_is_28 ... ok
test command_long::tests::round_trip_arbitrary ... ok
test global_position_int::tests::round_trip_extremes ... ok
test global_position_int::tests::round_trip_sample ... ok
test frame::tests::encode_parse_round_trip_arbitrary_seq ... ok
test global_position_int::tests::round_trip_arbitrary ... ok
test global_position_int::tests::round_trip_zero ... ok
test heartbeat::tests::crc_extra_is_fifty ... ok
test heartbeat::tests::decode_empty_payload ... ok
test heartbeat::tests::custom_mode_little_endian ... ok
test heartbeat::tests::decode_rejects_long_payload ... ok
test heartbeat::tests::decode_rejects_short_payload ... ok
test heartbeat::tests::field_offsets_match_spec ... ok
test heartbeat::tests::mav_mode_flag_or_and_contains ... ok
test heartbeat::tests::payload_length_constant ... ok
test heartbeat::tests::round_trip_falcon_default ... ok
test heartbeat::tests::round_trip_gcs_default ... ok
test heartbeat::tests::round_trip_max_values ... ok
test heartbeat::tests::round_trip_zero ... ok
test heartbeat::tests::round_trip_arbitrary ... ok
test frame::tests::parser_never_panics ... ok

test result: ok. 55 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 10 tests
test hackrf::tests::gps_sdr_sim_argv_shape_is_stable ... ok
test hackrf::tests::hackrf_argv_shape_is_stable ... ok
test mavlink::tests::build_frame_carries_correct_message_id ... ok
test mavlink::tests::altitude_translates_to_down ... ok
test mavlink::tests::home_projects_to_origin ... ok
test mavlink::tests::mavlink_bench_no_violation_no_latch ... ok
test mavlink::tests::one_hundred_metres_north_projects_to_10000_cm_n ... ok
test mavlink::tests::mavlink_bench_trips_and_dispatches_on_spoof ... ok
test stub::tests::stub_bench_no_violation_no_latch ... ok
test stub::tests::stub_bench_trips_and_dispatches ... ok

test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 10 tests
test tests::high_thrust_with_torque_saturates_gracefully ... ok
test tests::mix_p02_outputs_in_unit_interval ... ok
test tests::mix_p01_zero_command_gives_thrust_only ... ok
test tests::mix_p03_pure_pitch_drives_front_and_back_motors_opposite ... ok
test tests::mix_p03_pure_roll_drives_diagonal_motor_pairs_opposite ... ok
test tests::mix_p03_pure_yaw_drives_cw_and_ccw_pairs_opposite ... ok
test tests::nan_input_does_not_propagate ... ok
test tests::negative_thrust_clipped_to_zero ... ok
test tests::mix_p03_property_single_axis ... ok
test tests::mix_p02_property ... ok

test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 10 tests
test tests::high_thrust_with_torque_saturates_gracefully ... ok
test tests::mix_p01_zero_command_gives_thrust_only ... ok
test tests::mix_p02_outputs_in_unit_interval ... ok
test tests::mix_p03_pure_pitch_drives_front_and_back_motors_opposite ... ok
test tests::mix_p03_pure_yaw_drives_cw_and_ccw_pairs_opposite ... ok
test tests::nan_input_does_not_propagate ... ok
test tests::negative_thrust_clipped_to_zero ... ok
test tests::mix_p03_property_single_axis ... ok
test tests::mix_p03_pure_roll_drives_diagonal_motor_pairs_opposite ... ok
test tests::mix_p02_property ... ok

test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 10 tests
test tests::high_thrust_with_torque_saturates_gracefully ... ok
test tests::mix_p01_zero_command_gives_thrust_only ... ok
test tests::mix_p02_outputs_in_unit_interval ... ok
test tests::mix_p03_pure_pitch_drives_front_and_back_motors_opposite ... ok
test tests::mix_p03_pure_roll_drives_diagonal_motor_pairs_opposite ... ok
test tests::mix_p03_pure_yaw_drives_cw_and_ccw_pairs_opposite ... ok
test tests::nan_input_does_not_propagate ... ok
test tests::negative_thrust_clipped_to_zero ... ok
test tests::mix_p03_property_single_axis ... ok
test tests::mix_p02_property ... ok

test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

[ PASS] ( 0.24s) FV-FALCON-SIM-003: cargo run -p falcon-sitl-gz
[ skip-bench-only] FV-FALCON-SIM-003: cargo run -p falcon-sitl-gz -- --backend=gazebo --world=falcon --model=quad
[ skip-bench-only] FV-FALCON-SIM-005: cargo test -p falcon-sitl-gz --features gazebo
[ skip-bench-only] FV-FALCON-SIM-005: cargo run -p falcon-sitl-gz --features gazebo -- --backend=gazebo --world=falcon --model=quad --home=47.3977,8.5456,488 --duration=30
[ skip-bench-only] FV-FALCON-ARCH-001: spar parse spar/.aadl
[ skip-bench-only] FV-FALCON-ARCH-001: spar instance --root Falcon_System::Falcon.Quad spar/
.aadl
[ skip-bench-only] FV-FALCON-ARCH-001: spar analyze --root Falcon_System::Falcon.Quad spar/.aadl
[ skip-bench-only] FV-FALCON-ARCH-001: spar render --root Falcon_System::Falcon.Quad -o artifacts/spar/falcon-quad-architecture.svg spar/
.aadl
[ PASS] ( 0.13s) FV-FALCON-HITL-002: cargo test -p relay-mavlink
[ PASS] ( 0.08s) FV-FALCON-HITL-002: cargo test -p falcon-hitl-rfspoof
[ skip-bench-only] FV-FALCON-HITL-002: MIRIFLAGS=-Zmiri-disable-isolation cargo +nightly miri test -p falcon-hitl-rfspoof --bin falcon-hitl-rfspoof mavlink::tests
[ skip-bench-only] FV-FALCON-HITL-002: cargo run -p falcon-hitl-rfspoof -- --backend=mavlink --listen=0.0.0.0:14550
[ skip-bench-only] FV-FALCON-COV-001: bazel build //:geofence-subject-coverage
[ skip-bench-only] FV-FALCON-COV-001: cat bazel-bin/geofence-subject-coverage_witness-run.json
[ skip-bench-only] FV-FALCON-COV-001: bazel build //:falcon-cascade-coverage
[ PASS] ( 0.11s) FV-FALCON-MIX-001: cargo test -p relay-mix-quad
[ PASS] ( 0.80s) FV-FALCON-MIX-001: cargo test -p relay-mix-quad --release
[ PASS] ( 0.16s) FV-FALCON-MIX-001: PROPTEST_CASES=4096 cargo test -p relay-mix-quad
[ skip-bench-only] FV-FALCON-COV-003: cargo build -p geofence-subject-rs --target wasm32-unknown-unknown --release
[ skip-bench-only] FV-FALCON-COV-003: cp target/wasm32-unknown-unknown/release/geofence_subject_rs.wasm coverage_subjects/
[ skip-bench-only] FV-FALCON-COV-003: bazel build //:geofence-subject-rs-coverage
[ skip-bench-only] FV-FALCON-COV-003: cat bazel-bin/geofence-subject-rs-coverage_witness-run.json
[ skip-no-steps] FV-FALCON-SIM-011: (no steps defined)
[ skip-no-steps] FV-FALCON-SIM-007: (no steps defined)

❌ Rivet verification gate — falcon

31/25 passed

count
Passed 31
Failed -6
Skipped (bench-only — needs hardware / sim) 7
Skipped (no steps) 6

Failed artifacts

Bench-only artifacts (not run by CI)

  • FV-FALCON-ARCH-002 — spar codegen --format wit recheck — works at v0.10.0 (v0.15.0)
  • FV-FALCON-SIM-001 — PX4-SITL end-to-end loop — recipe + preset + smoke (v0.14.0)
  • FV-FALCON-GEO-003 — Geofence safety path — miri UB/overflow check (v0.12, AI substitute)
  • FV-FALCON-SIM-005 — gz-transport NavSat + Home projection — position-dependent loops (v0.18.1)
  • FV-FALCON-ARCH-001 — spar AADL architectural model — falcon cascade (v0.13)
  • FV-FALCON-COV-001 — witness MC/DC structural coverage — falcon pipeline wired (v0.13)
  • FV-FALCON-COV-003 — witness MC/DC on real Rust source — Geofence subject (v0.14.1)

Source of truth: artifacts/verification/FV-FALCON-*.yaml.

@avrabe avrabe merged commit 7e5e76c into main May 28, 2026
9 checks passed
@avrabe avrabe deleted the feat/falcon-v0.19.5-tune-hover branch May 28, 2026 05:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant