Skip to content

feat(falcon): v0.19.7 — true-velocity odometry + hover bistability characterization#52

Merged
avrabe merged 2 commits into
mainfrom
feat/falcon-v0.19.7-cascade-hover
May 29, 2026
Merged

feat(falcon): v0.19.7 — true-velocity odometry + hover bistability characterization#52
avrabe merged 2 commits into
mainfrom
feat/falcon-v0.19.7-cascade-hover

Conversation

@avrabe
Copy link
Copy Markdown
Contributor

@avrabe avrabe commented May 28, 2026

Summary

Builds on v0.19.6's frame fix with a deterministic velocity source (gz OdometryPublisher) + a velocity-cascade altitude controller.

Honest outcome: reliable tight hover is NOT achieved. The controller demonstrably can hold a perfect hover (alt-only: final 0.012 m, rms 0.016 m — ±2 cm for 5 s) but the gz full-hover is bistable — the same config gives 0.02 m one run and a grounded 1.97 m the next. The verified mixer + controller are correct; the issue is reliability (startup basin), not capability.

Shipped (real, reliable)

  1. True body velocity via gz-sim-odometry-publisher-system/model/quad/odometry. Bridge defines a minimal local Odometry (twist-only; gz-transport-rs 0.1.0 lacks the wrapper), subscribes, ENU→NED, exposes via new Physics::velocity_ned(). Replaces the noisy/lagged finite-diff-of-NavSat.
  2. Velocity-cascade altitude (alt-rate) + thrust clamp 0.88 for torque headroom.
  3. PosController tuned for the 2 kg body (hover_thrust 0.5→0.72).

Three coupled root causes (→ v0.19.8 design items, not gain-tuning)

  1. Startup tip-over (no attitude control) → deterministic startup sequencing / attitude-hold-from-t0.
  2. Mixer thrust/torque limit cycle: rate-PID torque near thrust saturation makes relay-mix-quad's priority-preserving saturation steal thrust → ±1 m oscillation → relay-mix-quad should reserve a hover thrust floor (verified change + Verus contract).
  3. EKF attitude during vertical accel: Mahony accel-as-gravity tilts during climb → relay-ekf accel down-weighting at high |a|.

Verification

  • cargo test --workspace → green; -p falcon-sitl-gz --features gazebo → 9/9.
  • frame-check oracle (v0.19.6) still AGREE on roll + pitch.
  • odometry subscriber delivers true velocity.
  • rivet validate → PASS.

Why ship an honest partial

Claiming a gain set "works" when it passes 1 run in 3 would violate the project's falsification discipline. v0.19.7 delivers the deterministic velocity infrastructure + a controller that can hover + a precise three-cause bistability diagnosis. The reliable PASS is gated on the three design changes above; the largest (mixer thrust floor) is a verified-component change deserving its own oracle-gated release.

🤖 Generated with Claude Code

…aracterization

Builds on v0.19.6's frame fix with a deterministic velocity source
(gz OdometryPublisher) + a velocity-cascade altitude controller.

HONEST OUTCOME: reliable tight hover is NOT achieved. The controller
demonstrably CAN hold a perfect hover (alt-only: final 0.012 m, rms
0.016 m — ±2 cm for the last 5 s) but the gz full-hover is bistable:
the same config gives 0.02 m one run and a grounded 1.97 m the next.
The verified mixer + controller are correct; the issue is reliability
(startup basin), not capability.

Shipped (real, reliable):
  - True body velocity via gz-sim-odometry-publisher-system →
    /model/quad/odometry (100 Hz gz.msgs.Odometry). Bridge defines a
    minimal local Odometry (twist-only; gz-transport-rs 0.1.0 lacks
    the wrapper), subscribes, converts ENU→NED, exposes via the new
    Physics::velocity_ned() trait method. Replaces finite-diff-of-NavSat
    (noisy/lagged → non-deterministic inner loop).
  - Velocity-cascade altitude (alt-rate): outer P (alt err →
    bounded climb-rate target) + inner P (rate err → thrust) +
    conditional windup-guarded integral + thrust clamp 0.88 to
    reserve torque headroom.
  - PosController tuned for the 2 kg body (hover_thrust 0.5→0.72).

Three coupled root causes of the bistability (→ v0.19.8 design items,
not gain-tuning):
  1. startup tip-over (alt-only, no attitude control) →
     deterministic startup sequencing / attitude-hold-from-t0.
  2. mixer thrust/torque limit cycle (alt-rate): rate-PID torque near
     thrust saturation makes relay-mix-quad's priority-preserving
     saturation steal thrust → ±1 m oscillation → relay-mix-quad
     should reserve a hover thrust floor (VERIFIED change + Verus
     contract).
  3. EKF attitude during vertical accel (full cascade): Mahony
     accel-as-gravity tilts during climb → relay-ekf accel
     down-weighting at high |a|.

Verification:
  - cargo test --workspace → green; -p falcon-sitl-gz --features
    gazebo → 9/9.
  - frame-check oracle (v0.19.6) still AGREE on roll + pitch.
  - odometry subscriber delivers true velocity.
  - rivet validate → PASS.

Claiming a gain set "works" when it passes 1 run in 3 would violate
the project's falsification discipline. The reliable PASS is gated on
the three design changes above; the largest (mixer thrust floor) is a
verified-component change deserving its own oracle-gated release.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@avrabe avrabe force-pushed the feat/falcon-v0.19.7-cascade-hover branch from ac81f23 to a2e9847 Compare May 29, 2026 04:17
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 29, 2026

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_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.04s

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::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.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::out_of_range_dt_clamped_safely ... ok
test tests::fresh_pid_has_zero_state ... 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.61s

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 710 µ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 691 µ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 767 µ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 2437 µ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 6348 µ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 14403 µ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 6239 µs
NaN/∞ seen false
outcome PASS
falcon-sitl-hover: PASS
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 8 97.15% 14 0 100.00% 164 1 99.39% 0 0 -
crates/relay-nid/plain/src/lib.rs 275 11 96.00% 17 0 100.00% 162 2 98.77% 0 0 -
crates/relay-pos/plain/src/lib.rs 472 21 95.55% 30 4 86.67% 318 17 94.65% 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 640 92.20% 624 52 91.67% 5451 371 93.19% 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::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.01s

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

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_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 9 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::frame_correction_is_identity ... ok
test tests::closed_loop_hover_compiles_and_ticks_on_mock ... ok
test tests::gazebo_stub_does_not_panic ... ok
test tests::mock_backend_climbs_under_full_thrust ... ok
test tests::evidence_sink_produces_log_and_csv ... ok

test result: ok. 9 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.11s

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.01s

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_checksum_xor ... ok
test engine::tests::test_encode_decode_roundtrip_command ... ok
test engine::tests::test_encode_decode_roundtrip_telemetry ... 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_validate_packet_valid ... ok
test engine::tests::test_version_always_zero_in_output ... ok
test sensor_wire::tests::test_all_sensor_types ... ok
test sensor_wire::tests::test_celsius_conversion ... ok
test sensor_wire::tests::test_contact_sensor ... ok
test sensor_wire::tests::test_encode_decode_roundtrip ... ok
test sensor_wire::tests::test_invalid_version ... ok
test sensor_wire::tests::test_max_device_id ... ok
test sensor_wire::tests::test_negative_temperature ... ok
test sensor_wire::tests::test_packet_size ... ok
test sensor_wire::tests::test_too_short ... ok
test sensor_wire::tests::test_water_sensor ... ok
test sensor_wire::tests::test_watts_conversion ... 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_create_transaction ... ok
test engine::tests::test_cancel_on_max_retransmit ... ok
test engine::tests::test_eof_transition ... 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_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_updates_last_checked ... ok
test engine::tests::test_check_nonexistent_region ... ok
test engine::tests::test_crc32_empty ... ok
test engine::tests::test_crc32_known_value ... 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 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_matching_filter ... ok
test engine::tests::test_no_match ... ok
test engine::tests::test_table_full ... ok
test engine::tests::test_multiple_destinations ... 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::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.05s

running 9 tests
test tests::deterministic_across_ticks_with_same_time ... ok
test tests::innovation_is_quiet_in_stub ... ok
test tests::fresh_stub_has_zero_time ... 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_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_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_copy_command ... ok
test engine::tests::test_empty_path_rejected ... ok
test engine::tests::test_valid_path ... 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_source_bounds_check ... ok
test engine::tests::test_source_not_found ... ok
test engine::tests::test_table_full_returns_false ... ok
test engine::tests::test_single_copy ... 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_table_full ... ok
test engine::tests::test_stalled_app_alert_after_max_miss ... 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::tests::geofence_boundary_inclusive ... ok
test engine::tests::geofence_inside_does_not_trip ... ok
test engine::proptests::persistence_requires_consecutive ... 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::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.02s

running 3 tests
test tests::persistence_sequence_agrees ... ok
test tests::compare_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::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::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 command_long::tests::payload_length_is_33 ... 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_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 global_position_int::tests::round_trip_arbitrary ... 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.03s

running 7 tests
test engine::tests::test_disabled_entry ... ok
test engine::tests::test_bounded_output ... ok
test engine::tests::test_empty_table ... ok
test engine::tests::test_rate_divisor_filtering ... ok
test engine::tests::test_multiple_entries ... 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_fill_no_alignment_check ... ok
test engine::tests::test_boundary_address ... 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_decoder_rejects_unknown_protocol_version ... ok
test bitpack::tests::bitpack_basic_id_round_trip ... 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 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::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::degenerate_input_does_not_propagate ... 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.01s

running 34 tests
test ccsds::tests::apid_masked_to_eleven_bits ... ok
test ccsds::tests::checksum_self_inverse ... ok
test ccsds::tests::checksum_empty_is_zero ... ok
test ccsds::tests::checksum_xor ... 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 ccsds::tests::decode_too_short ... 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 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::counter_saturates ... ok
test persistence::tests::event_at_threshold_fires ... ok
test persistence::tests::event_below_threshold_is_pending ... ok
test persistence::tests::no_event_resets ... ok
test persistence::tests::persistence_zero_always_fires_on_event ... ok
test rate_divide::tests::divisor_five_emits_every_fifth ... 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::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.05s

running 11 tests
test core::tests::test_channel_isolation ... ok
test core::tests::test_duplicate_subscribe_idempotent ... ok
test core::tests::test_publish_multiple_subscribers ... ok
test core::tests::test_publish_no_subscribers ... ok
test core::tests::test_max_subscribers_per_channel ... ok
test core::tests::test_queue_full_drops_message ... ok
test core::tests::test_stats_after_unsubscribe ... ok
test core::tests::test_stats_tracking ... ok
test core::tests::test_subscribe_and_get ... 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::dispatch_count_always_bounded ... ok
test engine::proptests::ats_not_dispatched_early ... ok
test engine::proptests::dispatched_commands_not_redispatched ... 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_empty_table_no_dispatches ... ok
test engine::tests::test_table_full_returns_false ... ok
test engine::tests::test_not_redispatched ... ok
test engine::tests::test_not_dispatched_early ... 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_activate_without_load_fails ... ok
test engine::tests::test_empty_registry ... ok
test engine::tests::test_double_buffer_swap ... ok
test engine::tests::test_load_and_activate ... ok
test engine::tests::test_not_found ... ok
test engine::tests::test_register_and_get ... ok
test engine::tests::test_size_mismatch ... ok
test engine::tests::test_registry_full ... 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_empty_table ... ok
test engine::tests::test_disabled_subscription ... ok
test engine::tests::test_not_subscribed ... ok
test engine::tests::test_unsubscribe ... ok
test engine::tests::test_subscribe_and_include ... 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 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_roll_drives_diagonal_motor_pairs_opposite ... 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_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.10s

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 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::proptests::persistence_requires_consecutive ... 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::tests::test_empty ... ok
test engine::tests::test_gt_violation ... ok
test engine::tests::test_persistence ... ok
test engine::tests::test_persistence_reset ... ok
test engine::tests::test_ops ... 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.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::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::mavlink_reference_vector_123456789 ... ok
test crc::tests::order_matters ... ok
test crc::tests::single_byte_zero ... ok
test crc::tests::empty_input_keeps_seed ... 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 frame::tests::encode_parse_round_trip_arbitrary_seq ... 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 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.03s

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_short_payload ... 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::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 command_long::tests::round_trip_arbitrary ... ok
test frame::tests::encode_rejects_too_small_output ... ok
test frame::tests::encode_rejects_payload_length_mismatch ... 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::encode_parse_round_trip_arbitrary_seq ... ok
test frame::tests::rejects_bad_crc ... ok
test frame::tests::peek_rejects_v1_magic ... 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::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::decode_rejects_long_payload ... ok
test global_position_int::tests::round_trip_arbitrary ... ok
test global_position_int::tests::round_trip_zero ... ok
test heartbeat::tests::custom_mode_little_endian ... ok
test heartbeat::tests::decode_empty_payload ... ok
test heartbeat::tests::crc_extra_is_fifty ... 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 frame::tests::parser_never_panics ... 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::mav_mode_flag_or_and_contains ... ok
test heartbeat::tests::round_trip_zero ... ok
test heartbeat::tests::round_trip_arbitrary ... 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_short_payload ... ok
test command_long::tests::field_offsets_match_spec ... ok
test command_long::tests::decode_rejects_long_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 frame::tests::encode_parse_round_trip_arbitrary_seq ... 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 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 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.42s

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 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_empty_table ... ok
test engine::tests::test_multiple_apps ... ok
test engine::tests::test_counter_reset_on_activity ... 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_geofence_catches_spoof_and_triggers_rtl ... 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 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.05s

running 10 tests
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_p01_zero_command_gives_thrust_only ... 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 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_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.04s

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_geofence_catches_spoof_and_triggers_rtl ... 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.08s

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::identity_setpoint_at_identity_gives_zero_rate ... ok
test tests::att_p03_small_angle_within_one_percent ... 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.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::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_p01_shortest_arc_q_err_scalar_non_negative ... ok
test tests::att_p03_small_angle_within_one_percent ... ok
test tests::identity_setpoint_at_identity_gives_zero_rate ... ok
test tests::degenerate_input_does_not_propagate_nan ... ok
test tests::rate_command_clamped_to_rate_max ... ok
test tests::sqrt_f32_matches_libm_within_tolerance ... ok
test tests::negative_roll_setpoint_gives_negative_x_rate ... 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.11s

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 874 µs
NaN/∞ seen false
outcome PASS
falcon-sitl-hover: PASS

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::tilt_clamped_to_tilt_max ... ok
test tests::yaw_setpoint_is_followed ... ok
test tests::yaw_held_when_setpoint_is_nan ... 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 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::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::altitude_below_setpoint_increases_thrust ... 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::tilt_clamped_to_tilt_max ... ok
test tests::yaw_setpoint_is_followed ... ok
test tests::v_setpoint_clamped_to_v_max ... ok
test tests::yaw_held_when_setpoint_is_nan ... 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::tilt_clamped_to_tilt_max ... 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.11s

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 2424 µ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 9 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::frame_correction_is_identity ... ok
test tests::closed_loop_hover_compiles_and_ticks_on_mock ... ok
test tests::gazebo_stub_does_not_panic ... ok
test tests::mock_backend_climbs_under_full_thrust ... ok
test tests::evidence_sink_produces_log_and_csv ... ok

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

falcon-sitl-gz: backend=mock scenario=open-loop-climb duration=5s
verdict: backend=mock steps=500 climb=48.37 m (min=0.00 max=48.37) 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::field_offsets_match_spec ... ok
test command_long::tests::payload_length_is_33 ... ok
test command_long::tests::msg_id_is_76 ... ok
test command_long::tests::decode_rejects_short_payload ... ok
test command_long::tests::round_trip_with_params ... ok
test command_long::tests::round_trip_rtl ... 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::mavlink_reference_vector_123456789 ... ok
test crc::tests::empty_input_keeps_seed ... 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_starts_with_magic_v2 ... ok
test frame::tests::frame_payload_length_byte_matches ... 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 command_long::tests::round_trip_arbitrary ... ok
test frame::tests::rejects_wrong_crc_extra ... ok
test frame::tests::round_trip_heartbeat_through_frame ... ok
test frame::tests::rejects_v1_magic ... ok
test frame::tests::encode_parse_round_trip_arbitrary_seq ... ok
test global_position_int::tests::decode_rejects_empty ... ok
test global_position_int::tests::crc_extra_is_104 ... 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 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 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 55 tests
test command_long::tests::crc_extra_is_152 ... 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::decode_rejects_long_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_starts_with_magic_v2 ... ok
test frame::tests::frame_payload_length_byte_matches ... 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 command_long::tests::round_trip_arbitrary ... ok
test frame::tests::rejects_wrong_crc_extra ... ok
test frame::tests::encode_parse_round_trip_arbitrary_seq ... 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 frame::tests::rejects_v1_magic ... 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::decode_rejects_short_payload ... 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 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.03s

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 mavlink::tests::altitude_translates_to_down ... ok
test mavlink::tests::home_projects_to_origin ... ok
test mavlink::tests::build_frame_carries_correct_message_id ... ok
test hackrf::tests::hackrf_argv_shape_is_stable ... ok
test mavlink::tests::mavlink_bench_no_violation_no_latch ... 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 mavlink::tests::one_hundred_metres_north_projects_to_10000_cm_n ... ok

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

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

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

[ PASS] ( 7.77s) FV-FALCON-RATE-001: cargo test -p relay-rate
[ PASS] ( 10.58s) FV-FALCON-RATE-001: cargo test -p relay-rate --release
[ PASS] ( 0.72s) FV-FALCON-RATE-001: PROPTEST_CASES=4096 cargo test -p relay-rate
[ PASS] ( 1.23s) FV-FALCON-RATE-001: cargo test -p falcon-sitl-hover
[ PASS] ( 1.68s) FV-FALCON-RATE-001: cargo run -q -p falcon-sitl-hover --release
[ PASS] (101.30s) FV-FALCON-COV-002: cargo llvm-cov --workspace --summary-only
[ PASS] ( 5.08s) FV-FALCON-COV-002: cargo llvm-cov --workspace --lcov --output-path coverage.lcov
[ skip-no-steps] FV-FALCON-SIM-012: (no steps defined)
[ PASS] ( 0.36s) FV-FALCON-MIX-001: cargo test -p relay-mix-quad
[ PASS] ( 0.77s) FV-FALCON-MIX-001: cargo test -p relay-mix-quad --release
[ PASS] ( 0.20s) FV-FALCON-MIX-001: PROPTEST_CASES=4096 cargo test -p relay-mix-quad
[ skip-bench-only] FV-FALCON-GEO-002: cargo kani -p relay-lc
[ PASS] ( 0.45s) FV-FALCON-GEO-002: cargo test -p relay-lc
[ PASS] ( 0.60s) FV-FALCON-MAVLINK-001: cargo test -p relay-mavlink
[ PASS] ( 1.59s) FV-FALCON-MAVLINK-001: cargo test -p relay-mavlink --release
[ PASS] ( 0.53s) FV-FALCON-MAVLINK-001: PROPTEST_CASES=4096 cargo test -p relay-mavlink
[ skip-no-steps] FV-FALCON-SIM-008: (no steps defined)
[ PASS] ( 0.00s) FV-FALCON-TQ-001: ls docs/dossier/tool-qualification/
[ PASS] ( 0.01s) FV-FALCON-TQ-001: wc -l docs/dossier/tool-qualification/.md
[ 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
[ 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-no-steps] FV-FALCON-SIM-006: (no steps defined)
[ 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
[ skip-no-steps] FV-FALCON-SIM-011: (no steps defined)
[ PASS] ( 0.13s) FV-FALCON-UAM-001: cargo test -p falcon-sitl-hover tests::deterministic_untethered_mission_visits_all_waypoints
[ 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-PIPELINE-001: cargo test -p relay-mix-quad
[ PASS] ( 0.14s) FV-FALCON-PIPELINE-001: cargo test -p relay-rate
[ PASS] ( 0.16s) FV-FALCON-PIPELINE-001: cargo test -p falcon-sitl-hover
[ skip-no-steps] FV-FALCON-SIM-007: (no steps defined)
[ PASS] ( 0.35s) FV-FALCON-ATT-001: cargo test -p relay-att
[ PASS] ( 0.57s) FV-FALCON-ATT-001: cargo test -p relay-att --release
[ PASS] ( 0.21s) FV-FALCON-ATT-001: PROPTEST_CASES=4096 cargo test -p relay-att
[ PASS] ( 0.16s) FV-FALCON-ATT-001: cargo test -p falcon-sitl-hover
[ PASS] ( 0.08s) FV-FALCON-ATT-001: cargo run -q -p falcon-sitl-hover --release -- --scenario attitude
[ 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
[ PASS] (198.53s) 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
[ PASS] ( 0.35s) FV-FALCON-POS-001: cargo test -p relay-pos
[ PASS] ( 0.57s) FV-FALCON-POS-001: cargo test -p relay-pos --release
[ PASS] ( 0.22s) FV-FALCON-POS-001: PROPTEST_CASES=4096 cargo test -p relay-pos
[ PASS] ( 0.16s) 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.36s) FV-FALCON-WORLD-001: cargo test -p falcon-hello
[ PASS] ( 4.74s) FV-FALCON-WORLD-001: scripts/falcon-hello-demo.sh
[ 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.26s) FV-FALCON-SIM-003: cargo test -p falcon-sitl-gz
[ PASS] ( 0.24s) FV-FALCON-SIM-003: cargo run -p falcon-sitl-gz -- --scenario=open-loop-climb
[ skip-bench-only] FV-FALCON-SIM-003: cargo run -p falcon-sitl-gz -- --backend=gazebo --world=falcon --model=quad
[ 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-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-010: (no steps defined)
[ PASS] ( 0.13s) FV-FALCON-HITL-002: cargo test -p relay-mavlink
[ PASS] ( 0.25s) 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-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
running 9 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::frame_correction_is_identity ... ok
test tests::closed_loop_hover_compiles_and_ticks_on_mock ... ok
test tests::gazebo_stub_does_not_panic ... ok
test tests::mock_backend_climbs_under_full_thrust ... ok
test tests::evidence_sink_produces_log_and_csv ... ok

test result: ok. 9 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 mavlink::tests::build_frame_carries_correct_message_id ... ok
test mavlink::tests::altitude_translates_to_down ... ok
test hackrf::tests::hackrf_argv_shape_is_stable ... ok
test mavlink::tests::home_projects_to_origin ... ok
test mavlink::tests::mavlink_bench_no_violation_no_latch ... 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 20 tests
test bitpack::tests::bitpack_basic_id_packs_id_and_ua_type_in_same_byte ... ok
test bitpack::tests::bitpack_decoder_rejects_unknown_protocol_version ... ok
test bitpack::tests::bitpack_basic_id_round_trip ... 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 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 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 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_always_emits_unit_quaternion ... ok
test tests::tick_innovation_within_healthy_range ... ok
test tests::tick_returns_zero_position_and_velocity ... ok
test tests::unit_quaternion_check_rejects_clearly_non_unit ... 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::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.09s

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 engine::proptests::compare_matches_rust ... ok
test engine::proptests::disabled_never_fires ... ok
test engine::tests::geofence_boundary_inclusive ... ok
test engine::proptests::persistence_requires_consecutive ... 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::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.02s

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 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 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 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 tests::proptest_basic_id_round_trip ... ok
test bitpack::tests::proptest_bitpack_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.29s

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::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.05s

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_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::ekf_p01_property ... 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_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.79s

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 628 µs
NaN/∞ seen false
falcon-ekf-bench: PASS

running 55 tests
test command_long::tests::crc_extra_is_152 ... ok
test command_long::tests::decode_rejects_short_payload ... ok
test command_long::tests::field_offsets_match_spec ... ok
test command_long::tests::decode_rejects_long_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::rtl_builder_has_zero_params ... ok
test command_long::tests::round_trip_with_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 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.03s

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 mavlink::tests::altitude_translates_to_down ... ok
test mavlink::tests::build_frame_carries_correct_message_id ... ok
test hackrf::tests::hackrf_argv_shape_is_stable ... ok
test mavlink::tests::mavlink_bench_no_violation_no_latch ... ok
test mavlink::tests::home_projects_to_origin ... 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_trips_and_dispatches ... ok
test stub::tests::stub_bench_no_violation_no_latch ... ok

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

[ PASS] ( 0.08s) 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
[ skip-no-steps] FV-FALCON-SIM-009: (no steps defined)
[ skip-no-steps] FV-FALCON-SIM-013: (no steps defined)
[ PASS] ( 0.08s) FV-FALCON-HITL-001: cargo test -p falcon-hitl-rfspoof
[ PASS] ( 0.23s) 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-bench-only] FV-FALCON-NID-002: bazel test //:relay_nid_verus_test
[ PASS] ( 0.54s) FV-FALCON-NID-002: cargo test -p relay-nid
[ PASS] ( 0.36s) FV-FALCON-EKF-STUB-001: cargo test -p relay-ekf-stub
[ PASS] ( 0.74s) FV-FALCON-EKF-STUB-001: cargo test -p relay-ekf-stub --release
[ PASS] ( 0.19s) FV-FALCON-EKF-STUB-001: PROPTEST_CASES=4096 cargo test -p relay-ekf-stub
[ PASS] ( 94.47s) 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-GEO-001: bazel test //:relay_lc_verus_test
[ PASS] ( 0.12s) FV-FALCON-GEO-001: cargo test -p relay-lc
[ PASS] ( 0.10s) FV-FALCON-GEO-001: cargo test -p falcon-sitl-hover tests::deterministic_geofence_catches_spoof_and_triggers_rtl
[ PASS] ( 0.12s) FV-FALCON-NID-001: cargo test -p relay-nid
[ PASS] ( 0.40s) 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] ( 0.44s) FV-FALCON-EKF-001: cargo test -p relay-ekf
[ PASS] ( 0.83s) FV-FALCON-EKF-001: cargo test -p relay-ekf --release
[ PASS] ( 0.89s) FV-FALCON-EKF-001: PROPTEST_CASES=4096 cargo test -p relay-ekf
[ PASS] ( 0.19s) FV-FALCON-EKF-001: cargo test -p falcon-ekf-bench
[ PASS] ( 0.22s) FV-FALCON-EKF-001: cargo run -q -p falcon-ekf-bench --release
[ PASS] ( 0.13s) FV-FALCON-SIM-002: cargo test -p relay-mavlink
[ PASS] ( 0.08s) 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

❌ Rivet verification gate — falcon

33/25 passed

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

Failed artifacts

Bench-only artifacts (not run by CI)

  • 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-SIM-001 — PX4-SITL end-to-end loop — recipe + preset + smoke (v0.14.0)
  • FV-FALCON-ARCH-002 — spar codegen --format wit recheck — works at v0.10.0 (v0.15.0)
  • FV-FALCON-COV-003 — witness MC/DC on real Rust source — Geofence subject (v0.14.1)
  • FV-FALCON-GEO-003 — Geofence safety path — miri UB/overflow check (v0.12, AI substitute)

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

…op hover is gz-only now)

The v0.19.7 PosController retune (hover_thrust 0.5→0.72 for the 2 kg gz
airframe) makes the default closed-loop hover correctly FAIL on
MockPhysics — a ~500 g model that ignores attitude torque, so it can't
hover via the cascade. FV-FALCON-SIM-003's bare 'cargo run
-p falcon-sitl-gz' smoke step (default = mock + hover) therefore exited
1, failing the verification gate.

Fix: the mock smoke runs --scenario=open-loop-climb (pure collective-
thrust climb), the scenario MockPhysics can execute end-to-end. The
closed-loop hover is exercised against real gz in FV-FALCON-SIM-013
(bench-only). The default binary scenario is unchanged (gz hover is the
headline); only the mock smoke step is made scenario-explicit.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@avrabe avrabe merged commit bbf38ba into main May 29, 2026
9 checks passed
@avrabe avrabe deleted the feat/falcon-v0.19.7-cascade-hover branch May 29, 2026 05:41
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