System-Level Test Cases

Black-box, requirements-based, blind to code; oracles REVIEW REQUIRED.

comms safety supervision command actuation localization motion_control perception power_management cyclic_scheduler
644 system-level, requirements-based black-box test cases (EP / BVA / Decision / State / Interface / Scenario), generated blind to the source code. Every oracle is marked REVIEW REQUIRED (Design-Entscheidung B): the customer reviews and executes.

comms 52 tests

IDMethodCoversTitleStimuliExpected (oracle)
TC-COM-001BVAREQ-COM-001System time minimum boundarytick_ms_=0Module shall accept tick_ms_ = 0 without error; link_status_.time_since_last_valid_frame shall compute correctly using this timestamp
TC-COM-002BVAREQ-COM-001System time maximum boundarytick_ms_=max_valueREVIEW REQUIRED
TC-COM-003BVAREQ-COM-001System time monotonic advancement nominaltick_ms_=2000Module shall accept monotonically increasing tick_ms_; time_since_last_valid_frame and latency calculations shall reflect positive time deltas
TC-COM-004BVAREQ-COM-001System time non-monotonic violation (negative test)tick_ms_=3000REVIEW REQUIRED
TC-COM-005BVAREQ-COM-002Packet loss percentage at minimum boundarytick_ms_=1000link_status_.packet_loss_percentage shall be 0.0
TC-COM-006BVAREQ-COM-002Packet loss percentage at maximum boundarytick_ms_=1000link_status_.packet_loss_percentage shall be 100.0
TC-COM-007BVAREQ-COM-002Packet loss percentage mid-range nominaltick_ms_=1000link_status_.packet_loss_percentage shall be in range [0.0, 100.0], reflecting observed loss rate
TC-COM-008BVAREQ-COM-003Latency clamping at upper boundtick_ms_=10000REVIEW REQUIRED
TC-COM-009BVAREQ-COM-003Time since last valid frame clamping at upper boundtick_ms_=100000REVIEW REQUIRED
TC-COM-010BVAREQ-COM-003Latency below clamping threshold nominaltick_ms_=1100REVIEW REQUIRED
TC-COM-011EPREQ-COM-004Timestamp unit consistency in millisecondstick_ms_=600; link_degraded_timeout_ms_=500Time difference (600 - 0 = 600 ms) shall exceed link_degraded_timeout_ms_ (500 ms), triggering degraded state transition per REQ-COM-006
TC-COM-012BVAREQ-COM-004Zero time difference computationtick_ms_=1000link_status_.latency shall be 0 ms; time_since_last_valid_frame shall be 0 ms if frame just received
TC-COM-013BVAREQ-COM-004Negative time difference handling (non-monotonic edge case)tick_ms_=1000REVIEW REQUIRED
TC-COM-014DecisionREQ-COM-005Authentication failure sets command_authentic_ falsetick_ms_=1000command_authentic_ shall be false
TC-COM-015DecisionREQ-COM-005Replay detection sets replay_detected_ truetick_ms_=1000replay_detected_ shall be true
TC-COM-016DecisionREQ-COM-005Decoding failure sets remote_command_.valid falsetick_ms_=1000remote_command_.valid shall be false
TC-COM-017DecisionREQ-COM-005Link lost timeout triggers lost statetick_ms_=2001; link_lost_timeout_ms_=2000link_status_.state shall be link_state_t::lost
TC-COM-018BVAREQ-COM-005Link lost timeout boundary exact matchtick_ms_=2000; link_lost_timeout_ms_=2000link_status_.state shall remain in previous state (not yet lost) or transition to lost if condition is >= rather than >
TC-COM-019BVAREQ-COM-005Link lost timeout boundary one below thresholdtick_ms_=1999; link_lost_timeout_ms_=2000link_status_.state shall remain in degraded or ok state (not yet lost)
TC-COM-020DecisionREQ-COM-006Degraded state transition due to age timeouttick_ms_=1001; link_degraded_timeout_ms_=1000link_status_.state shall transition from ok to degraded
TC-COM-021DecisionREQ-COM-006Degraded state transition due to latency thresholdtick_ms_=2000; link_max_latency_ms_=500link_status_.state shall transition from ok to degraded
TC-COM-022DecisionREQ-COM-006Degraded state transition due to packet loss thresholdtick_ms_=1000; link_max_packet_loss_pct_=10.0link_status_.state shall transition from ok to degraded when link_status_.packet_loss_percentage > 10.0
TC-COM-023DecisionREQ-COM-006Lost state transition due to lost timeouttick_ms_=3001; link_lost_timeout_ms_=3000link_status_.state shall transition from degraded to lost
TC-COM-024BVAREQ-COM-006Degraded timeout boundary exact matchtick_ms_=1000; link_degraded_timeout_ms_=1000link_status_.state shall remain ok or transition to degraded if condition is >= rather than >
TC-COM-025BVAREQ-COM-006Latency threshold boundary exact matchtick_ms_=1000; link_max_latency_ms_=200link_status_.state shall remain ok or transition to degraded if condition is >= rather than >
TC-COM-026BVAREQ-COM-006Packet loss threshold boundary exact matchtick_ms_=1000; link_max_packet_loss_pct_=15.0link_status_.state shall remain ok or transition to degraded if condition is >= rather than >
TC-COM-027DecisionREQ-COM-006Multiple degradation conditions simultaneoustick_ms_=2000; link_max_latency_ms_=100; link_max_packet_loss_pct_=5.0link_status_.state shall transition from ok to degraded (OR logic across conditions)
TC-COM-028BVAREQ-COM-007Sliding window size at maximum boundarytick_ms_=1000REVIEW REQUIRED
TC-COM-029BVAREQ-COM-007Tracked gaps at maximum boundarytick_ms_=1000REVIEW REQUIRED
TC-COM-030DecisionREQ-COM-007Window overflow handling (negative test)tick_ms_=1000REVIEW REQUIRED
TC-COM-031StateREQ-COM-008Initial link state at first executiontick_ms_=0REVIEW REQUIRED
TC-COM-032StateREQ-COM-008Lost to degraded state transitiontick_ms_=1000link_status_.state shall transition from lost to degraded (or directly to ok if conditions allow jump)
TC-COM-033StateREQ-COM-008Degraded to ok state transitiontick_ms_=1000; link_max_latency_ms_=500; link_max_packet_loss_pct_=10.0; link_degraded_timeout_ms_=1000link_status_.state shall transition from degraded to ok
TC-COM-034StateREQ-COM-008Ok to degraded state transitiontick_ms_=2000; link_degraded_timeout_ms_=1000link_status_.state shall transition from ok to degraded per REQ-COM-006 conditions
TC-COM-035StateREQ-COM-008Degraded to lost state transitiontick_ms_=5000; link_lost_timeout_ms_=3000link_status_.state shall transition from degraded to lost per REQ-COM-006 conditions
TC-COM-036StateREQ-COM-008Lost to ok direct jump transitiontick_ms_=1000link_status_.state shall transition from lost directly to ok (skipping degraded) if conditions allow per requirement
TC-COM-037StateREQ-COM-008Ok to lost direct jump transitiontick_ms_=4000; link_degraded_timeout_ms_=1000; link_lost_timeout_ms_=3000link_status_.state shall transition from ok directly to lost if lost_timeout is exceeded (even if degraded_timeout also exceeded)
TC-COM-038StateREQ-COM-008State persistence without transition conditiontick_ms_=1500; link_lost_timeout_ms_=3000link_status_.state shall remain degraded (no spurious transition)
TC-COM-039InterfaceREQ-COM-009Execution order within cycletick_ms_=1000REVIEW REQUIRED
TC-COM-040InterfaceREQ-COM-009Authentication signals available to link_monitor in same cycletick_ms_=1000command_authentic_ and replay_detected_ shall reflect authentication result of current cycle's link_frame_ before link_monitor reads them (same-cycle consistency)
TC-COM-041InterfaceREQ-COM-009Link receiver alive counter incremented once per cycletick_ms_=1000alive_counters_[module_id::link_receiver] shall increment by exactly 1 per cycle
TC-COM-042InterfaceREQ-COM-009Link monitor alive counter incremented once per cycletick_ms_=2000alive_counters_[module_id::link_monitor] shall increment by exactly 1 per cycle
TC-COM-043InterfaceREQ-COM-009Alive counters do not double-increment in single cycletick_ms_=1000Both alive_counters_[module_id::link_receiver] and alive_counters_[module_id::link_monitor] shall each increment by exactly 1 (not 0, not 2+)
TC-COM-044ScenarioREQ-COM-005, REQ-COM-006End-to-end link loss scenariotick_ms_=3500; link_degraded_timeout_ms_=1000; link_lost_timeout_ms_=3000link_status_.state shall be lost, command_authentic_ shall be false, remote_command_.valid shall be false
TC-COM-045ScenarioREQ-COM-005, REQ-COM-006Link recovery from lost to ok scenariotick_ms_=5000link_status_.state shall transition to ok (or degraded then ok), command_authentic_ shall be true, remote_command_.valid shall be true
TC-COM-046BVAREQ-COM-006Calibration parameter minimum boundary - degraded timeouttick_ms_=1; link_degraded_timeout_ms_=0link_status_.state shall transition to degraded immediately (any age > 0 exceeds threshold 0)
TC-COM-047BVAREQ-COM-006Calibration parameter minimum boundary - lost timeouttick_ms_=1; link_lost_timeout_ms_=0link_status_.state shall transition to lost immediately (any age > 0 exceeds threshold 0)
TC-COM-048BVAREQ-COM-006Calibration parameter minimum boundary - latency thresholdtick_ms_=1000; link_max_latency_ms_=0link_status_.state shall transition to degraded (any latency > 0 exceeds threshold 0)
TC-COM-049BVAREQ-COM-006Calibration parameter minimum boundary - packet loss thresholdtick_ms_=1000; link_max_packet_loss_pct_=0.0link_status_.state shall transition to degraded (any loss > 0% exceeds threshold 0%)
TC-COM-050BVAREQ-COM-006Calibration parameter high value - degraded timeouttick_ms_=86400000; link_degraded_timeout_ms_=86400000link_status_.state shall remain ok until time_since_last_valid_frame exceeds 86400000 ms (24 hours)
TC-COM-051DecisionREQ-COM-002, REQ-COM-006Packet loss exactly at 100% triggers degradedtick_ms_=1000; link_max_packet_loss_pct_=99.0link_status_.packet_loss_percentage shall be 100.0 (per REQ-COM-002) and link_status_.state shall be degraded (100.0 > 99.0)
TC-COM-052ScenarioREQ-COM-004, REQ-COM-006Timeout threshold comparison with consistent time unitstick_ms_=6501; link_degraded_timeout_ms_=1500Time since last valid frame (6501 - 5000 = 1501 ms) shall exceed threshold (1500 ms) triggering degraded transition

safety 81 tests

IDMethodCoversTitleStimuliExpected (oracle)
TC-SAF-001BVAREQ-SAF-001Pose validity with confidence at minimum thresholdbus.pose_.validity=True; bus.pose_.confidence=pose_min_confidence_; bus.pose_.speed=10.0Pose is treated as valid; no pose-invalid fault raised; bus.any_fault_active_ does not reflect pose invalidity
TC-SAF-002BVAREQ-SAF-001Pose validity with confidence just below minimum thresholdbus.pose_.validity=True; bus.pose_.confidence=pose_min_confidence_ - 0.01; bus.pose_.speed=10.0Pose is treated as invalid; module behavior reflects invalid pose (e.g., fault or safe fallback)
TC-SAF-003BVAREQ-SAF-001Pose validity flag falsebus.pose_.validity=False; bus.pose_.confidence=0.95; bus.pose_.speed=10.0Pose is treated as invalid regardless of high confidence; module reflects invalid pose state
TC-SAF-004BVAREQ-SAF-001Speed at minimum valid range boundarybus.pose_.validity=True; bus.pose_.confidence=0.95; bus.pose_.speed=min_speed_mpsREVIEW REQUIRED
TC-SAF-005BVAREQ-SAF-001Speed just below minimum valid rangebus.pose_.validity=True; bus.pose_.confidence=0.95; bus.pose_.speed=min_speed_mps - 0.01REVIEW REQUIRED
TC-SAF-006BVAREQ-SAF-001Speed at maximum valid range boundarybus.pose_.validity=True; bus.pose_.confidence=0.95; bus.pose_.speed=max_speed_mpsREVIEW REQUIRED
TC-SAF-007BVAREQ-SAF-001Speed just above maximum valid rangebus.pose_.validity=True; bus.pose_.confidence=0.95; bus.pose_.speed=max_speed_mps + 0.01REVIEW REQUIRED
TC-SAF-008BVAREQ-SAF-002Geofence distance to boundary is zero (on boundary)bus.pose_.x=geofence_max_x_m_; bus.pose_.y=50.0; bus.pose_.validity=True; bus.pose_.confidence=0.95bus.geofence_.distance_to_boundary_m >= 0.0 (non-negative, likely 0.0)
TC-SAF-009BVAREQ-SAF-002Safe stop target deceleration minimum boundarybus.geofence_.breach=True; bus.pose_.speed=5.0REVIEW REQUIRED
TC-SAF-010BVAREQ-SAF-002Safe stop target deceleration maximum boundarybus.geofence_.breach=True; bus.pose_.speed=30.0REVIEW REQUIRED
TC-SAF-011EPREQ-SAF-002Health state is OK under nominal conditionsbus.any_fault_active_=False; bus.critical_fault_active_=False; bus.watchdog_ok_=True; bus.link_status_=link_state_t::okbus.health_ == health_state_t::ok
TC-SAF-012EPREQ-SAF-002Health state is degraded under non-critical faultbus.any_fault_active_=True; bus.critical_fault_active_=False; bus.watchdog_ok_=Truebus.health_ == health_state_t::degraded
TC-SAF-013EPREQ-SAF-002Health state is critical under critical faultbus.critical_fault_active_=True; bus.watchdog_ok_=Truebus.health_ == health_state_t::critical
TC-SAF-014BVAREQ-SAF-002Fault list at maximum capacity (64 entries)bus.faults_.size()=63; trigger_new_fault=Truebus.faults_.size() == 64; no overflow beyond 64 entries
TC-SAF-015BVAREQ-SAF-002Fault list overflow attempt (65th fault)bus.faults_.size()=64; trigger_new_fault=Truebus.faults_.size() remains 64; new fault is dropped (ignore_new policy)
TC-SAF-016BVAREQ-SAF-003Geofence distance clamping at minimumbus.pose_.x=geofence_max_x_m_ + 1000; bus.pose_.y=50.0; bus.pose_.validity=True; bus.pose_.confidence=0.95REVIEW REQUIRED
TC-SAF-017BVAREQ-SAF-003Safe stop deceleration clamping at minimumbus.geofence_.breach=True; bus.pose_.speed=0.5REVIEW REQUIRED
TC-SAF-018BVAREQ-SAF-003Safe stop deceleration clamping at maximumbus.geofence_.breach=True; bus.pose_.speed=50.0REVIEW REQUIRED
TC-SAF-019BVAREQ-SAF-003E-stop deceleration clamped to calibrated emergency decelerationbus.collision_.imminent=True; emergency_decel_mps2_=8.0bus.estop_.target_decel_mps2 == 8.0 (clamped to cal_.emergency_decel_mps2_)
TC-SAF-020InterfaceREQ-SAF-004Geofence distance is unsigned magnitudebus.pose_.x=geofence_max_x_m_ + 10; bus.pose_.y=50.0; bus.pose_.validity=True; bus.pose_.confidence=0.95bus.geofence_.distance_to_boundary_m >= 0.0 (unsigned magnitude in meters)
TC-SAF-021InterfaceREQ-SAF-004Deceleration values are positive magnitudesbus.geofence_.breach=True; bus.pose_.speed=10.0; safe_stop_decel_mps2_=3.0bus.safe_stop_.target_decel_mps2 > 0.0 (positive magnitude in m/s²)
TC-SAF-022InterfaceREQ-SAF-004Speed computed in meters per secondbus.pose_.speed=15.0; bus.pose_.validity=True; bus.pose_.confidence=0.95Module interprets bus.pose_.speed as 15.0 m/s; all speed comparisons use m/s units
TC-SAF-023DecisionREQ-SAF-005Invalid pose when validity flag is falsebus.pose_.validity=False; bus.pose_.confidence=0.95; bus.pose_.speed=10.0Pose treated as invalid; module does not use pose data for safety-critical decisions
TC-SAF-024DecisionREQ-SAF-005Invalid pose when confidence below minimum thresholdbus.pose_.validity=True; bus.pose_.confidence=pose_min_confidence_ - 0.05; bus.pose_.speed=10.0Pose treated as invalid due to low confidence
TC-SAF-025DecisionREQ-SAF-005E-stop activation on link lostbus.link_status_=link_state_t::lostbus.estop_.active == true; bus.estop_.source indicates link_loss trigger
TC-SAF-026DecisionREQ-SAF-005E-stop activation on imminent collisionbus.collision_.imminent=Truebus.estop_.active == true; bus.estop_.source indicates obstacle/collision trigger
TC-SAF-027DecisionREQ-SAF-005Critical health state on critical fault activebus.critical_fault_active_=True; bus.watchdog_ok_=Truebus.health_ == health_state_t::critical
TC-SAF-028DecisionREQ-SAF-005Critical health state on watchdog failurebus.watchdog_ok_=False; bus.critical_fault_active_=Falsebus.health_ == health_state_t::critical
TC-SAF-029DecisionREQ-SAF-005Safe stop activation on geofence breachbus.geofence_.breach=True; bus.pose_.speed=10.0bus.safe_stop_.active == true; bus.safe_stop_.target_decel_mps2 set to safe_stop_decel_mps2_ calibration
TC-SAF-030DecisionREQ-SAF-006Fault confirmation after 3 consecutive cyclescycle_1_fault_present=True; cycle_2_fault_present=True; cycle_3_fault_present=TrueFault is confirmed after cycle 3; fault entry shows confirmation_status == confirmed (or equivalent)
TC-SAF-031DecisionREQ-SAF-006Fault not confirmed if intermittent (2 of 3 cycles)cycle_1_fault_present=True; cycle_2_fault_present=False; cycle_3_fault_present=TrueFault is not confirmed after cycle 3; confirmation counter resets on missing detection
TC-SAF-032StateREQ-SAF-006E-stop latching: remains active while trigger persistscycle_1_bus.link_status_=link_state_t::lost; cycle_2_bus.link_status_=link_state_t::lost; bus.pose_.speed=5.0bus.estop_.active remains true across cycles while link_status_ is lost
TC-SAF-033StateREQ-SAF-006E-stop deactivation after triggers clear and standstill reachedbus.link_status_=link_state_t::ok; bus.collision_.imminent=False; bus.geofence_.breach=False; bus.remote_command_.estop_request=False; bus.pose_.speed=standstill_speed_mps_ - 0.01; standstill_duration=standstill_duration_cyclesREVIEW REQUIRED
TC-SAF-034InterfaceREQ-SAF-006Alive counter increments every cyclebus.tick_ms_=1000bus.alive_counters_[module_id::geofence], bus.alive_counters_[module_id::safe_stop], bus.alive_counters_[module_id::estop] each increment by 1 per cycle
TC-SAF-035InterfaceREQ-SAF-006E-stop activation timestamp captured from tick_msbus.collision_.imminent=True; bus.tick_ms_=123456789bus.estop_.activated_tick_ms == 123456789 (timestamp captured at activation)
TC-SAF-036BVAREQ-SAF-007Fault list at capacity minus one (63 entries)bus.faults_.size()=62; trigger_new_fault=TrueREVIEW REQUIRED
TC-SAF-037BVAREQ-SAF-007Fault list overflow policy: new fault dropped when fullbus.faults_.size()=max_faults_limit; trigger_new_fault=TrueREVIEW REQUIRED
TC-SAF-038BVAREQ-SAF-007Fault occurrence count at maximumfault_entry.occurrence_count=max_occurrence_count - 1; trigger_same_fault_again=TrueREVIEW REQUIRED
TC-SAF-039BVAREQ-SAF-007Fault occurrence count overflow behaviorfault_entry.occurrence_count=max_occurrence_count; trigger_same_fault_again=TrueREVIEW REQUIRED
TC-SAF-040BVAREQ-SAF-007Alive counter wraparound at UINT32_MAXbus.alive_counters_[module_id::geofence]=4294967295After one cycle, bus.alive_counters_[module_id::geofence] wraps to 0 (unsigned wraparound per C++ standard)
TC-SAF-041StateREQ-SAF-008E-stop initial state is INACTIVEbus.estop_.active == false; bus.estop_.source == estop_source_t::none
TC-SAF-042StateREQ-SAF-008E-stop transition INACTIVE to ACTIVE_LATCHED on collisionbus.estop_.active=False; bus.collision_.imminent=Truebus.estop_.active == true; bus.estop_.source indicates obstacle/collision; bus.estop_.activated_tick_ms recorded
TC-SAF-043StateREQ-SAF-008E-stop remains ACTIVE_LATCHED while any trigger persistsbus.estop_.active=True; bus.collision_.imminent=True; bus.pose_.speed=5.0bus.estop_.active remains true; source reflects highest-priority active trigger
TC-SAF-044StateREQ-SAF-008E-stop source priority: local_button highest priorityinject_local_estop=True; bus.collision_.imminent=True; bus.link_status_=link_state_t::lostbus.estop_.source indicates local_button (highest priority per priority order)
TC-SAF-045StateREQ-SAF-008E-stop source priority: obstacle over link_lossinject_local_estop=False; bus.collision_.imminent=True; bus.link_status_=link_state_t::lostbus.estop_.source indicates obstacle (higher priority than link_loss per priority order)
TC-SAF-046StateREQ-SAF-008E-stop source priority: link_loss over geofenceinject_local_estop=False; bus.collision_.imminent=False; bus.link_status_=link_state_t::lost; bus.geofence_.breach=Truebus.estop_.source indicates link_loss (higher priority than geofence per priority order)
TC-SAF-047StateREQ-SAF-008E-stop source priority: geofence over remote_commandinject_local_estop=False; bus.collision_.imminent=False; bus.link_status_=link_state_t::ok; bus.geofence_.breach=True; bus.remote_command_.estop_request=Truebus.estop_.source indicates geofence (higher priority than remote_command per priority order)
TC-SAF-048StateREQ-SAF-008E-stop transition ACTIVE_LATCHED to INACTIVE when all triggers clear and standstill reachedbus.estop_.active=True; bus.collision_.imminent=False; bus.link_status_=link_state_t::ok; bus.geofence_.breach=False; bus.remote_command_.estop_request=False; inject_local_estop=False; bus.pose_.speed=standstill_speed_mps_ - 0.01bus.estop_.active == false after standstill condition holds for required duration; bus.estop_.source reset to none
TC-SAF-049StateREQ-SAF-008E-stop does not deactivate if speed above standstill thresholdbus.estop_.active=True; bus.collision_.imminent=False; bus.link_status_=link_state_t::ok; bus.geofence_.breach=False; bus.remote_command_.estop_request=False; inject_local_estop=False; bus.pose_.speed=standstill_speed_mps_ + 0.5bus.estop_.active remains true (standstill condition not met)
TC-SAF-050StateREQ-SAF-008E-stop entry action: timestamp recorded at activationbus.estop_.active=False; bus.collision_.imminent=True; bus.tick_ms_=987654321bus.estop_.activated_tick_ms == 987654321 (captured at transition to ACTIVE_LATCHED)
TC-SAF-051ScenarioREQ-SAF-009Fault memory reads faults from all modules before processingmodule_a_fault=True; module_b_fault=TrueREVIEW REQUIRED
TC-SAF-052ScenarioREQ-SAF-009tick_ms updated before run() called each cyclebus.tick_ms_=1000Module observes updated tick_ms_ value within run(); timestamps use current tick_ms_
TC-SAF-053ScenarioREQ-SAF-009inject_local_estop called before run() each cycleinject_local_estop=TrueREVIEW REQUIRED
TC-SAF-054InterfaceREQ-SAF-009All input bus fields read atomically within single run()bus.pose_.speed=10.0; bus.collision_.imminent=FalseModule observes consistent snapshot of all input fields; no torn reads across field boundaries
TC-SAF-055InterfaceREQ-SAF-009All output bus fields written atomically before run() returnsDownstream consumers observe consistent state across all output fields; no partial updates visible
TC-SAF-056BVAREQ-SAF-002Fault list size exactly at limit (64 entries)bus.faults_.size()=64bus.faults_.size() == 64; no overflow, system stable
TC-SAF-057ScenarioREQ-SAF-005Combined fault scenario: link lost AND collision AND geofence breachbus.link_status_=link_state_t::lost; bus.collision_.imminent=True; bus.geofence_.breach=Truebus.estop_.active == true (E-stop from link/collision); bus.safe_stop_.active == true (from geofence); bus.health_ == health_state_t::critical (multiple critical faults)
TC-SAF-058ScenarioREQ-SAF-005Watchdog failure during active E-stopbus.estop_.active=True; bus.watchdog_ok_=Falsebus.health_ == health_state_t::critical; E-stop remains active; system does not attempt recovery
TC-SAF-059ScenarioREQ-SAF-001, REQ-SAF-005Geofence breach with invalid pose (low confidence)bus.pose_.x=geofence_max_x_m_ + 5; bus.pose_.y=50.0; bus.pose_.validity=True; bus.pose_.confidence=pose_min_confidence_ - 0.1; bus.geofence_.breach=TruePose treated as invalid; geofence breach detection may be suspended or fault raised for invalid pose; safe stop behavior depends on pose validity policy
TC-SAF-060ScenarioREQ-SAF-006, REQ-SAF-008E-stop deactivation boundary: speed exactly at standstill thresholdbus.estop_.active=True; bus.collision_.imminent=False; bus.link_status_=link_state_t::ok; bus.geofence_.breach=False; bus.remote_command_.estop_request=False; inject_local_estop=False; bus.pose_.speed=standstill_speed_mps_E-stop deactivation condition evaluates speed <= standstill_speed_mps_ (inclusive boundary); after required duration, bus.estop_.active == false
TC-SAF-061EPREQ-SAF-003Emergency deceleration applied on E-stop activationbus.collision_.imminent=True; emergency_decel_mps2_=8.0E-stop deceleration target set to 8.0 m/s² (cal_.emergency_decel_mps2_)
TC-SAF-062EPREQ-SAF-003Safe stop deceleration applied on geofence breachbus.geofence_.breach=True; bus.pose_.speed=15.0; safe_stop_decel_mps2_=3.0bus.safe_stop_.target_decel_mps2 set to 3.0 m/s² (cal_.safe_stop_decel_mps2_)
TC-SAF-063InterfaceREQ-SAF-002Geofence distance to boundary is zero when exactly on boundarybus.pose_.x=geofence_max_x_m_; bus.pose_.y=geofence_min_y_m_ + 10; bus.pose_.validity=True; bus.pose_.confidence=0.95bus.geofence_.distance_to_boundary_m == 0.0 (non-negative, zero on boundary)
TC-SAF-064InterfaceREQ-SAF-002Geofence inside flag true when well inside boundarybus.pose_.x=geofence_min_x_m_ + 50; bus.pose_.y=geofence_min_y_m_ + 50; bus.pose_.validity=True; bus.pose_.confidence=0.95bus.geofence_.inside == true; bus.geofence_.breach == false; bus.geofence_.distance_to_boundary_m > 0
TC-SAF-065InterfaceREQ-SAF-002Geofence breach flag true when outside boundarybus.pose_.x=geofence_max_x_m_ + 10; bus.pose_.y=geofence_min_y_m_ + 50; bus.pose_.validity=True; bus.pose_.confidence=0.95bus.geofence_.inside == false; bus.geofence_.breach == true; bus.geofence_.distance_to_boundary_m >= 0
TC-SAF-066DecisionREQ-SAF-005Safe stop not activated when inside geofencebus.pose_.x=geofence_min_x_m_ + 50; bus.pose_.y=geofence_min_y_m_ + 50; bus.geofence_.breach=False; bus.pose_.validity=True; bus.pose_.confidence=0.95bus.safe_stop_.active == false (no geofence breach trigger)
TC-SAF-067StateREQ-SAF-008E-stop does not deactivate while collision trigger persistsbus.estop_.active=True; bus.collision_.imminent=True; bus.link_status_=link_state_t::ok; bus.pose_.speed=0.0bus.estop_.active remains true (collision trigger still active despite standstill)
TC-SAF-068DecisionREQ-SAF-006Fault debouncing: fault clears before confirmation (1 cycle present, then absent)cycle_1_fault_present=True; cycle_2_fault_present=FalseFault not confirmed; confirmation counter resets; fault not added to bus.faults_ persistent list
TC-SAF-069InterfaceREQ-SAF-007Alive counter for geofence monitor increments monotonicallybus.alive_counters_[module_id::geofence] increments by 1 each cycle (monotonically increasing until wraparound)
TC-SAF-070InterfaceREQ-SAF-007Alive counter for safe stop controller increments monotonicallybus.alive_counters_[module_id::safe_stop] increments by 1 each cycle (monotonically increasing until wraparound)
TC-SAF-071InterfaceREQ-SAF-007Alive counter for estop handler increments monotonicallybus.alive_counters_[module_id::estop] increments by 1 each cycle (monotonically increasing until wraparound)
TC-SAF-072ScenarioREQ-SAF-002, REQ-SAF-005Health state transitions from OK to DEGRADED on non-critical faultbus.any_fault_active_=True; bus.critical_fault_active_=False; bus.watchdog_ok_=Truebus.health_ transitions from health_state_t::ok to health_state_t::degraded
TC-SAF-073ScenarioREQ-SAF-002, REQ-SAF-005Health state transitions from DEGRADED to CRITICAL on critical faultbus.any_fault_active_=True; bus.critical_fault_active_=True; bus.watchdog_ok_=Truebus.health_ transitions from health_state_t::degraded to health_state_t::critical
TC-SAF-074ScenarioREQ-SAF-002, REQ-SAF-005Health state remains CRITICAL while watchdog failure persistsbus.watchdog_ok_=False; bus.critical_fault_active_=Falsebus.health_ remains health_state_t::critical across multiple cycles while watchdog_ok_ is false
TC-SAF-075StateREQ-SAF-008E-stop source updates to highest priority when multiple triggers activebus.estop_.active=True; bus.geofence_.breach=True; bus.collision_.imminent=Truebus.estop_.source updates from geofence to obstacle (higher priority trigger)
TC-SAF-076InterfaceREQ-SAF-001, REQ-SAF-004Speed value negative treated as invalidbus.pose_.validity=True; bus.pose_.confidence=0.95; bus.pose_.speed=-5.0REVIEW REQUIRED
TC-SAF-077InterfaceREQ-SAF-004Geofence coordinates interpreted as signed meters (negative X)geofence_min_x_m_=-100.0; geofence_max_x_m_=100.0; bus.pose_.x=-50.0; bus.pose_.y=0.0; bus.pose_.validity=True; bus.pose_.confidence=0.95bus.geofence_.inside == true (vehicle inside geofence with negative X coordinate); distance computed correctly
TC-SAF-078InterfaceREQ-SAF-004Geofence coordinates interpreted as signed meters (negative Y)geofence_min_y_m_=-100.0; geofence_max_y_m_=100.0; bus.pose_.x=0.0; bus.pose_.y=-50.0; bus.pose_.validity=True; bus.pose_.confidence=0.95bus.geofence_.inside == true (vehicle inside geofence with negative Y coordinate); distance computed correctly
TC-SAF-079DecisionREQ-SAF-006Fault confirmation counter increments each cycle fault is presentcycle_1_fault_present=True; cycle_2_fault_present=TrueFault confirmation counter increments from 1 to 2; fault not yet confirmed (requires 3 cycles)
TC-SAF-080DecisionREQ-SAF-006Fault confirmation counter resets when fault disappearscycle_1_fault_present=True; cycle_2_fault_present=True; cycle_3_fault_present=FalseFault confirmation counter resets to 0; fault not confirmed; if fault reappears, counter restarts from 1
TC-SAF-081DecisionREQ-SAF-007Fault occurrence count increments on repeated fault detectionfault_already_confirmed=True; trigger_same_fault_again=TrueFault entry occurrence_count increments by 1; fault remains in bus.faults_ list

supervision 53 tests

IDMethodCoversTitleStimuliExpected (oracle)
TC-SUP-001BVAREQ-SUP-001Verify acceptance of link_status_.state_ at nominal boundarylink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseModule accepts link_status_.state_ = nominal and produces valid vehicle_mode_ output from the enumeration {init, idle, remote, autonomous, safe_stop, emergency, fault}
TC-SUP-002EPREQ-SUP-001Verify acceptance of link_status_.state_ = lostlink_status_.state_=lost; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseModule accepts link_status_.state_ = lost and produces valid vehicle_mode_ output
TC-SUP-003EPREQ-SUP-001Verify acceptance of link_status_.state_ = degradedlink_status_.state_=degraded; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseModule accepts link_status_.state_ = degraded and produces valid vehicle_mode_ output
TC-SUP-004EPREQ-SUP-001Verify acceptance of health_ = criticallink_status_.state_=nominal; health_=critical; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseModule accepts health_ = critical and produces valid vehicle_mode_ output
TC-SUP-005EPREQ-SUP-001Verify acceptance of health_ = degradedlink_status_.state_=nominal; health_=degraded; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseModule accepts health_ = degraded and produces valid vehicle_mode_ output
TC-SUP-006EPREQ-SUP-001Verify acceptance of estop_.source_ = local_buttonlink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseModule accepts estop_.source_ = local_button and produces valid vehicle_mode_ output
TC-SUP-007EPREQ-SUP-001Verify acceptance of estop_.source_ = obstaclelink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=obstacle; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseModule accepts estop_.source_ = obstacle and produces valid vehicle_mode_ output
TC-SUP-008EPREQ-SUP-001Verify acceptance of estop_.source_ = remotelink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=remote; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseModule accepts estop_.source_ = remote and produces valid vehicle_mode_ output
TC-SUP-009BVAREQ-SUP-001Verify acceptance of pose_.speed_mps_ at lower boundary 0.0link_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseModule accepts pose_.speed_mps_ = 0.0 (minimum valid speed) and produces valid outputs
TC-SUP-010BVAREQ-SUP-001Verify acceptance of pose_.speed_mps_ at upper boundarylink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=PENDING_speed_max_mps; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseREVIEW REQUIRED
TC-SUP-011BVAREQ-SUP-001Verify handling of geofence_.distance_to_boundary_m_ at lower boundarylink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=PENDING_geofence_distance_min_m; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseREVIEW REQUIRED
TC-SUP-012BVAREQ-SUP-001Verify handling of geofence_.distance_to_boundary_m_ at upper boundarylink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=PENDING_geofence_distance_max_m; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseREVIEW REQUIRED
TC-SUP-013EPREQ-SUP-002Verify vehicle_mode_ emits value from valid enumeration setlink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=Falsevehicle_mode_ output is one of {init, idle, remote, autonomous, safe_stop, emergency, fault}
TC-SUP-014EPREQ-SUP-002Verify previous_mode_ emits value from valid enumeration setlink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=Falseprevious_mode_ output is one of {init, idle, remote, autonomous, safe_stop, emergency, fault}
TC-SUP-015EPREQ-SUP-002Verify degradation_level_ emits value from valid enumeration setlink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=Falsedegradation_level_ output is one of {full, reduced_speed, geofence_hold, safe_stop_only}
TC-SUP-016BVAREQ-SUP-002Verify remote_takeover_requested_ emits truelink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=Falseremote_takeover_requested_ output is true (boolean value from {true, false})
TC-SUP-017BVAREQ-SUP-002Verify remote_takeover_requested_ emits falselink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=Falseremote_takeover_requested_ output is false (boolean value from {true, false})
TC-SUP-018BVAREQ-SUP-002Verify watchdog_ok_ emits truelink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=Falsewatchdog_ok_ output is true (boolean value from {true, false}) when all alive_counters_ increment normally
TC-SUP-019BVAREQ-SUP-002Verify watchdog_ok_ emits falselink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=Falsewatchdog_ok_ output is false (boolean value from {true, false}) when any alive_counters_ element exhibits non-monotonic behavior per REQ-SUP-005
TC-SUP-020BVAREQ-SUP-003Verify init_cycles_ saturation at maximum valuelink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseREVIEW REQUIRED
TC-SUP-021BVAREQ-SUP-003Verify alive_counters_ wraparound detection using modulo-2^32 arithmeticlink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseModule correctly detects alive_counters_ increment when counter wraps from 4294967295 to 0 using modulo-2^32 (4294967296) arithmetic, watchdog_ok_ remains true
TC-SUP-022BVAREQ-SUP-004Verify geofence_.distance_to_boundary_m_ positive value interpretation (outside boundary)link_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=50.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=False; geofence_margin_m_=10.0Module interprets geofence_.distance_to_boundary_m_ = 50.0 meters as distance outside boundary per REQ-SUP-004, degradation_level_ not set to geofence_hold (since distance 50.0 > margin 10.0)
TC-SUP-023BVAREQ-SUP-004Verify geofence_.distance_to_boundary_m_ negative value interpretation (breach depth)link_status_.state_=nominal; health_=nominal; geofence_.breach_=True; geofence_.distance_to_boundary_m_=-15.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=False; geofence_margin_m_=10.0Module interprets geofence_.distance_to_boundary_m_ = -15.0 meters as breach depth of 15.0 meters per REQ-SUP-004, degradation_level_ set to geofence_hold or more restrictive
TC-SUP-024EPREQ-SUP-004Verify pose_.speed_mps_ non-negative interpretation (forward speed magnitude)link_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=5.5; plausible_command_.plausible_=True; plausible_command_.speed_mps_=5.5; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=False; standstill_speed_mps_=0.1Module interprets pose_.speed_mps_ = 5.5 m/s as forward speed magnitude per REQ-SUP-004, recognizes vehicle is not at standstill (5.5 > 0.1)
TC-SUP-025EPREQ-SUP-004Verify plausible_command_.speed_mps_ non-negative interpretationlink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=3.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseModule interprets plausible_command_.speed_mps_ = 3.0 m/s as forward speed magnitude per REQ-SUP-004, uses value for command evaluation
TC-SUP-026DecisionREQ-SUP-005Verify fault reaction to invalid link_status_.state_ inputlink_status_.state_=INVALID_VALUE; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseREVIEW REQUIRED
TC-SUP-027DecisionREQ-SUP-005Verify fault reaction to invalid health_ inputlink_status_.state_=nominal; health_=INVALID_VALUE; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseREVIEW REQUIRED
TC-SUP-028DecisionREQ-SUP-005Verify watchdog_ok_ set to false on non-monotonic alive_counters_ behaviorlink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=Falsewatchdog_ok_ output is false per REQ-SUP-005 when any alive_counters_ element exhibits non-monotonic behavior (counter stall or corruption)
TC-SUP-029DecisionREQ-SUP-005Verify fault reaction when remote_command_.valid_ is falselink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=False; remote_command_.mode_autonomous_request_=FalseREVIEW REQUIRED
TC-SUP-030DecisionREQ-SUP-005Verify fault reaction when plausible_command_.plausible_ is falselink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=False; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseREVIEW REQUIRED
TC-SUP-031StateREQ-SUP-006Verify transition from init to idle after 3 init_cycles_link_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseAfter 3 consecutive cycles with init_cycles_ incrementing, vehicle_mode_ transitions from init to idle per REQ-SUP-006
TC-SUP-032BVAREQ-SUP-006Verify no transition from init to idle before 3 init_cycles_ (boundary test at 2 cycles)link_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseAfter 2 cycles, vehicle_mode_ remains in init (does not transition to idle) per REQ-SUP-006 (requires 3 cycles)
TC-SUP-033DecisionREQ-SUP-006Verify alive_counters_ stall detection after 1 consecutive cycle of no incrementlink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=Falsewatchdog_ok_ is set to false after 1 consecutive cycle where any alive_counters_ element fails to increment per REQ-SUP-006
TC-SUP-034StateREQ-SUP-006Verify standstill condition detection after debounce cycleslink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.05; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=False; standstill_speed_mps_=0.1REVIEW REQUIRED
TC-SUP-035BVAREQ-SUP-006Verify cycle period timing requirementlink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseREVIEW REQUIRED
TC-SUP-036BVAREQ-SUP-007Verify alive_counters_ array access at index 0 (lower boundary)link_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseModule accesses alive_counters_[0] without array bounds violation per REQ-SUP-007 (min index = 0)
TC-SUP-037BVAREQ-SUP-007Verify alive_counters_ array access at index 11 (upper boundary for 12 modules)link_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseModule accesses alive_counters_[11] without array bounds violation per REQ-SUP-007 (max index = 12-1 = 11)
TC-SUP-038EPREQ-SUP-007Verify module monitors exactly 12 modules via alive_counters_link_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseModule monitors exactly 12 modules per REQ-SUP-007 (num_monitored_modules = 12), watchdog logic evaluates all 12 counters
TC-SUP-039BVAREQ-SUP-007Verify configuration rejection when 12 exceeds max_monitored_modules_limitlink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseREVIEW REQUIRED
TC-SUP-040StateREQ-SUP-008Verify vehicle_mode_ initialization to initial statelink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseREVIEW REQUIRED
TC-SUP-041StateREQ-SUP-008Verify init state entry action executionlink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseREVIEW REQUIRED
TC-SUP-042StateREQ-SUP-008Verify previous_mode_ populated with prior cycle vehicle_mode_link_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseIn cycle N, previous_mode_ output equals vehicle_mode_ from cycle N-1 per REQ-SUP-008 (if vehicle_mode_ was idle in N-1, previous_mode_ = idle in N)
TC-SUP-043DecisionREQ-SUP-008Verify estop_.source_ = local_button classified as emergency triggerlink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=True; estop_.source_=local_button; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseModule classifies estop_.source_ = local_button as emergency trigger per REQ-SUP-008, vehicle_mode_ transitions to emergency state (highest priority per transition_priority_order)
TC-SUP-044DecisionREQ-SUP-008Verify estop_.source_ = obstacle classified as emergency triggerlink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=True; estop_.source_=obstacle; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseModule classifies estop_.source_ = obstacle as emergency trigger per REQ-SUP-008, vehicle_mode_ transitions to emergency state
TC-SUP-045DecisionREQ-SUP-008Verify estop_.source_ = remote classified as safe-stop triggerlink_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=True; estop_.source_=remote; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseModule classifies estop_.source_ = remote as safe-stop trigger per REQ-SUP-008, vehicle_mode_ transitions to safe_stop state (second priority after emergency per transition_priority_order)
TC-SUP-046StateREQ-SUP-009First-cycle execution with uninitialized watchdog snapshot prevents false faultalive_counters_=[1, 1, 1, 1, 1]; link_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=False; remote_command_.mode_autonomous_request_=Falsewatchdog_ok_ = true (no false fault triggered because have_snapshot_ = false prevents comparison on first cycle)
TC-SUP-047StateREQ-SUP-009Second-cycle execution detects stalled module after snapshot establishedalive_counters_=[2, 2, 1, 2, 2]; link_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=False; remote_command_.mode_autonomous_request_=Falsewatchdog_ok_ = false (module index 2 counter did not increment from previous snapshot, indicating stalled module)
TC-SUP-048InterfaceREQ-SUP-009Atomic read of alive_counters_ array prevents race condition on concurrent incrementalive_counters_=[10, 20, 30, 40, 50]; link_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=False; remote_command_.mode_autonomous_request_=FalseREVIEW REQUIRED
TC-SUP-049ScenarioREQ-SUP-009Execution order - supervision reads inputs after all providers have updated current cyclealive_counters_=[5, 5, 5, 5, 5]; link_status_.state_=degraded; health_=degraded; geofence_.breach_=False; geofence_.distance_to_boundary_m_=50.0; estop_.active_=False; critical_fault_active_=False; pose_.speed_mps_=2.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=3.0; remote_command_.valid_=True; remote_command_.mode_autonomous_request_=FalseREVIEW REQUIRED
TC-SUP-050BVAREQ-SUP-009Boundary - alive_counters_ array all zeros on first cycle with have_snapshot_ falsealive_counters_=[0, 0, 0, 0, 0]; link_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=False; plausible_command_.speed_mps_=0.0; remote_command_.valid_=False; remote_command_.mode_autonomous_request_=Falsewatchdog_ok_ = true (no fault on first cycle even with zero counters because have_snapshot_ = false prevents comparison per AOU-007)
TC-SUP-051BVAREQ-SUP-009Boundary - alive_counters_ array wrap-around at UINT32_MAXalive_counters_=[4294967295, 4294967295, 4294967295, 4294967295, 4294967295]; link_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=False; remote_command_.mode_autonomous_request_=FalseREVIEW REQUIRED
TC-SUP-052DecisionREQ-SUP-009Decision - alive_counters_ single element stalled while others increment normallyalive_counters_=[11, 11, 10, 11, 11]; link_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=False; remote_command_.mode_autonomous_request_=Falsewatchdog_ok_ = false (index 2 did not increment, indicating stalled module)
TC-SUP-053DecisionREQ-SUP-009Decision - alive_counters_ all elements increment normally after first cyclealive_counters_=[8, 9, 10, 11, 12]; link_status_.state_=nominal; health_=nominal; geofence_.breach_=False; geofence_.distance_to_boundary_m_=100.0; estop_.active_=False; critical_fault_active_=False; pose_.speed_mps_=0.0; plausible_command_.plausible_=True; plausible_command_.speed_mps_=0.0; remote_command_.valid_=False; remote_command_.mode_autonomous_request_=Falsewatchdog_ok_ = true (all counters incremented, no stall detected)

command 59 tests

IDMethodCoversTitleStimuliExpected (oracle)
TC-COM-001BVAREQ-COM-001Remote command speed exceeds hard plausibility limit (positive boundary)max_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=20.1; remote_command_.desired_yaw_rate_radps_=0.0; remote_command_.valid_=True; command_authentic_=Trueplausible_command_.plausible_ shall be false
TC-COM-002BVAREQ-COM-001Remote command speed at hard plausibility limit (positive boundary)max_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=20.0; remote_command_.desired_yaw_rate_radps_=0.0; remote_command_.valid_=True; command_authentic_=Trueplausible_command_.plausible_ shall not be false due to this check (may pass plausibility check)
TC-COM-003BVAREQ-COM-001Remote command speed exceeds hard plausibility limit (negative boundary)max_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=-20.1; remote_command_.desired_yaw_rate_radps_=0.0; remote_command_.valid_=True; command_authentic_=Trueplausible_command_.plausible_ shall be false
TC-COM-004BVAREQ-COM-001Remote command yaw rate exceeds hard plausibility limit (positive boundary)max_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=0.0; remote_command_.desired_yaw_rate_radps_=2.1; remote_command_.valid_=True; command_authentic_=Trueplausible_command_.plausible_ shall be false
TC-COM-005BVAREQ-COM-001Remote command yaw rate at hard plausibility limit (positive boundary)max_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=0.0; remote_command_.desired_yaw_rate_radps_=2.0; remote_command_.valid_=True; command_authentic_=Trueplausible_command_.plausible_ shall not be false due to this check
TC-COM-006BVAREQ-COM-001Remote command yaw rate exceeds hard plausibility limit (negative boundary)max_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=0.0; remote_command_.desired_yaw_rate_radps_=-2.1; remote_command_.valid_=True; command_authentic_=Trueplausible_command_.plausible_ shall be false
TC-COM-007EPREQ-COM-001Remote command speed is NaN (non-finite value rejection)max_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=NaN; remote_command_.desired_yaw_rate_radps_=0.0; remote_command_.valid_=True; command_authentic_=Trueplausible_command_.plausible_ shall be false
TC-COM-008EPREQ-COM-001Remote command speed is positive infinity (non-finite value rejection)max_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=Infinity; remote_command_.desired_yaw_rate_radps_=0.0; remote_command_.valid_=True; command_authentic_=Trueplausible_command_.plausible_ shall be false
TC-COM-009EPREQ-COM-001Remote command yaw rate is NaN (non-finite value rejection)max_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=0.0; remote_command_.desired_yaw_rate_radps_=NaN; remote_command_.valid_=True; command_authentic_=Trueplausible_command_.plausible_ shall be false
TC-COM-010EPREQ-COM-001Remote command with both speed and yaw within hard limits (nominal acceptance)max_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=8.0; remote_command_.desired_yaw_rate_radps_=0.5; remote_command_.valid_=True; command_authentic_=Trueplausible_command_.plausible_ shall not be set to false by hard limit checks (may be true subject to other checks)
TC-COM-011BVAREQ-COM-002Motion setpoint target acceleration at maximum positive limitmax_accel_mps2_=2.0; max_decel_mps2_=3.0REVIEW REQUIRED
TC-COM-012BVAREQ-COM-002Motion setpoint target acceleration at maximum negative limit (deceleration)max_accel_mps2_=2.0; max_decel_mps2_=3.0REVIEW REQUIRED
TC-COM-013EPREQ-COM-002Motion setpoint output ranges enforcement (general)max_accel_mps2_=2.0; max_decel_mps2_=3.0REVIEW REQUIRED
TC-COM-014BVAREQ-COM-003Command speed clamping at maximum forward limitmax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=12.0; remote_command_.desired_yaw_rate_radps_=0.0; remote_command_.valid_=True; command_authentic_=Trueplausible_command_.speed_mps_ shall be clamped to 10.0 m/s
TC-COM-015BVAREQ-COM-003Command speed clamping at maximum reverse limitmax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=-7.0; remote_command_.desired_yaw_rate_radps_=0.0; remote_command_.valid_=True; command_authentic_=Trueplausible_command_.speed_mps_ shall be clamped to -5.0 m/s
TC-COM-016BVAREQ-COM-003Command yaw rate clamping at positive limitmax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=0.0; remote_command_.desired_yaw_rate_radps_=1.5; remote_command_.valid_=True; command_authentic_=Trueplausible_command_.yaw_rate_radps_ shall be clamped to 1.0 rad/s
TC-COM-017BVAREQ-COM-003Command yaw rate clamping at negative limitmax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=0.0; remote_command_.desired_yaw_rate_radps_=-1.5; remote_command_.valid_=True; command_authentic_=Trueplausible_command_.yaw_rate_radps_ shall be clamped to -1.0 rad/s
TC-COM-018BVAREQ-COM-003Command speed rate limiting at maximum positive stepmax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_speed_step_mps_=1.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=7.0; remote_command_.desired_yaw_rate_radps_=0.0; remote_command_.valid_=True; command_authentic_=Trueplausible_command_.speed_mps_ shall be limited to 6.0 m/s (5.0 + 1.0)
TC-COM-019BVAREQ-COM-003Command speed rate limiting at maximum negative stepmax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_speed_step_mps_=1.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=2.0; remote_command_.desired_yaw_rate_radps_=0.0; remote_command_.valid_=True; command_authentic_=Trueplausible_command_.speed_mps_ shall be limited to 4.0 m/s (5.0 - 1.0)
TC-COM-020BVAREQ-COM-003Command yaw rate limiting at maximum positive stepmax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; max_command_yaw_step_radps_=0.2; remote_command_.desired_speed_mps_=0.0; remote_command_.desired_yaw_rate_radps_=0.5; remote_command_.valid_=True; command_authentic_=Trueplausible_command_.yaw_rate_radps_ shall be limited to 0.2 rad/s (0.0 + 0.2)
TC-COM-021BVAREQ-COM-003Command yaw rate limiting at maximum negative stepmax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; max_command_yaw_step_radps_=0.2; remote_command_.desired_speed_mps_=0.0; remote_command_.desired_yaw_rate_radps_=-0.5; remote_command_.valid_=True; command_authentic_=Trueplausible_command_.yaw_rate_radps_ shall be limited to -0.2 rad/s (0.0 - 0.2)
TC-COM-022EPREQ-COM-004Reverse motion with negative speed value within magnitude limitmax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=-3.0; remote_command_.desired_yaw_rate_radps_=0.0; remote_command_.valid_=True; command_authentic_=Trueplausible_command_.speed_mps_ shall represent reverse motion with magnitude 3.0 m/s not exceeding max_reverse_speed_mps_ (5.0 m/s)
TC-COM-023BVAREQ-COM-004Reverse motion at maximum reverse speed magnitudemax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=-5.0; remote_command_.desired_yaw_rate_radps_=0.0; remote_command_.valid_=True; command_authentic_=Trueplausible_command_.speed_mps_ shall be -5.0 m/s (at reverse limit boundary)
TC-COM-024EPREQ-COM-004Yaw rate sign convention (positive yaw)max_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=5.0; remote_command_.desired_yaw_rate_radps_=0.5; remote_command_.valid_=True; command_authentic_=TrueREVIEW REQUIRED
TC-COM-025EPREQ-COM-004Yaw rate sign convention (negative yaw)max_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=5.0; remote_command_.desired_yaw_rate_radps_=-0.5; remote_command_.valid_=True; command_authentic_=TrueREVIEW REQUIRED
TC-COM-026DecisionREQ-COM-004Target acceleration computation from speed change over cycle periodmax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0motion_setpoint_.target_accel_mps2_ shall be computed as (5.0 - 3.0) / 0.02 = 100.0 m/s²
TC-COM-027InterfaceREQ-COM-004Unit consistency for all speed values (m/s)max_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=7.5; remote_command_.desired_yaw_rate_radps_=0.3; remote_command_.valid_=True; command_authentic_=TrueAll speed values in plausible_command_, arbitrated_command_, and motion_setpoint_ outputs shall be in meters per second (m/s) with no unit conversion errors
TC-COM-028InterfaceREQ-COM-004Unit consistency for all yaw rate values (rad/s)max_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=5.0; remote_command_.desired_yaw_rate_radps_=0.8; remote_command_.valid_=True; command_authentic_=TrueAll yaw rate values in plausible_command_, arbitrated_command_, and motion_setpoint_ outputs shall be in radians per second (rad/s) with no unit conversion errors
TC-COM-029InterfaceREQ-COM-004Unit consistency for acceleration values (m/s²)max_accel_mps2_=2.0; max_decel_mps2_=3.0motion_setpoint_.target_accel_mps2_ shall be in meters per second squared (m/s²)
TC-COM-030DecisionREQ-COM-005Command authentication failure sets plausible to falsemax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=5.0; remote_command_.desired_yaw_rate_radps_=0.3; remote_command_.valid_=True; command_authentic_=Falseplausible_command_.plausible_ shall be false
TC-COM-031DecisionREQ-COM-005Invalid remote command sets plausible to falsemax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=5.0; remote_command_.desired_yaw_rate_radps_=0.3; remote_command_.valid_=False; command_authentic_=Trueplausible_command_.plausible_ shall be false
TC-COM-032DecisionREQ-COM-005Safe-stop active overrides command arbitration to safe-stop sourcemax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=5.0; remote_command_.desired_yaw_rate_radps_=0.3; remote_command_.valid_=True; command_authentic_=True; safe_stop_.active_=True; vehicle_mode_=vehicle_mode_t::autonomousarbitrated_command_.source_ shall be command_source_t::safe_stop_controller regardless of other inputs
TC-COM-033DecisionREQ-COM-005Safe-stop active forces motion setpoint to zero speedmax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; safe_stop_.active_=Truemotion_setpoint_.target_speed_mps_ shall be 0.0
TC-COM-034DecisionREQ-COM-005Safe-stop active forces motion setpoint to zero yaw ratemax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; safe_stop_.active_=Truemotion_setpoint_.target_yaw_rate_radps_ shall be 0.0
TC-COM-035DecisionREQ-COM-005Authentication failure forces motion setpoint to zero speedmax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=5.0; remote_command_.desired_yaw_rate_radps_=0.3; remote_command_.valid_=True; command_authentic_=Falsemotion_setpoint_.target_speed_mps_ shall be 0.0 under authentication fault condition
TC-COM-036DecisionREQ-COM-005Invalid command forces motion setpoint to zero yaw ratemax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=5.0; remote_command_.desired_yaw_rate_radps_=0.3; remote_command_.valid_=False; command_authentic_=Truemotion_setpoint_.target_yaw_rate_radps_ shall be 0.0 under invalid command fault condition
TC-COM-037EPREQ-COM-006Module heartbeat counter increments each cyclealive_counters_[module_id::command_arbiter] shall increment by 1 each cycle
TC-COM-038BVAREQ-COM-006Module executes with 20 ms cycle period (nominal timing)Module shall execute with cycle period of 20 milliseconds
TC-COM-039DecisionREQ-COM-006Stale remote command detection and rejectionmax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0REVIEW REQUIRED
TC-COM-040BVAREQ-COM-006Cycle timing with jitter (positive boundary)REVIEW REQUIRED
TC-COM-041BVAREQ-COM-007Heartbeat counter overflow from UINT32_MAX wraps to zeroalive_counters_[module_id::command_arbiter] shall wrap to 0 on next increment
TC-COM-042InterfaceREQ-COM-007Heartbeat counter array index bounds validitymodule_id::command_arbiter shall be a valid index within the allocated bounds of alive_counters_ array
TC-COM-043EPREQ-COM-007Heartbeat counter remains bounded by uint32_t typealive_counters_[module_id::command_arbiter] shall remain within uint32_t range [0, 4294967295]
TC-COM-044StateREQ-COM-008Arbitration priority: safe-stop has highest prioritysafe_stop_.active_=True; vehicle_mode_=vehicle_mode_t::autonomous; remote_command_.valid_=True; command_authentic_=Truearbitrated_command_.source_ shall be command_source_t::safe_stop_controller (highest priority)
TC-COM-045StateREQ-COM-008Arbitration priority: autonomous mode selected when safe-stop inactivesafe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; remote_command_.valid_=True; command_authentic_=Truearbitrated_command_.source_ shall be command_source_t::autonomous_mission (second priority)
TC-COM-046StateREQ-COM-008Arbitration priority: remote operator selected when conditions metsafe_stop_.active_=False; remote_command_.valid_=True; command_authentic_=TrueREVIEW REQUIRED
TC-COM-047StateREQ-COM-008Arbitration defaults to none when no command source activesafe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::manual; remote_command_.valid_=False; command_authentic_=Falsearbitrated_command_.source_ shall be command_source_t::none (lowest priority default)
TC-COM-048StateREQ-COM-008State transition: safe-stop activation overrides current sourcesafe_stop_.active_=True; vehicle_mode_=vehicle_mode_t::autonomousarbitrated_command_.source_ shall transition to command_source_t::safe_stop_controller immediately
TC-COM-049StateREQ-COM-008State transition: entry to autonomous mode selects autonomous sourcesafe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; remote_command_.valid_=False; command_authentic_=Falsearbitrated_command_.source_ shall transition to command_source_t::autonomous_mission
TC-COM-050ScenarioREQ-COM-009Intra-cycle execution order: plausibility before arbitrationmax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=8.0; remote_command_.desired_yaw_rate_radps_=0.5; remote_command_.valid_=True; command_authentic_=True; vehicle_mode_=vehicle_mode_t::autonomous; safe_stop_.active_=Falseplausible_command_ shall be fully written by command_plausibility before command_arbiter reads it; observable through consistent arbitration decision based on plausibility result
TC-COM-051ScenarioREQ-COM-009Intra-cycle execution order: arbitration before setpoint generationmax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=8.0; remote_command_.desired_yaw_rate_radps_=0.5; remote_command_.valid_=True; command_authentic_=True; vehicle_mode_=vehicle_mode_t::autonomous; safe_stop_.active_=Falsearbitrated_command_ shall be fully written by command_arbiter before setpoint_generator reads it; observable through motion_setpoint_ reflecting arbitrated source selection
TC-COM-052ConcurrencyREQ-COM-009Shared state protection: last_speed_mps_ not concurrently modifiedmax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_speed_step_mps_=1.0Shared state last_speed_mps_ shall not exhibit concurrent modification; rate limiting shall use consistent previous value
TC-COM-053ConcurrencyREQ-COM-009Shared state protection: last_yaw_rate_radps_ not concurrently modifiedmax_command_yaw_rate_radps_=1.0; max_command_yaw_step_radps_=0.2Shared state last_yaw_rate_radps_ shall not exhibit concurrent modification; yaw rate limiting shall use consistent previous value
TC-COM-054ConcurrencyREQ-COM-009Shared state protection: last_target_speed_mps_ not concurrently modifiedmax_accel_mps2_=2.0; max_decel_mps2_=3.0Shared state last_target_speed_mps_ shall not exhibit concurrent modification; acceleration computation shall use consistent previous target speed
TC-COM-055ScenarioREQ-COM-009Complete intra-cycle data flow from input to motion setpointmax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; max_command_speed_step_mps_=1.0; max_command_yaw_step_radps_=0.2; max_accel_mps2_=2.0; max_decel_mps2_=3.0; remote_command_.desired_speed_mps_=7.0; remote_command_.desired_yaw_rate_radps_=0.4; remote_command_.valid_=True; command_authentic_=True; vehicle_mode_=vehicle_mode_t::autonomous; safe_stop_.active_=FalseWithin single 20 ms cycle: plausible_command_ written, then arbitrated_command_ written, then motion_setpoint_ written; final motion_setpoint_ reflects complete processing chain without data corruption
TC-COM-056ScenarioREQ-COM-003Combined clamping and rate limiting interaction (speed)max_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_speed_step_mps_=1.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=12.0; remote_command_.desired_yaw_rate_radps_=0.0; remote_command_.valid_=True; command_authentic_=Trueplausible_command_.speed_mps_ shall be limited by rate limiter to 9.0 m/s (8.0 + 1.0) before clamping at 10.0 m/s can apply, resulting in 9.0 m/s output
TC-COM-057ScenarioREQ-COM-001, REQ-COM-005Multiple fault conditions: authentication fail and hard limit exceededmax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=25.0; remote_command_.desired_yaw_rate_radps_=0.0; remote_command_.valid_=True; command_authentic_=Falseplausible_command_.plausible_ shall be false (both hard limit and auth checks fail); motion_setpoint_ shall be {speed: 0.0, yaw: 0.0}
TC-COM-058ScenarioREQ-COM-005, REQ-COM-008Safe-stop activation during remote operator controlsafe_stop_.active_=True; remote_command_.desired_speed_mps_=5.0; remote_command_.desired_yaw_rate_radps_=0.3; remote_command_.valid_=True; command_authentic_=Truearbitrated_command_.source_ shall immediately transition to command_source_t::safe_stop_controller; motion_setpoint_ shall be {speed: 0.0, yaw: 0.0} regardless of remote command
TC-COM-059ScenarioREQ-COM-003, REQ-COM-004Forward-to-reverse speed transition with rate limitingmax_command_speed_mps_=10.0; max_reverse_speed_mps_=5.0; max_command_speed_step_mps_=1.0; max_command_yaw_rate_radps_=1.0; remote_command_.desired_speed_mps_=-4.0; remote_command_.desired_yaw_rate_radps_=0.0; remote_command_.valid_=True; command_authentic_=Trueplausible_command_.speed_mps_ shall be rate-limited to +2.0 m/s (3.0 - 1.0) in this cycle; reverse motion magnitude shall not exceed max_reverse_speed_mps_ after multiple cycles

actuation 56 tests

IDMethodCoversTitleStimuliExpected (oracle)
TC-ACT-001BVAREQ-ACT-001Limited acceleration input at lower boundarylimited_motion_.limited_accel_mps2_=min_accel_mps2; limited_motion_.limited_steering_rad_=0.0; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=TrueREVIEW REQUIRED
TC-ACT-002BVAREQ-ACT-001Limited acceleration input at upper boundarylimited_motion_.limited_accel_mps2_=max_accel_mps2; limited_motion_.limited_steering_rad_=0.0; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=TrueREVIEW REQUIRED
TC-ACT-003BVAREQ-ACT-001Limited steering input at minimum boundarylimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=min_steering_input_rad; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=TrueREVIEW REQUIRED
TC-ACT-004BVAREQ-ACT-001Limited steering input at maximum boundarylimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=max_steering_input_rad; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=TrueREVIEW REQUIRED
TC-ACT-005BVAREQ-ACT-001Safe-stop target deceleration at minimum boundarylimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=0.0; estop_.active_=False; safe_stop_.active_=True; safe_stop_.target_decel_mps2_=min_safe_stop_decel_mps2; vehicle_mode_=vehicle_mode_t::safe_stop; power_ok_=TrueREVIEW REQUIRED
TC-ACT-006BVAREQ-ACT-001Safe-stop target deceleration at maximum boundarylimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=0.0; estop_.active_=False; safe_stop_.active_=True; safe_stop_.target_decel_mps2_=max_safe_stop_decel_mps2; vehicle_mode_=vehicle_mode_t::safe_stop; power_ok_=TrueREVIEW REQUIRED
TC-ACT-007BVAREQ-ACT-002Drive torque output at minimum boundarylimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=0.0; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=Trueactuator_command_.drive_torque_nm_ shall equal 0.0
TC-ACT-008BVAREQ-ACT-002Drive torque output at maximum boundarylimited_motion_.limited_accel_mps2_=max_accel_for_max_torque; limited_motion_.limited_steering_rad_=0.0; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=TrueREVIEW REQUIRED
TC-ACT-009BVAREQ-ACT-002Brake force output at minimum boundarylimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=0.0; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=Trueactuator_command_.brake_force_n_ shall equal 0.0
TC-ACT-010BVAREQ-ACT-002Brake force output at maximum boundarylimited_motion_.limited_accel_mps2_=max_decel_for_max_brake; limited_motion_.limited_steering_rad_=0.0; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=TrueREVIEW REQUIRED
TC-ACT-011BVAREQ-ACT-002, REQ-ACT-003Steering angle output at negative maximum boundarylimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=-2.0; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=True; max_steering_rad_=0.7854actuator_command_.steering_angle_rad_ shall equal -0.7854 (clamped to -max_steering_rad_)
TC-ACT-012BVAREQ-ACT-002, REQ-ACT-003Steering angle output at positive maximum boundarylimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=2.0; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=True; max_steering_rad_=0.7854actuator_command_.steering_angle_rad_ shall equal 0.7854 (clamped to max_steering_rad_)
TC-ACT-013BVAREQ-ACT-003Brake force saturation at limitlimited_motion_.limited_accel_mps2_=-50.0; limited_motion_.limited_steering_rad_=0.0; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=TrueREVIEW REQUIRED
TC-ACT-014EPREQ-ACT-003Holding brake force when actuators disabledlimited_motion_.limited_accel_mps2_=2.0; limited_motion_.limited_steering_rad_=0.5; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::fault; power_ok_=Trueactuator_command_.brake_force_n_ shall equal 700.0 and actuator_command_.actuators_enabled_ shall equal false
TC-ACT-015EPREQ-ACT-004Acceleration to torque conversion formulalimited_motion_.limited_accel_mps2_=2.0; limited_motion_.limited_steering_rad_=0.0; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=Trueactuator_command_.drive_torque_nm_ shall equal 1050.0 (calculated as 2.0 × 350.0 × 0.15 × 10.0)
TC-ACT-016EPREQ-ACT-004Deceleration to brake force conversion formulalimited_motion_.limited_accel_mps2_=-3.0; limited_motion_.limited_steering_rad_=0.0; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=Trueactuator_command_.brake_force_n_ shall equal 1050.0 (calculated as 3.0 × 350.0) and actuator_command_.drive_torque_nm_ shall equal 0.0
TC-ACT-017EPREQ-ACT-004Positive steering direction interpretationlimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=0.3; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=TrueREVIEW REQUIRED
TC-ACT-018EPREQ-ACT-004Zero acceleration boundary between drive and brakelimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=0.0; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=Trueactuator_command_.drive_torque_nm_ shall equal 0.0 and actuator_command_.brake_force_n_ shall equal 0.0
TC-ACT-019DecisionREQ-ACT-005Actuator disable on fault modelimited_motion_.limited_accel_mps2_=2.0; limited_motion_.limited_steering_rad_=0.2; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::fault; power_ok_=Trueactuator_command_.actuators_enabled_ shall equal false and actuator_command_.drive_torque_nm_ shall equal 0.0 and actuator_command_.brake_force_n_ shall equal 700.0 (holding brake per REQ-ACT-003)
TC-ACT-020DecisionREQ-ACT-005Actuator disable on init modelimited_motion_.limited_accel_mps2_=1.0; limited_motion_.limited_steering_rad_=0.1; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::init; power_ok_=Trueactuator_command_.actuators_enabled_ shall equal false and actuator_command_.drive_torque_nm_ shall equal 0.0 and actuator_command_.brake_force_n_ shall equal 700.0 (holding brake per REQ-ACT-003)
TC-ACT-021DecisionREQ-ACT-005Actuator disable on power losslimited_motion_.limited_accel_mps2_=1.5; limited_motion_.limited_steering_rad_=0.15; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=Falseactuator_command_.actuators_enabled_ shall equal false and actuator_command_.drive_torque_nm_ shall equal 0.0 and actuator_command_.brake_force_n_ shall equal 700.0 (holding brake per REQ-ACT-003)
TC-ACT-022DecisionREQ-ACT-005Emergency stop override with emergency decelerationlimited_motion_.limited_accel_mps2_=2.0; limited_motion_.limited_steering_rad_=0.3; estop_.active_=True; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::emergency; power_ok_=TrueREVIEW REQUIRED
TC-ACT-023DecisionREQ-ACT-005Safe-stop deceleration applicationlimited_motion_.limited_accel_mps2_=1.0; limited_motion_.limited_steering_rad_=0.2; estop_.active_=False; safe_stop_.active_=True; safe_stop_.target_decel_mps2_=2.5; vehicle_mode_=vehicle_mode_t::safe_stop; power_ok_=Trueactuator_command_.brake_force_n_ shall equal 875.0 (calculated as 2.5 × 350.0 per REQ-ACT-004) and actuator_command_.drive_torque_nm_ shall equal 0.0
TC-ACT-024DecisionREQ-ACT-005E-stop priority over safe-stoplimited_motion_.limited_accel_mps2_=1.0; limited_motion_.limited_steering_rad_=0.2; estop_.active_=True; safe_stop_.active_=True; safe_stop_.target_decel_mps2_=2.0; vehicle_mode_=vehicle_mode_t::emergency; power_ok_=TrueREVIEW REQUIRED
TC-ACT-025EPREQ-ACT-005Drive torque zeroed when actuators disabledlimited_motion_.limited_accel_mps2_=3.0; limited_motion_.limited_steering_rad_=0.0; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::fault; power_ok_=Trueactuator_command_.drive_torque_nm_ shall equal 0.0
TC-ACT-026EPREQ-ACT-006Alive counter increment on successful cyclelimited_motion_.limited_accel_mps2_=1.0; limited_motion_.limited_steering_rad_=0.1; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=TrueREVIEW REQUIRED
TC-ACT-027EPREQ-ACT-006Cycle time compliancelimited_motion_.limited_accel_mps2_=0.5; limited_motion_.limited_steering_rad_=0.05; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=TrueModule execution cycle shall complete within 20 ms
TC-ACT-028InterfaceREQ-ACT-007Alive counter array index boundslimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=0.0; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=TrueREVIEW REQUIRED
TC-ACT-029StateREQ-ACT-008Actuators enabled in init mode with powerlimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=0.0; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::init; power_ok_=Trueactuator_command_.actuators_enabled_ shall equal true
TC-ACT-030StateREQ-ACT-008Actuators enabled in idle mode with powerlimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=0.0; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::idle; power_ok_=Trueactuator_command_.actuators_enabled_ shall equal true
TC-ACT-031StateREQ-ACT-008Actuators enabled in remote mode with powerlimited_motion_.limited_accel_mps2_=1.0; limited_motion_.limited_steering_rad_=0.2; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::remote; power_ok_=Trueactuator_command_.actuators_enabled_ shall equal true
TC-ACT-032StateREQ-ACT-008Actuators enabled in autonomous mode with powerlimited_motion_.limited_accel_mps2_=1.5; limited_motion_.limited_steering_rad_=0.25; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=Trueactuator_command_.actuators_enabled_ shall equal true
TC-ACT-033StateREQ-ACT-008Actuators enabled in safe_stop mode with powerlimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=0.1; estop_.active_=False; safe_stop_.active_=True; safe_stop_.target_decel_mps2_=2.0; vehicle_mode_=vehicle_mode_t::safe_stop; power_ok_=Trueactuator_command_.actuators_enabled_ shall equal true
TC-ACT-034StateREQ-ACT-008Actuators enabled in emergency mode with powerlimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=0.0; estop_.active_=True; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::emergency; power_ok_=Trueactuator_command_.actuators_enabled_ shall equal true
TC-ACT-035StateREQ-ACT-008Actuators enabled in fault mode with power (conflict case)limited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=0.0; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::fault; power_ok_=TrueREVIEW REQUIRED - REQUIREMENTS CONFLICT
TC-ACT-036StateREQ-ACT-008Actuators disabled in undefined modelimited_motion_.limited_accel_mps2_=1.0; limited_motion_.limited_steering_rad_=0.1; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::undefined; power_ok_=Trueactuator_command_.actuators_enabled_ shall equal false
TC-ACT-037StateREQ-ACT-008Steering hold during safe-stop transitionlimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=0.3; estop_.active_=False; safe_stop_.active_=True; safe_stop_.target_decel_mps2_=2.5; vehicle_mode_=vehicle_mode_t::safe_stop; power_ok_=Trueactuator_command_.steering_angle_rad_ shall equal last valid value before safe-stop activation (0.3 rad assumed)
TC-ACT-038StateREQ-ACT-008Steering hold during E-stop transitionlimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=0.25; estop_.active_=True; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::emergency; power_ok_=Trueactuator_command_.steering_angle_rad_ shall equal last valid value before E-stop activation (0.25 rad assumed)
TC-ACT-039DecisionREQ-ACT-008Drive torque zeroed when E-stop activelimited_motion_.limited_accel_mps2_=2.0; limited_motion_.limited_steering_rad_=0.1; estop_.active_=True; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::emergency; power_ok_=Trueactuator_command_.drive_torque_nm_ shall equal 0.0
TC-ACT-040DecisionREQ-ACT-008Drive torque zeroed when safe-stop activelimited_motion_.limited_accel_mps2_=1.5; limited_motion_.limited_steering_rad_=0.1; estop_.active_=False; safe_stop_.active_=True; safe_stop_.target_decel_mps2_=2.0; vehicle_mode_=vehicle_mode_t::safe_stop; power_ok_=Trueactuator_command_.drive_torque_nm_ shall equal 0.0
TC-ACT-041DecisionREQ-ACT-008Drive torque zeroed when actuators disabledlimited_motion_.limited_accel_mps2_=2.5; limited_motion_.limited_steering_rad_=0.2; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::fault; power_ok_=Trueactuator_command_.drive_torque_nm_ shall equal 0.0
TC-ACT-042InterfaceREQ-ACT-009Input signal coherence snapshotlimited_motion_.limited_accel_mps2_=1.0; limited_motion_.limited_steering_rad_=0.15; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=TrueREVIEW REQUIRED
TC-ACT-043InterfaceREQ-ACT-009Output signal atomic writelimited_motion_.limited_accel_mps2_=1.5; limited_motion_.limited_steering_rad_=0.2; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=TrueREVIEW REQUIRED
TC-ACT-044InterfaceREQ-ACT-009Execution sequence before actuator interfacelimited_motion_.limited_accel_mps2_=1.0; limited_motion_.limited_steering_rad_=0.1; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=TrueModule execution shall complete before actuator_interface run() is invoked per fixed sequence AOU-002
TC-ACT-045BVAREQ-ACT-002, REQ-ACT-003Steering angle within range passes throughlimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=0.5; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=True; max_steering_rad_=0.7854actuator_command_.steering_angle_rad_ shall equal 0.5 (input passes through unclamped)
TC-ACT-046BVAREQ-ACT-003Steering clamp exactly at negative limitlimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=-0.7854; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=True; max_steering_rad_=0.7854actuator_command_.steering_angle_rad_ shall equal -0.7854 (at limit, no clamping)
TC-ACT-047BVAREQ-ACT-003Steering clamp exactly at positive limitlimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=0.7854; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=True; max_steering_rad_=0.7854actuator_command_.steering_angle_rad_ shall equal 0.7854 (at limit, no clamping)
TC-ACT-048BVAREQ-ACT-004Torque conversion at small positive accelerationlimited_motion_.limited_accel_mps2_=0.1; limited_motion_.limited_steering_rad_=0.0; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=Trueactuator_command_.drive_torque_nm_ shall equal 52.5 (calculated as 0.1 × 350.0 × 0.15 × 10.0)
TC-ACT-049BVAREQ-ACT-004Brake force conversion at small decelerationlimited_motion_.limited_accel_mps2_=-0.1; limited_motion_.limited_steering_rad_=0.0; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=Trueactuator_command_.brake_force_n_ shall equal 35.0 (calculated as 0.1 × 350.0) and actuator_command_.drive_torque_nm_ shall equal 0.0
TC-ACT-050ScenarioREQ-ACT-005Normal driving to E-stop transitionlimited_motion_.limited_accel_mps2_=2.0; limited_motion_.limited_steering_rad_=0.3; estop_.active_=True; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::emergency; power_ok_=TrueREVIEW REQUIRED
TC-ACT-051ScenarioREQ-ACT-005Normal driving to safe-stop transitionlimited_motion_.limited_accel_mps2_=1.5; limited_motion_.limited_steering_rad_=0.2; estop_.active_=False; safe_stop_.active_=True; safe_stop_.target_decel_mps2_=3.0; vehicle_mode_=vehicle_mode_t::safe_stop; power_ok_=Trueactuator_command_.brake_force_n_ shall equal 1050.0 (calculated as 3.0 × 350.0), actuator_command_.drive_torque_nm_ shall equal 0.0, actuator_command_.steering_angle_rad_ shall equal last valid value (0.2 assumed)
TC-ACT-052ScenarioREQ-ACT-005, REQ-ACT-008Safe-stop escalation to E-stoplimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=0.15; estop_.active_=True; safe_stop_.active_=True; safe_stop_.target_decel_mps2_=2.0; vehicle_mode_=vehicle_mode_t::emergency; power_ok_=TrueREVIEW REQUIRED
TC-ACT-053ScenarioREQ-ACT-005Power loss during normal operationlimited_motion_.limited_accel_mps2_=1.0; limited_motion_.limited_steering_rad_=0.1; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::autonomous; power_ok_=Falseactuator_command_.actuators_enabled_ shall equal false, actuator_command_.drive_torque_nm_ shall equal 0.0, actuator_command_.brake_force_n_ shall equal 700.0 (holding brake per REQ-ACT-003)
TC-ACT-054ScenarioREQ-ACT-005Fault detection during normal operationlimited_motion_.limited_accel_mps2_=1.5; limited_motion_.limited_steering_rad_=0.2; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::fault; power_ok_=Trueactuator_command_.actuators_enabled_ shall equal false, actuator_command_.drive_torque_nm_ shall equal 0.0, actuator_command_.brake_force_n_ shall equal 700.0 (holding brake per REQ-ACT-003)
TC-ACT-055ScenarioREQ-ACT-008System initialization to operational transitionlimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=0.0; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::init; power_ok_=TrueREVIEW REQUIRED - REQUIREMENTS CONFLICT
TC-ACT-056EPREQ-ACT-003Holding brake force application on disablelimited_motion_.limited_accel_mps2_=0.0; limited_motion_.limited_steering_rad_=0.0; estop_.active_=False; safe_stop_.active_=False; vehicle_mode_=vehicle_mode_t::fault; power_ok_=Trueactuator_command_.brake_force_n_ shall equal 700.0 (holding brake) regardless of brake_force_request_n_ value

localization 76 tests

IDMethodCoversTitleStimuliExpected (oracle)
TC-LOC-001BVAREQ-LOC-001tick_ms_ minimum boundary value acceptancetick_ms_=0REVIEW REQUIRED
TC-LOC-002BVAREQ-LOC-001tick_ms_ maximum boundary value acceptancetick_ms_=18446744073709551615REVIEW REQUIRED
TC-LOC-003BVAREQ-LOC-001Wheel encoder ticks minimum boundarytick_ms_=1000REVIEW REQUIRED
TC-LOC-004BVAREQ-LOC-001IMU yaw rate minimum boundarytick_ms_=1000REVIEW REQUIRED
TC-LOC-005BVAREQ-LOC-001Odometry speed minimum boundarytick_ms_=1000REVIEW REQUIRED
TC-LOC-006BVAREQ-LOC-002Pose heading at lower boundary (-π)tick_ms_=5000pose_.heading is in range [-3.14159, +3.14159] and approximately equal to -3.14159 radians
TC-LOC-007BVAREQ-LOC-002Pose heading at upper boundary (+π)tick_ms_=5000pose_.heading is in range [-3.14159, +3.14159] and approximately equal to +3.14159 radians
TC-LOC-008BVAREQ-LOC-002Pose speed at lower boundary (0.0)tick_ms_=2000pose_.speed is in range [0.0, max_pose_speed] and equal to 0.0 m/s
TC-LOC-009BVAREQ-LOC-002Pose speed at upper boundarytick_ms_=3000REVIEW REQUIRED
TC-LOC-010BVAREQ-LOC-002Pose confidence at lower boundary (0.0)tick_ms_=4000pose_.confidence is in range [0.0, 1.0] and equal to 0.0
TC-LOC-011BVAREQ-LOC-002Pose confidence at upper boundary (1.0)tick_ms_=1000pose_.confidence is in range [0.0, 1.0] and equal to 1.0
TC-LOC-012BVAREQ-LOC-002Pose x position boundary (unresolved)tick_ms_=2000REVIEW REQUIRED
TC-LOC-013BVAREQ-LOC-002Pose y position boundary (unresolved)tick_ms_=2000REVIEW REQUIRED
TC-LOC-014BVAREQ-LOC-003Clamping of pose confidence to lower bound (0.0)tick_ms_=3000pose_.confidence is clamped to 0.0 (not negative)
TC-LOC-015BVAREQ-LOC-003Clamping of pose confidence to upper bound (1.0)tick_ms_=3000pose_.confidence is clamped to 1.0 (not exceeding)
TC-LOC-016BVAREQ-LOC-003Clamping of pose x to minimum (unresolved)tick_ms_=5000REVIEW REQUIRED
TC-LOC-017BVAREQ-LOC-003Clamping of pose x to maximum (unresolved)tick_ms_=5000REVIEW REQUIRED
TC-LOC-018BVAREQ-LOC-003Clamping of pose y to minimum (unresolved)tick_ms_=5000REVIEW REQUIRED
TC-LOC-019BVAREQ-LOC-003Clamping of pose y to maximum (unresolved)tick_ms_=5000REVIEW REQUIRED
TC-LOC-020InterfaceREQ-LOC-004Wheel ticks to meters conversion with calibration parametertick_ms_=1000; wheel_ticks_per_meter=1000.0odometry_ accumulated distance correctly reflects conversion using wheel_ticks_per_meter (e.g., 1000 ticks = 1.0 meter)
TC-LOC-021InterfaceREQ-LOC-004Heading expressed in radians with counterclockwise positivetick_ms_=2000pose_.heading is expressed in radians and increases (counterclockwise) when positive yaw rate is integrated
TC-LOC-022InterfaceREQ-LOC-004IMU yaw rate expressed in radians/secondtick_ms_=1000imu_.yaw_rate is expressed in radians/second and integrated into heading over time delta dt
TC-LOC-023InterfaceREQ-LOC-004Positions (x, y) expressed in meterstick_ms_=3000pose_.x and pose_.y are expressed in meters, derived from encoder ticks via wheel_ticks_per_meter conversion
TC-LOC-024InterfaceREQ-LOC-004Timing calculations use millisecondstick_ms_=2500Time delta dt is calculated as (2500 - previous_tick_ms) / 1000.0 seconds, confirming millisecond input unit
TC-LOC-025DecisionREQ-LOC-005IMU marked invalid when age exceeds staleness timeouttick_ms_=1600; imu_stale_timeout_ms=500imu_.valid is false because (1600 - 1000) = 600 ms exceeds imu_stale_timeout_ms (500 ms)
TC-LOC-026DecisionREQ-LOC-005Odometry marked invalid when no fresh sensor data injectedtick_ms_=1000odometry_.valid is false because !injected_ (no fresh sensor data injected)
TC-LOC-027DecisionREQ-LOC-005Pose confidence reduced by 0.5 for one invalid sensortick_ms_=2000pose_.confidence is reduced by 0.5 (from 1.0 to 0.5) when one sensor is invalid
TC-LOC-028DecisionREQ-LOC-005Pose confidence reduced by 1.0 for two invalid sensorstick_ms_=2000pose_.confidence is reduced by 1.0 (from 1.0 to 0.0) when both sensors are invalid
TC-LOC-029DecisionREQ-LOC-005Pose marked invalid when confidence falls below thresholdtick_ms_=3000; pose_min_confidence=0.6pose_.valid is false when pose_.confidence < 0.6 (pose_min_confidence)
TC-LOC-030DecisionREQ-LOC-005Fallback integration uses zero substitution for invalid sensortick_ms_=2000Pose integration proceeds using zero substitution for invalid sensor data (e.g., yaw_rate=0 or distance=0)
TC-LOC-031InterfaceREQ-LOC-006Time delta calculation using tick_ms_ formulatick_ms_=2500Time delta dt is calculated as (2500 - 1000) / 1000.0 = 1.5 seconds
TC-LOC-032DecisionREQ-LOC-006IMU staleness detection at threshold boundarytick_ms_=1500; imu_stale_timeout_ms=500REVIEW REQUIRED
TC-LOC-033DecisionREQ-LOC-006IMU staleness detection just below thresholdtick_ms_=1499; imu_stale_timeout_ms=500REVIEW REQUIRED
TC-LOC-034DecisionREQ-LOC-006IMU staleness detection just above thresholdtick_ms_=1501; imu_stale_timeout_ms=500REVIEW REQUIRED
TC-LOC-035InterfaceREQ-LOC-006Nominal cycle time assumption for integrationtick_ms_=1000REVIEW REQUIRED
TC-LOC-036DecisionREQ-LOC-006Non-monotonic tick_ms_ handling (backward time)tick_ms_=1000REVIEW REQUIRED
TC-LOC-037DecisionREQ-LOC-006Non-monotonic tick_ms_ handling (no time advance)tick_ms_=1000REVIEW REQUIRED
TC-LOC-038StateREQ-LOC-006Sensor validity debouncing over multiple cyclestick_ms_=1000REVIEW REQUIRED
TC-LOC-039InterfaceREQ-LOC-007Alive counter index within bounds (module_id::localization)tick_ms_=1000REVIEW REQUIRED
TC-LOC-040BVAREQ-LOC-007Alive counter at maximum value (UINT64_MAX)tick_ms_=1000alive_counters_[module_id::localization] increments to UINT64_MAX (18446744073709551615)
TC-LOC-041BVAREQ-LOC-007Alive counter overflow to 0tick_ms_=1000alive_counters_[module_id::localization] wraps to 0 on next increment
TC-LOC-042BVAREQ-LOC-007Alive counter increment from 0tick_ms_=1000alive_counters_[module_id::localization] increments to 1 after first cycle
TC-LOC-043StateREQ-LOC-008Pose initialization to (0.0, 0.0, 0.0) at startuptick_ms_=0pose_.x = 0.0, pose_.y = 0.0, pose_.heading = 0.0 at initialization
TC-LOC-044StateREQ-LOC-008Initial pose confidence at startuptick_ms_=0REVIEW REQUIRED
TC-LOC-045StateREQ-LOC-008State transition after first valid sensor datatick_ms_=1000REVIEW REQUIRED
TC-LOC-046BVAREQ-LOC-008Heading wrapping from +π to -π boundarytick_ms_=2000pose_.heading wraps from +π (+3.14159) to negative values near -π (-3.14159) using iterative while-loop normalization
TC-LOC-047BVAREQ-LOC-008Heading wrapping from -π to +π boundarytick_ms_=2000pose_.heading wraps from -π (-3.14159) to positive values near +π (+3.14159) using iterative while-loop normalization
TC-LOC-048BVAREQ-LOC-008Heading wrapping with multiple rotations (+3π)tick_ms_=5000pose_.heading is normalized to range [-π, +π] using iterative while-loop (e.g., +3π wraps to +π via subtraction of 2π)
TC-LOC-049StateREQ-LOC-008Accumulated state reset under specified conditiontick_ms_=3000REVIEW REQUIRED
TC-LOC-050InterfaceREQ-LOC-009inject_ticks() called before run() enforcementtick_ms_=1000Module applies flag check with safe default: odometry_.valid = false due to !injected_ flag
TC-LOC-051InterfaceREQ-LOC-009inject_imu() called before run() enforcementtick_ms_=1000Module applies flag check with safe default: imu_.valid = false due to staleness or missing injection
TC-LOC-052InterfaceREQ-LOC-009tick_ms_ read at run() entry from bustick_ms_=2000Module uses tick_ms_ value (2000) present at run() entry for time delta calculation
TC-LOC-053InterfaceREQ-LOC-009Atomic pose_ update (single write struct assignment)tick_ms_=1500pose_ output reflects consistent snapshot (all fields from same integration step), no partial updates observable
TC-LOC-054InterfaceREQ-LOC-009Concurrent access to alive_counters_ synchronizationtick_ms_=1000REVIEW REQUIRED
TC-LOC-055ScenarioREQ-LOC-005, REQ-LOC-006Complete sensor fault recovery scenariotick_ms_=5000; imu_stale_timeout_ms=500imu_.valid transitions false when stale, pose_.confidence degrades by 0.5, then imu_.valid recovers true, pose_.confidence restores (mechanism unclear)
TC-LOC-056ScenarioREQ-LOC-004, REQ-LOC-008Heading integration and wrapping scenariotick_ms_=10000pose_.heading wraps from 0 → +π → -π → 0 using iterative normalization, completing 2π rotation in radians
TC-LOC-057ScenarioREQ-LOC-003, REQ-LOC-005Confidence degradation and clamping scenariotick_ms_=3000pose_.confidence degrades by 0.5 per invalid sensor (1.0 → 0.5 → 0.0), clamped to [0.0, 1.0], pose_.valid becomes false when below pose_min_confidence
TC-LOC-058ScenarioREQ-LOC-004, REQ-LOC-006Position integration with known displacementtick_ms_=2000; wheel_ticks_per_meter=1000.0pose_.x increases by 10.0 meters (from ticks via wheel_ticks_per_meter conversion), pose_.y remains ~0.0, using dt from tick_ms_ delta
TC-LOC-059ScenarioREQ-LOC-007, REQ-LOC-009Alive counter increment across multiple cyclestick_ms_=100000alive_counters_[module_id::localization] increments to 100, confirming heartbeat per cycle execution
TC-LOC-060DecisionREQ-LOC-001Out-of-range tick_ms_ rejection (below minimum)tick_ms_=0REVIEW REQUIRED
TC-LOC-061DecisionREQ-LOC-002Pose heading at exactly -π boundarytick_ms_=3000pose_.heading is exactly -3.14159 radians, within valid range [-π, +π]
TC-LOC-062DecisionREQ-LOC-002Pose heading at exactly +π boundarytick_ms_=3000pose_.heading is exactly +3.14159 radians, within valid range [-π, +π]
TC-LOC-063DecisionREQ-LOC-005Fallback integration with only odometry validtick_ms_=2500; imu_stale_timeout_ms=500Pose integration proceeds with odometry displacement, heading integration uses zero substitution for yaw_rate (no heading change)
TC-LOC-064DecisionREQ-LOC-005Fallback integration with only IMU validtick_ms_=2500Pose integration proceeds with IMU yaw rate for heading, position integration uses zero substitution for displacement (no position change)
TC-LOC-065DecisionREQ-LOC-005Fallback integration with both sensors invalidtick_ms_=3000Pose integration proceeds with zero substitution for both (no position or heading change), confidence degraded by 1.0, pose_.valid likely false
TC-LOC-066BVAREQ-LOC-006Time delta with zero tick_ms_ advancetick_ms_=1000REVIEW REQUIRED
TC-LOC-067BVAREQ-LOC-006Time delta with very large tick_ms_ advancetick_ms_=100000Time delta dt calculated as (100000 - 1000) / 1000.0 = 99.0 seconds, integration proceeds (no dt clamping specified)
TC-LOC-068StateREQ-LOC-008Heading normalization with small excess beyond +πtick_ms_=2000pose_.heading normalized to approximately -3.08 radians (3.2 - 2π) within [-π, +π] using iterative while-loop
TC-LOC-069StateREQ-LOC-008Heading normalization with small excess below -πtick_ms_=2000pose_.heading normalized to approximately +3.08 radians (-3.2 + 2π) within [-π, +π] using iterative while-loop
TC-LOC-070EPREQ-LOC-003Pose confidence within valid range (no clamping)tick_ms_=2000pose_.confidence remains 0.7 (no clamping applied), within valid range [0.0, 1.0]
TC-LOC-071InterfaceREQ-LOC-004Negative yaw rate integration (clockwise rotation)tick_ms_=2000pose_.heading decreases (clockwise rotation) when negative yaw rate integrated, consistent with counterclockwise positive convention
TC-LOC-072InterfaceREQ-LOC-004Zero yaw rate integration (no heading change)tick_ms_=3000pose_.heading remains approximately 1.0 radians (no change) when yaw_rate=0 integrated
TC-LOC-073DecisionREQ-LOC-005IMU validity flag persistence after staleness recoverytick_ms_=2500; imu_stale_timeout_ms=500imu_.valid transitions from false to true after fresh IMU injection, indicating staleness recovery
TC-LOC-074DecisionREQ-LOC-005Odometry validity flag persistence after injection recoverytick_ms_=2000odometry_.valid transitions from false to true after inject_ticks() called with valid data
TC-LOC-075BVAREQ-LOC-006IMU staleness at exact timeout boundarytick_ms_=1500; imu_stale_timeout_ms=500REVIEW REQUIRED
TC-LOC-076InterfaceREQ-LOC-007Alive counter increment monotonicitytick_ms_=10000alive_counters_[module_id::localization] increments monotonically by 1 each cycle (e.g., 0→1→2→...→10)

motion_control 56 tests

IDMethodCoversTitleStimuliExpected (oracle)
TC-MOT-001BVAREQ-MOT-001Target speed setpoint at lower boundary (negative max reverse)motion_setpoint_.target_speed_mps_=-max_reverse_speed_mps_; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=0.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalModule processes input without error; limited_motion_.limited_speed_mps_ <= -max_reverse_speed_mps_ (clamped to reverse envelope)
TC-MOT-002BVAREQ-MOT-001Target speed setpoint at upper boundary (max forward)motion_setpoint_.target_speed_mps_=max_speed_mps_; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=0.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalModule processes input without error; limited_motion_.limited_speed_mps_ <= max_speed_mps_ (clamped to forward envelope)
TC-MOT-003BVAREQ-MOT-001Target yaw rate at negative boundarymotion_setpoint_.target_speed_mps_=5.0; motion_setpoint_.target_yaw_rate_radps_=-max_command_yaw_rate_radps_; pose_.speed_mps_=5.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalModule processes input without error; limited_motion_.limited_yaw_rate_radps_ is within [-max_command_yaw_rate_radps_, max_command_yaw_rate_radps_]
TC-MOT-004BVAREQ-MOT-001Target yaw rate at positive boundarymotion_setpoint_.target_speed_mps_=5.0; motion_setpoint_.target_yaw_rate_radps_=max_command_yaw_rate_radps_; pose_.speed_mps_=5.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalModule processes input without error; limited_motion_.limited_yaw_rate_radps_ is within [-max_command_yaw_rate_radps_, max_command_yaw_rate_radps_]
TC-MOT-005BVAREQ-MOT-001Pose speed input at unresolved minimum boundarymotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=UNRESOLVED_min_pose_speed_mps; imu_.yaw_rate_radps_=0.0; degradation_level_=normalREVIEW REQUIRED
TC-MOT-006BVAREQ-MOT-001Pose speed input at unresolved maximum boundarymotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=UNRESOLVED_max_pose_speed_mps; imu_.yaw_rate_radps_=0.0; degradation_level_=normalREVIEW REQUIRED
TC-MOT-007BVAREQ-MOT-001IMU yaw rate input at unresolved minimum boundarymotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=UNRESOLVED_min_imu_yaw_rate_radps; degradation_level_=normalREVIEW REQUIRED
TC-MOT-008BVAREQ-MOT-001IMU yaw rate input at unresolved maximum boundarymotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=UNRESOLVED_max_imu_yaw_rate_radps; degradation_level_=normalREVIEW REQUIRED
TC-MOT-009BVAREQ-MOT-002Speed control output at maximum acceleration boundarymotion_setpoint_.target_speed_mps_=30.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=0.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalspeed_control_output_mps2_ <= max_accel_mps2_ (saturated at upper bound)
TC-MOT-010BVAREQ-MOT-002Speed control output at maximum deceleration boundarymotion_setpoint_.target_speed_mps_=0.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=30.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalspeed_control_output_mps2_ >= -max_decel_mps2_ (saturated at lower bound)
TC-MOT-011BVAREQ-MOT-002Steering control output at positive steering limitmotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=1.5; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalsteering_control_output_rad_ <= max_steering_rad_ (saturated at upper bound)
TC-MOT-012BVAREQ-MOT-002Steering control output at negative steering limitmotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=-1.5; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalsteering_control_output_rad_ >= -max_steering_rad_ (saturated at lower bound)
TC-MOT-013BVAREQ-MOT-002Limited acceleration output at maximum boundarymotion_setpoint_.target_speed_mps_=30.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=0.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normallimited_motion_.limited_accel_mps2_ <= max_accel_mps2_
TC-MOT-014BVAREQ-MOT-002Limited acceleration output at minimum boundarymotion_setpoint_.target_speed_mps_=0.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=30.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normallimited_motion_.limited_accel_mps2_ >= -max_decel_mps2_
TC-MOT-015BVAREQ-MOT-002Limited steering output at positive limitmotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=1.5; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normallimited_motion_.limited_steering_rad_ <= max_steering_rad_
TC-MOT-016BVAREQ-MOT-002Limited steering output at negative limitmotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=-1.5; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normallimited_motion_.limited_steering_rad_ >= -max_steering_rad_
TC-MOT-017DecisionREQ-MOT-003Speed PID anti-windup at positive saturationmotion_setpoint_.target_speed_mps_=30.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=5.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalspeed_control_output_mps2_ = max_accel_mps2_; speed PID integral term does not continue accumulating beyond saturation (anti-windup active)
TC-MOT-018DecisionREQ-MOT-003Speed PID anti-windup at negative saturationmotion_setpoint_.target_speed_mps_=0.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=25.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalspeed_control_output_mps2_ = -max_decel_mps2_; speed PID integral term does not continue accumulating beyond saturation (anti-windup active)
TC-MOT-019DecisionREQ-MOT-003Steering PID anti-windup at positive saturationmotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=2.0; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalsteering_control_output_rad_ = max_steering_rad_; steering PID integral term does not continue accumulating beyond saturation (anti-windup active)
TC-MOT-020DecisionREQ-MOT-003Steering PID anti-windup at negative saturationmotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=-2.0; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalsteering_control_output_rad_ = -max_steering_rad_; steering PID integral term does not continue accumulating beyond saturation (anti-windup active)
TC-MOT-021ScenarioREQ-MOT-003, REQ-MOT-006Jerk rate limiting on large acceleration step commandmotion_setpoint_.target_speed_mps_=30.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=0.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalChange in limited_motion_.limited_accel_mps2_ from previous cycle to current cycle <= (max_jerk_mps3_ * 0.02) m/s²
TC-MOT-022EPREQ-MOT-004Positive target speed interpreted as forward motionmotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=0.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normallimited_motion_.limited_speed_mps_ >= 0.0 and speed_control_output_mps2_ >= 0.0 (positive acceleration for forward motion command)
TC-MOT-023EPREQ-MOT-004Negative target speed interpreted as reverse motionmotion_setpoint_.target_speed_mps_=-5.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=0.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normallimited_motion_.limited_speed_mps_ <= 0.0 and speed_control_output_mps2_ <= 0.0 (negative acceleration for reverse motion command)
TC-MOT-024EPREQ-MOT-004Positive yaw rate sign convention (direction unresolved)motion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=0.5; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalREVIEW REQUIRED
TC-MOT-025EPREQ-MOT-004Negative yaw rate sign convention (direction unresolved)motion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=-0.5; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalREVIEW REQUIRED
TC-MOT-026EPREQ-MOT-004Positive steering angle sign convention (direction unresolved)motion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=0.5; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalREVIEW REQUIRED
TC-MOT-027EPREQ-MOT-004Negative steering angle sign convention (direction unresolved)motion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=-0.5; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalREVIEW REQUIRED
TC-MOT-028EPREQ-MOT-004Positive acceleration output for forward acceleration commandmotion_setpoint_.target_speed_mps_=15.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=5.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalspeed_control_output_mps2_ > 0.0 and limited_motion_.limited_accel_mps2_ > 0.0 (positive values for forward acceleration in m/s²)
TC-MOT-029StateREQ-MOT-005Speed reduction when degradation_level_ = reduced_speedmotion_setpoint_.target_speed_mps_=20.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=reduced_speedlimited_motion_.limited_speed_mps_ <= reduced_max_speed_mps_ (speed envelope reduced per degradation state)
TC-MOT-030StateREQ-MOT-005Speed set to zero when degradation_level_ = safe_stop_onlymotion_setpoint_.target_speed_mps_=20.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=safe_stop_onlylimited_motion_.limited_speed_mps_ = 0.0 (vehicle commanded to stop per degradation state)
TC-MOT-031StateREQ-MOT-005Speed set to zero when degradation_level_ = disabledmotion_setpoint_.target_speed_mps_=20.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=disabledlimited_motion_.limited_speed_mps_ = 0.0 (vehicle commanded to stop per degradation state)
TC-MOT-032StateREQ-MOT-005Degradation-dependent acceleration envelope (unresolved formula)motion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=5.0; imu_.yaw_rate_radps_=0.0; degradation_level_=reduced_speedREVIEW REQUIRED
TC-MOT-033DecisionREQ-MOT-005Failsafe actuator commands on invalid input (unresolved condition)motion_setpoint_.target_speed_mps_=UNRESOLVED_INVALID_VALUE; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalREVIEW REQUIRED
TC-MOT-034EPREQ-MOT-006Cycle period consistency verificationmotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalModule executes with period = 20 ms; PID controllers use dt = 0.02 s for derivative and integral term calculations
TC-MOT-035StateREQ-MOT-006PID derivative term zero on first cycle after initializationmotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=0.2; pose_.speed_mps_=5.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalspeed_control_output_mps2_ and steering_control_output_rad_ computed with derivative term = 0.0 (no derivative kick on initialization)
TC-MOT-036EPREQ-MOT-006Alive counter increment per cyclemotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalalive_counters_[module_id::motion] increments by 1 per cycle (health signal active)
TC-MOT-037BVAREQ-MOT-006Jerk rate limit applied per cycle using 0.02s time stepmotion_setpoint_.target_speed_mps_=25.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=0.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalChange in limited_motion_.limited_accel_mps2_ per cycle <= (max_jerk_mps3_ * 0.02) m/s²
TC-MOT-038BVAREQ-MOT-007Speed PID integral term bounded at unresolved minimummotion_setpoint_.target_speed_mps_=0.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=20.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalREVIEW REQUIRED
TC-MOT-039BVAREQ-MOT-007Speed PID integral term bounded at unresolved maximummotion_setpoint_.target_speed_mps_=25.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=0.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalREVIEW REQUIRED
TC-MOT-040BVAREQ-MOT-007Steering PID integral term bounded at unresolved minimummotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=-1.0; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.5; degradation_level_=normalREVIEW REQUIRED
TC-MOT-041BVAREQ-MOT-007Steering PID integral term bounded at unresolved maximummotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=1.0; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=-0.5; degradation_level_=normalREVIEW REQUIRED
TC-MOT-042BVAREQ-MOT-007Alive counter wraps at unresolved modulo boundarymotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalREVIEW REQUIRED
TC-MOT-043StateREQ-MOT-008Speed PID integral and derivative initialized to 0.0 on first executionmotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=0.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalspeed_control_output_mps2_ computed with integral = 0.0 and derivative = 0.0 (initial PID state)
TC-MOT-044StateREQ-MOT-008Speed PID state preserved across degradation transition from normal to reduced_speedmotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=8.0; imu_.yaw_rate_radps_=0.0; degradation_level_=reduced_speedSpeed PID integral and derivative states preserved (not reset) across degradation transition per preserve policy
TC-MOT-045StateREQ-MOT-008Steering PID integral and derivative initialized to 0.0 on first executionmotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=0.5; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalsteering_control_output_rad_ computed with integral = 0.0 and derivative = 0.0 (initial PID state)
TC-MOT-046StateREQ-MOT-008has_prev_ flag set to false until first cycle completesmotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=5.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalOn first cycle, has_prev_ = false (derivative terms = 0.0); on subsequent cycles has_prev_ = true (derivative terms computed normally)
TC-MOT-047InterfaceREQ-MOT-009Speed controller executes before trajectory limiter within cyclemotion_setpoint_.target_speed_mps_=15.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalREVIEW REQUIRED
TC-MOT-048InterfaceREQ-MOT-009Steering controller executes before trajectory limiter within cyclemotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=0.5; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalREVIEW REQUIRED
TC-MOT-049InterfaceREQ-MOT-009Trajectory limiter reads controller outputs after both controllers writemotion_setpoint_.target_speed_mps_=15.0; motion_setpoint_.target_yaw_rate_radps_=0.5; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalREVIEW REQUIRED
TC-MOT-050InterfaceREQ-MOT-009All limited_motion_ fields updated atomically per single-writer policymotion_setpoint_.target_speed_mps_=15.0; motion_setpoint_.target_yaw_rate_radps_=0.5; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalAll fields of limited_motion_ (limited_speed_mps_, limited_accel_mps2_, limited_yaw_rate_radps_, limited_steering_rad_) are consistent snapshot from single cycle execution (no partial updates visible to external consumers)
TC-MOT-051EPREQ-MOT-009Alive counter incremented exactly once per cycle by trajectory_limitermotion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalalive_counters_[module_id::motion] increments by exactly 1 per cycle (no double-increment, no missed increment)
TC-MOT-052ScenarioREQ-MOT-002, REQ-MOT-003Multi-stage saturation: speed PID saturated, then jerk limitedmotion_setpoint_.target_speed_mps_=30.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=0.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalspeed_control_output_mps2_ clamped to max_accel_mps2_; limited_motion_.limited_accel_mps2_ further rate-limited by jerk constraint (max_jerk_mps3_ * 0.02 per cycle)
TC-MOT-053BVAREQ-MOT-001, REQ-MOT-002Negative boundary test: target speed below -max_reverse_speed_mps_motion_setpoint_.target_speed_mps_=-max_reverse_speed_mps_ - 1.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=0.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalModule either rejects input or clamps limited_motion_.limited_speed_mps_ to >= -max_reverse_speed_mps_ (input domain protection)
TC-MOT-054BVAREQ-MOT-001, REQ-MOT-002Negative boundary test: target speed above max_speed_mps_motion_setpoint_.target_speed_mps_=max_speed_mps_ + 1.0; motion_setpoint_.target_yaw_rate_radps_=0.0; pose_.speed_mps_=0.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalModule either rejects input or clamps limited_motion_.limited_speed_mps_ to <= max_speed_mps_ (input domain protection)
TC-MOT-055BVAREQ-MOT-001, REQ-MOT-002Negative boundary test: target yaw rate below -max_command_yaw_rate_radps_motion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=-max_command_yaw_rate_radps_ - 0.1; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalModule either rejects input or clamps limited_motion_.limited_yaw_rate_radps_ to >= -max_command_yaw_rate_radps_ (input domain protection)
TC-MOT-056BVAREQ-MOT-001, REQ-MOT-002Negative boundary test: target yaw rate above max_command_yaw_rate_radps_motion_setpoint_.target_speed_mps_=10.0; motion_setpoint_.target_yaw_rate_radps_=max_command_yaw_rate_radps_ + 0.1; pose_.speed_mps_=10.0; imu_.yaw_rate_radps_=0.0; degradation_level_=normalModule either rejects input or clamps limited_motion_.limited_yaw_rate_radps_ to <= max_command_yaw_rate_radps_ (input domain protection)

perception 70 tests

IDMethodCoversTitleStimuliExpected (oracle)
TC-PER-001BVAREQ-PER-001Ego speed minimum boundary acceptancepose_.speed_mps_=REVIEW REQUIRED: min_ego_speed_mps; tick_ms_=1000REVIEW REQUIRED
TC-PER-002BVAREQ-PER-001Ego speed maximum boundary acceptancepose_.speed_mps_=REVIEW REQUIRED: max_ego_speed_mps; tick_ms_=1000REVIEW REQUIRED
TC-PER-003BVAREQ-PER-001Ego speed below minimum boundary rejectionpose_.speed_mps_=REVIEW REQUIRED: min_ego_speed_mps - 0.1; tick_ms_=1000REVIEW REQUIRED
TC-PER-004BVAREQ-PER-001Ego speed above maximum boundary rejectionpose_.speed_mps_=REVIEW REQUIRED: max_ego_speed_mps + 0.1; tick_ms_=1000REVIEW REQUIRED
TC-PER-005BVAREQ-PER-001Monotonically increasing timestamp normal operationpose_.speed_mps_=20.0; tick_ms_=1050Module accepts tick_ms_ = 1050. alive_counters_[module_id::perception] increments. No fault status asserted.
TC-PER-006BVAREQ-PER-001Timestamp backwards within permissible deltapose_.speed_mps_=20.0; tick_ms_=REVIEW REQUIRED: 1000 - max_tick_backwards_msREVIEW REQUIRED
TC-PER-007BVAREQ-PER-001Timestamp backwards exceeding permissible deltapose_.speed_mps_=20.0; tick_ms_=REVIEW REQUIRED: 1000 - (max_tick_backwards_ms + 1)REVIEW REQUIRED
TC-PER-008BVAREQ-PER-002Collision TTC at minimum boundary (zero)pose_.speed_mps_=30.0; tick_ms_=1000collision_.time_to_collision_s >= 0.0 (no negative TTC values produced)
TC-PER-009BVAREQ-PER-002Collision TTC at maximum boundary (large sentinel)pose_.speed_mps_=20.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-010BVAREQ-PER-002Collision nearest range at minimum boundary (zero)pose_.speed_mps_=5.0; tick_ms_=1000collision_.nearest_range_m >= 0.0 (no negative range values produced)
TC-PER-011BVAREQ-PER-002Collision nearest range at maximum boundary (large sentinel)pose_.speed_mps_=20.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-012BVAREQ-PER-002Obstacle range at minimum boundary (exclusive zero)pose_.speed_mps_=15.0; tick_ms_=1000All obstacle range values in obstacles_ vector satisfy range > 0.0 (strictly positive, zero excluded)
TC-PER-013BVAREQ-PER-002Obstacle range at maximum boundarypose_.speed_mps_=25.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-014BVAREQ-PER-002Obstacle bearing at minimum boundarypose_.speed_mps_=20.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-015BVAREQ-PER-002Obstacle bearing at maximum boundarypose_.speed_mps_=20.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-016BVAREQ-PER-003TTC clamping at maximum thresholdpose_.speed_mps_=10.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-017BVAREQ-PER-003TTC exceeds clamping thresholdpose_.speed_mps_=5.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-018BVAREQ-PER-003Obstacle relative speed at minimum clamping boundarypose_.speed_mps_=30.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-019BVAREQ-PER-003Obstacle relative speed at maximum clamping boundarypose_.speed_mps_=30.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-020BVAREQ-PER-003Relative speed below minimum clamppose_.speed_mps_=25.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-021BVAREQ-PER-003Relative speed above maximum clamppose_.speed_mps_=5.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-022EPREQ-PER-004Bearing angle sign convention verificationpose_.speed_mps_=20.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-023EPREQ-PER-004Positive relative speed indicates receding obstaclepose_.speed_mps_=20.0; tick_ms_=1000Obstacle in obstacles_ vector has relative_speed > 0 (positive, indicating opening/receding per REQ-PER-004)
TC-PER-024EPREQ-PER-004Negative relative speed indicates approaching obstaclepose_.speed_mps_=20.0; tick_ms_=1000Obstacle in obstacles_ vector has relative_speed < 0 (negative, indicating closing/approaching per REQ-PER-004)
TC-PER-025DecisionREQ-PER-004TTC computation formula with closing scenariopose_.speed_mps_=30.0; tick_ms_=1000collision_.time_to_collision_s = 50 / (30 - (-10)) = 50 / 40 = 1.25 seconds (using formula ttc = range / (ego_speed - relative_speed) per REQ-PER-004)
TC-PER-026DecisionREQ-PER-004TTC computation formula with opening scenariopose_.speed_mps_=20.0; tick_ms_=1000collision_.time_to_collision_s = large sentinel (no collision, closing_speed = 20 - 5 = 15, obstacle opening so TTC not computed or set to max per clamping)
TC-PER-027EPREQ-PER-004Range values maintained in meterspose_.speed_mps_=25.0; tick_ms_=1000All range fields (collision_.nearest_range_m, obstacle.range_m in obstacles_) are in meters (SI unit consistency per REQ-PER-004)
TC-PER-028EPREQ-PER-004Speed values maintained in meters-per-secondpose_.speed_mps_=30.0; tick_ms_=1000All speed fields (pose_.speed_mps_, obstacle.relative_speed_mps in obstacles_) are in meters-per-second (SI unit consistency per REQ-PER-004)
TC-PER-029DecisionREQ-PER-005LiDAR status transitions to stale on timeoutpose_.speed_mps_=20.0; tick_ms_=REVIEW REQUIRED: last_scan_time + lidar_stale_timeout_ms_ + 1REVIEW REQUIRED
TC-PER-030DecisionREQ-PER-005LiDAR status set to stale when timeout exceededpose_.speed_mps_=20.0; tick_ms_=5000lidar_status_ == sensor_status_t::stale
TC-PER-031DecisionREQ-PER-005LiDAR status set to failed on sensor failurepose_.speed_mps_=20.0; tick_ms_=1000lidar_status_ == sensor_status_t::failed
TC-PER-032DecisionREQ-PER-005Collision imminent flag on sensor faultpose_.speed_mps_=25.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-033DecisionREQ-PER-005Obstacles vector handling on sensor faultpose_.speed_mps_=20.0; tick_ms_=10000REVIEW REQUIRED
TC-PER-034DecisionREQ-PER-006LiDAR staleness detection at timeout thresholdpose_.speed_mps_=20.0; tick_ms_=REVIEW REQUIRED: last_scan_time + lidar_stale_timeout_ms_REVIEW REQUIRED
TC-PER-035StateREQ-PER-006Obstacle confirmation after required cyclespose_.speed_mps_=20.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-036StateREQ-PER-006Obstacle deletion after missed detectionspose_.speed_mps_=20.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-037EPREQ-PER-006Alive counter increments by one each cyclepose_.speed_mps_=20.0; tick_ms_=1000After run() completes, alive_counters_[module_id::perception] = N + 1 (increment by 1 per REQ-PER-006)
TC-PER-038EPREQ-PER-006Alive counter increments at cycle period ratepose_.speed_mps_=20.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-039BVAREQ-PER-007Obstacles vector at maximum capacitypose_.speed_mps_=20.0; tick_ms_=1000obstacles_.size() <= 32 (at or below maximum per REQ-PER-007)
TC-PER-040BVAREQ-PER-007New obstacle rejected at capacity limitpose_.speed_mps_=20.0; tick_ms_=1000obstacles_.size() == 32 (new obstacle rejected, count does not exceed 32 per REQ-PER-007 reject_new policy)
TC-PER-041BVAREQ-PER-007LiDAR scan vector at maximum capacitypose_.speed_mps_=20.0; tick_ms_=1000lidar_scan_.size() <= 360 (at or below maximum per REQ-PER-007)
TC-PER-042BVAREQ-PER-007LiDAR scan overflow handlingpose_.speed_mps_=20.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-043StateREQ-PER-008Obstacle track transitions from unconfirmed to confirmedpose_.speed_mps_=20.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-044StateREQ-PER-008Only confirmed obstacles included in collision predictionpose_.speed_mps_=20.0; tick_ms_=1000collision_.nearest_range_m and collision_.nearest_bearing_rad correspond to obstacle with confirmed_ == true only (unconfirmed obstacles excluded per REQ-PER-008)
TC-PER-045StateREQ-PER-008LiDAR status transitions from ok to stalepose_.speed_mps_=20.0; tick_ms_=REVIEW REQUIRED: last_scan_time + lidar_stale_timeout_ms_ + 1REVIEW REQUIRED
TC-PER-046StateREQ-PER-008LiDAR status transitions from stale to ok on fresh scanpose_.speed_mps_=20.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-047ScenarioREQ-PER-009inject_scan precedes run in cycle execution orderpose_.speed_mps_=20.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-048InterfaceREQ-PER-009LiDAR scan not modified during run cyclepose_.speed_mps_=20.0; tick_ms_=1000lidar_scan_ vector contents remain stable from cluster_scan entry to obstacles_ publication (no concurrent modification per REQ-PER-009)
TC-PER-049InterfaceREQ-PER-009Output fields updated atomically at run cycle endpose_.speed_mps_=20.0; tick_ms_=1000obstacles_, collision_, lidar_status_, alive_counters_[module_id::perception] all updated atomically at end_of_run (no partial/torn updates observable per REQ-PER-009)
TC-PER-050InterfaceREQ-PER-009Reentrant call to run() handlingpose_.speed_mps_=20.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-051InterfaceREQ-PER-009Reentrant call to inject_scan() handlingpose_.speed_mps_=20.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-052ScenarioREQ-PER-001, REQ-PER-006Normal operation with valid inputs over multiple cyclespose_.speed_mps_=25.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-053ScenarioREQ-PER-005, REQ-PER-006, REQ-PER-008Sensor fault recovery scenariopose_.speed_mps_=20.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-054DecisionREQ-PER-002, REQ-PER-004Collision imminent flag set when TTC below thresholdpose_.speed_mps_=30.0; tick_ms_=1000; collision_stop_ttc_s_=2.0collision_.imminent == true when collision_.time_to_collision_s < collision_stop_ttc_s_ (2.0 seconds)
TC-PER-055DecisionREQ-PER-002, REQ-PER-004Collision imminent flag set when range below minimum thresholdpose_.speed_mps_=10.0; tick_ms_=1000; collision_min_range_m_=5.0collision_.imminent == true when collision_.nearest_range_m < collision_min_range_m_ (5.0 meters), regardless of TTC
TC-PER-056StateREQ-PER-006, REQ-PER-008Obstacle confirmation debouncing prevents spurious trackspose_.speed_mps_=20.0; tick_ms_=1000; obstacle_confirmation_cycles_=3REVIEW REQUIRED
TC-PER-057StateREQ-PER-006, REQ-PER-008Obstacle track deletion after sustained non-detectionpose_.speed_mps_=20.0; tick_ms_=1000; obstacle_deletion_cycles_=5REVIEW REQUIRED
TC-PER-058DecisionREQ-PER-005, REQ-PER-006LiDAR staleness detection boundary at timeout thresholdpose_.speed_mps_=20.0; tick_ms_=2100; lidar_stale_timeout_ms_=100lidar_status_ == sensor_status_t::stale when (tick_ms_ - last_scan_time) > lidar_stale_timeout_ms_ (100 ms). At exact boundary (== 100 ms), status should remain ok (exceeds means >).
TC-PER-059BVAREQ-PER-007Obstacles vector size exactly at maximum (32 obstacles)pose_.speed_mps_=20.0; tick_ms_=1000obstacles_.size() == 32 (at maximum capacity per REQ-PER-007, valid operational state)
TC-PER-060BVAREQ-PER-007LiDAR scan size exactly at maximum (360 points)pose_.speed_mps_=20.0; tick_ms_=1000lidar_scan_.size() == 360 (at maximum capacity per REQ-PER-007, valid operational state)
TC-PER-061DecisionREQ-PER-004TTC computation with zero closing speed (parallel motion)pose_.speed_mps_=20.0; tick_ms_=1000collision_.time_to_collision_s set to large sentinel or clamped maximum (closing_speed = 0, division-by-zero case, TTC infinite)
TC-PER-062DecisionREQ-PER-004TTC computation with negative closing speed (receding obstacle)pose_.speed_mps_=20.0; tick_ms_=1000collision_.time_to_collision_s set to large sentinel or clamped maximum (closing_speed < 0, no collision, TTC not meaningful for receding obstacle)
TC-PER-063DecisionREQ-PER-002, REQ-PER-008Collision nearest obstacle selection among multiple confirmed obstaclespose_.speed_mps_=25.0; tick_ms_=1000collision_.nearest_range_m and collision_.nearest_bearing_rad correspond to the confirmed obstacle with minimum range (nearest obstacle per REQ-PER-002 and confirmed-only per REQ-PER-008)
TC-PER-064DecisionREQ-PER-005, REQ-PER-008Collision prediction when sensor status is not okpose_.speed_mps_=20.0; tick_ms_=1000REVIEW REQUIRED
TC-PER-065EPREQ-PER-001, REQ-PER-006Nominal ego speed in mid-rangepose_.speed_mps_=20.0; tick_ms_=1000Module accepts pose_.speed_mps_ = 20.0 mps. Outputs (obstacles_, collision_, lidar_status_, alive_counters_) are produced without error. Alive counter increments by 1.
TC-PER-066EPREQ-PER-001, REQ-PER-006Zero ego speed (stationary vehicle)pose_.speed_mps_=0.0; tick_ms_=1000Module accepts pose_.speed_mps_ = 0.0 mps (stationary ego). TTC computation uses ego_speed = 0 in closing_speed formula. Outputs produced without error.
TC-PER-067EPREQ-PER-006Alive counter wraps at maximum uint32_t valuepose_.speed_mps_=20.0; tick_ms_=1000After run() completes, alive_counters_[module_id::perception] wraps to 0 (UINT32_MAX + 1 = 0 for uint32_t, natural overflow per C/C++ unsigned arithmetic)
TC-PER-068InterfaceREQ-PER-002, REQ-PER-007Empty obstacles vector when no obstacles detectedpose_.speed_mps_=20.0; tick_ms_=1000obstacles_.size() == 0 (empty vector, valid state per REQ-PER-007 min is 0). collision_ outputs set to sentinel values (no nearest obstacle).
TC-PER-069EPREQ-PER-002Obstacle range exactly zero (edge case, should not occur)pose_.speed_mps_=20.0; tick_ms_=1000Obstacle with range 0.0 is rejected or filtered (range must be > 0.0 per REQ-PER-002). Obstacle does not appear in obstacles_ vector.
TC-PER-070EPREQ-PER-003Relative speed exactly zero (obstacle stationary relative to ground)pose_.speed_mps_=20.0; tick_ms_=1000Obstacle relative_speed near -20.0 mps (stationary obstacle appears to approach at ego speed, relative_speed = obstacle_speed - ego_speed = 0 - 20 = -20). No clamping if within bounds.

power_management 66 tests

IDMethodCoversTitleStimuliExpected (oracle)
TC-PWR-001BVAREQ-PWR-001Valid voltage measurement at minimum physical boundarynominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5REVIEW REQUIRED - minimum physical voltage boundary not specified
TC-PWR-002BVAREQ-PWR-001Valid voltage measurement at maximum physical boundarynominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5REVIEW REQUIRED - maximum physical voltage boundary not specified
TC-PWR-003BVAREQ-PWR-001Invalid voltage measurement below minimum physical rangenominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5REVIEW REQUIRED - invalid sensor data handling not specified
TC-PWR-004BVAREQ-PWR-001Invalid voltage measurement above maximum physical rangenominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5REVIEW REQUIRED - invalid sensor data handling not specified
TC-PWR-005BVAREQ-PWR-002Main power voltage output at minimum boundarynominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5REVIEW REQUIRED - output_min_voltage_v not specified
TC-PWR-006BVAREQ-PWR-002Main power voltage output at maximum boundarynominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5REVIEW REQUIRED - output_max_voltage_v not specified
TC-PWR-007BVAREQ-PWR-002Backup power voltage output at minimum boundarynominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5REVIEW REQUIRED - output_min_voltage_v not specified
TC-PWR-008BVAREQ-PWR-002Backup power voltage output at maximum boundarynominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5REVIEW REQUIRED - output_max_voltage_v not specified
TC-PWR-009EPREQ-PWR-002Boolean flag states are strictly true or falsenominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5All boolean flags (power_main_.undervoltage, power_main_.overvoltage, power_main_.health, power_backup_.undervoltage, power_backup_.overvoltage, power_backup_.health, power_ok_, backup_power_active_) shall have values of exactly true or false with no intermediate states
TC-PWR-010BVAREQ-PWR-003Voltage clamping at minimum physical limitnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5REVIEW REQUIRED - clamp_min_v not specified
TC-PWR-011BVAREQ-PWR-003Voltage clamping at maximum physical limitnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5REVIEW REQUIRED - clamp_max_v not specified
TC-PWR-012EPREQ-PWR-004Voltage units and polarity convention - nominal referencenominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5REVIEW REQUIRED - nominal_voltage_v reference point not specified
TC-PWR-013EPREQ-PWR-004Voltage positive polarity conventionnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5Voltage values in power_main_.voltage and power_backup_.voltage shall represent higher electrical potential as positive numerical values in units of volts
TC-PWR-014BVAREQ-PWR-005Undervoltage detection at exact thresholdnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5power_main_.undervoltage shall be true when power_main_.voltage equals cal_.min_voltage_v_ (9.0V)
TC-PWR-015BVAREQ-PWR-005Undervoltage detection below thresholdnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5power_main_.undervoltage shall be true when power_main_.voltage < cal_.min_voltage_v_ (e.g., 8.5V)
TC-PWR-016BVAREQ-PWR-005Undervoltage detection just above thresholdnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5power_main_.undervoltage shall be false when power_main_.voltage > cal_.min_voltage_v_ (e.g., 9.1V)
TC-PWR-017BVAREQ-PWR-005Overvoltage detection at exact thresholdnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5power_main_.overvoltage shall be true when power_main_.voltage equals cal_.max_voltage_v_ (16.0V)
TC-PWR-018BVAREQ-PWR-005Overvoltage detection above thresholdnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5power_main_.overvoltage shall be true when power_main_.voltage > cal_.max_voltage_v_ (e.g., 16.5V)
TC-PWR-019BVAREQ-PWR-005Overvoltage detection just below thresholdnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5power_main_.overvoltage shall be false when power_main_.voltage < cal_.max_voltage_v_ (e.g., 15.9V)
TC-PWR-020DecisionREQ-PWR-005Rail health failed when undervoltage fault activenominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5power_main_.health shall be false when power_main_.undervoltage is true
TC-PWR-021DecisionREQ-PWR-005Rail health failed when overvoltage fault activenominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5power_main_.health shall be false when power_main_.overvoltage is true
TC-PWR-022DecisionREQ-PWR-005Rail health normal when no faults activenominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5power_main_.health shall be true when both power_main_.undervoltage and power_main_.overvoltage are false (voltage in range 9.0V to 16.0V)
TC-PWR-023DecisionREQ-PWR-005Backup power activation when main rail health falsenominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5backup_power_active_ shall be true when power_main_.health is false AND power_backup_.health is true
TC-PWR-024BVAREQ-PWR-005Backup power activation at exact switchover voltagenominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5backup_power_active_ shall be true when power_main_.voltage equals cal_.backup_switch_voltage_v_ (10.5V) AND power_backup_.health is true
TC-PWR-025BVAREQ-PWR-005Backup power activation below switchover voltagenominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5backup_power_active_ shall be true when power_main_.voltage < cal_.backup_switch_voltage_v_ (e.g., 10.0V) AND power_backup_.health is true
TC-PWR-026DecisionREQ-PWR-005Backup power not activated when backup rail unhealthynominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5backup_power_active_ shall be false when power_main_.voltage < cal_.backup_switch_voltage_v_ BUT power_backup_.health is false
TC-PWR-027DecisionREQ-PWR-005Backup power not activated when main voltage above switchover and healthynominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5backup_power_active_ shall be false when power_main_.voltage > cal_.backup_switch_voltage_v_ (e.g., 12.0V) AND power_main_.health is true
TC-PWR-028DecisionREQ-PWR-006Voltage measurement used when injected in current cyclenominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5REVIEW REQUIRED - injection mechanism and current-cycle detection not observable
TC-PWR-029DecisionREQ-PWR-006Voltage fallback to nominal when measurement stalenominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5power_main_.voltage and power_backup_.voltage shall equal cal_.nominal_voltage_v_ (12.0V) when inject_voltage() was not called in current cycle
TC-PWR-030EPREQ-PWR-006Heartbeat counter increment each cyclenominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5alive_counters_[module_id::power] shall increment by 1 each execution cycle
TC-PWR-031InterfaceREQ-PWR-006Execution ordering before power_distributionnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5REVIEW REQUIRED - task sequence position not specified
TC-PWR-032InterfaceREQ-PWR-006Task cycle period timingnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5REVIEW REQUIRED - cycle_period_ms not specified
TC-PWR-033BVAREQ-PWR-007Heartbeat counter overflow wrapping to zeronominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5REVIEW REQUIRED - counter_max_value not specified
TC-PWR-034BVAREQ-PWR-007Heartbeat counter at maximum minus onenominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5REVIEW REQUIRED - counter_max_value not specified
TC-PWR-035EPREQ-PWR-007Heartbeat counter no overflow errornominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5REVIEW REQUIRED - overflow detection mechanism not specified
TC-PWR-036StateREQ-PWR-008Backup power state transition: inactive to active on main health failurenominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5backup_power_active_ shall transition from false to true when power_main_.health becomes false AND power_backup_.health is true
TC-PWR-037StateREQ-PWR-008Backup power state transition: inactive to active on main voltage dropnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5backup_power_active_ shall transition from false to true when power_main_.voltage drops below cal_.backup_switch_voltage_v_ (10.5V) AND power_backup_.health is true
TC-PWR-038StateREQ-PWR-008Backup power state transition: active to inactive on main recoverynominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5backup_power_active_ shall transition from true to false when bus.power_main_.ok_ == true AND bus.power_main_.voltage_v_ >= cal_.backup_switch_voltage_v_ (10.5V)
TC-PWR-039StateREQ-PWR-008Backup power state remains inactive when main healthy above thresholdnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5backup_power_active_ shall remain false when power_main_.health is true AND power_main_.voltage >= cal_.backup_switch_voltage_v_ (e.g., 12.0V)
TC-PWR-040StateREQ-PWR-008Backup power state remains active when main unhealthynominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5backup_power_active_ shall remain true when power_main_.health is false (even if voltage recovers but health flag not cleared)
TC-PWR-041BVAREQ-PWR-008Backup deactivation at exact switchover thresholdnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5backup_power_active_ shall transition to false when bus.power_main_.ok_ == true AND bus.power_main_.voltage_v_ equals cal_.backup_switch_voltage_v_ (10.5V)
TC-PWR-042StateREQ-PWR-008Backup power state transition with OR condition (health OR voltage)nominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5backup_power_active_ shall transition to true when power_main_.health is false (regardless of voltage above switchover threshold) AND power_backup_.health is true
TC-PWR-043StateREQ-PWR-008Backup power not activated when backup unhealthy despite main failurenominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5backup_power_active_ shall remain false when power_main_.health is false BUT power_backup_.health is false (both rails unhealthy)
TC-PWR-044InterfaceREQ-PWR-009Atomic output updates before run() returnnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5All outputs (power_main_, power_backup_, power_ok_, backup_power_active_) shall be updated atomically before run() returns
TC-PWR-045InterfaceREQ-PWR-009Execution ordering before power_distribution reads outputsnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5REVIEW REQUIRED - task_sequence_position not specified
TC-PWR-046InterfaceREQ-PWR-009Injected voltage measurement single-buffered last-write-winsnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5Module shall use the latest (last) injected voltage value when multiple inject_voltage() calls occur within the same execution cycle
TC-PWR-047DecisionREQ-PWR-005power_ok flag true when main rail healthynominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5power_ok_ shall be true when power_main_.health is true (regardless of backup state)
TC-PWR-048DecisionREQ-PWR-005power_ok flag true when backup rail healthy (main unhealthy)nominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5power_ok_ shall be true when power_backup_.health is true (even when power_main_.health is false)
TC-PWR-049DecisionREQ-PWR-005power_ok flag false when both rails unhealthynominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5power_ok_ shall be false when both power_main_.health and power_backup_.health are false
TC-PWR-050ScenarioREQ-PWR-005Main power degradation with successful backup switchovernominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5When main voltage degrades from 12V → 10.4V (below switchover 10.5V) with backup healthy: (1) backup_power_active_ transitions true, (2) power_ok_ remains true, (3) power_main_.undervoltage remains false (above 9V min), (4) power_main_.health remains true
TC-PWR-051ScenarioREQ-PWR-005Main power critical failure with backup activationnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5When main voltage drops from 12V → 8V (below min 9V): (1) power_main_.undervoltage=true, (2) power_main_.health=false, (3) backup_power_active_=true (backup healthy), (4) power_ok_=true (backup healthy)
TC-PWR-052ScenarioREQ-PWR-005Main power recovery with backup deactivationnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5When main voltage recovers from 8V → 11V (above switchover 10.5V): (1) power_main_.undervoltage=false, (2) power_main_.health=true, (3) backup_power_active_ transitions false (main ok and voltage adequate), (4) power_ok_=true
TC-PWR-053ScenarioREQ-PWR-005Both rails fail - total power lossnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5When both main and backup voltages drop below min (9V): (1) power_main_.health=false, (2) power_backup_.health=false, (3) backup_power_active_=false (backup unhealthy), (4) power_ok_=false (neither rail healthy)
TC-PWR-054ScenarioREQ-PWR-005Main overvoltage with backup switchovernominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5When main voltage surges from 12V → 17V (above max 16V): (1) power_main_.overvoltage=true, (2) power_main_.health=false, (3) backup_power_active_=true (main unhealthy, backup healthy), (4) power_ok_=true
TC-PWR-055BVAREQ-PWR-005Backup rail undervoltage detectionnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5power_backup_.undervoltage shall be true when power_backup_.voltage < cal_.min_voltage_v_ (e.g., 8.5V), power_backup_.health shall be false
TC-PWR-056BVAREQ-PWR-005Backup rail overvoltage detectionnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5power_backup_.overvoltage shall be true when power_backup_.voltage > cal_.max_voltage_v_ (e.g., 16.5V), power_backup_.health shall be false
TC-PWR-057DecisionREQ-PWR-005Backup activation not triggered when main voltage at switchover but backup unhealthynominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5backup_power_active_ shall be false when power_main_.voltage at cal_.backup_switch_voltage_v_ (10.5V) BUT power_backup_.health is false
TC-PWR-058EPREQ-PWR-006Heartbeat counter initial valuenominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5alive_counters_[module_id::power] shall have defined initial value (0 or 1) at system startup
TC-PWR-059DecisionREQ-PWR-006Voltage fallback on first cycle without injectionnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5power_main_.voltage and power_backup_.voltage shall equal cal_.nominal_voltage_v_ (12.0V) on first cycle before inject_voltage() is called
TC-PWR-060EPREQ-PWR-004Calibration parameter units validationnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5All calibration parameters (nominal_voltage_v_, min_voltage_v_, max_voltage_v_, backup_switch_voltage_v_) shall be interpreted in units of volts
TC-PWR-061DecisionREQ-PWR-005Simultaneous undervoltage and overvoltage faults impossiblenominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5power_main_.undervoltage and power_main_.overvoltage shall never both be true simultaneously (mutually exclusive conditions given min < max)
TC-PWR-062BVAREQ-PWR-005Voltage in valid range - no faultsnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5When power_main_.voltage in range [cal_.min_voltage_v_, cal_.max_voltage_v_] (e.g., 12.0V): power_main_.undervoltage=false, power_main_.overvoltage=false, power_main_.health=true
TC-PWR-063BVAREQ-PWR-005Main voltage exactly at min threshold plus epsilonnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5power_main_.undervoltage shall be false when power_main_.voltage is marginally above cal_.min_voltage_v_ (e.g., 9.01V)
TC-PWR-064BVAREQ-PWR-005Main voltage exactly at max threshold minus epsilonnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=10.5power_main_.overvoltage shall be false when power_main_.voltage is marginally below cal_.max_voltage_v_ (e.g., 15.99V)
TC-PWR-065BVAREQ-PWR-008Backup switchover voltage exactly at min thresholdnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=9.0System shall handle backup_switch_voltage_v_ equal to min_voltage_v_ (9.0V) - switchover and undervoltage occur simultaneously
TC-PWR-066DecisionREQ-PWR-008Backup switchover voltage must be above min threshold - invalid calibrationnominal_voltage_v_=12.0; min_voltage_v_=9.0; max_voltage_v_=16.0; backup_switch_voltage_v_=8.0REVIEW REQUIRED - behavior with invalid calibration not specified

cyclic_scheduler 75 tests

IDMethodCoversTitleStimuliExpected (oracle)
TC-CYC-001BVAREQ-CYC-001Task registration rejects period not divisible by 10 - boundary 9mstask_registration_period_ms=9; task_registration_offset_ms=0; task_registration_priority=highTask registration rejected, no task added to scheduler
TC-CYC-002BVAREQ-CYC-001Task registration rejects period not divisible by 10 - boundary 11mstask_registration_period_ms=11; task_registration_offset_ms=0; task_registration_priority=mediumTask registration rejected, no task added to scheduler
TC-CYC-003BVAREQ-CYC-001Task registration accepts period exactly divisible by 10 - boundary 10mstask_registration_period_ms=10; task_registration_offset_ms=0; task_registration_priority=highTask registration accepted, task scheduled for execution
TC-CYC-004BVAREQ-CYC-001Task registration accepts period exactly divisible by 10 - boundary 100mstask_registration_period_ms=100; task_registration_offset_ms=0; task_registration_priority=lowTask registration accepted, task scheduled for execution
TC-CYC-005BVAREQ-CYC-001Task registration rejects offset_ms equal to period_mstask_registration_period_ms=50; task_registration_offset_ms=50; task_registration_priority=highTask registration rejected, no task added to scheduler
TC-CYC-006BVAREQ-CYC-001Task registration rejects offset_ms greater than period_mstask_registration_period_ms=50; task_registration_offset_ms=51; task_registration_priority=mediumTask registration rejected, no task added to scheduler
TC-CYC-007BVAREQ-CYC-001Task registration accepts offset_ms just below period_mstask_registration_period_ms=50; task_registration_offset_ms=49; task_registration_priority=highTask registration accepted, task scheduled with offset 49ms within 50ms period
TC-CYC-008EPREQ-CYC-001Task registration rejects invalid priority - empty stringtask_registration_period_ms=20; task_registration_offset_ms=0; task_registration_priority=Task registration rejected, no task added to scheduler
TC-CYC-009EPREQ-CYC-001Task registration rejects invalid priority - numeric valuetask_registration_period_ms=20; task_registration_offset_ms=0; task_registration_priority=123Task registration rejected, no task added to scheduler
TC-CYC-010EPREQ-CYC-001Task registration accepts valid priority - hightask_registration_period_ms=30; task_registration_offset_ms=0; task_registration_priority=highTask registration accepted with high priority, task scheduled for execution
TC-CYC-011EPREQ-CYC-001Task registration accepts valid priority - mediumtask_registration_period_ms=40; task_registration_offset_ms=0; task_registration_priority=mediumTask registration accepted with medium priority, task scheduled for execution
TC-CYC-012EPREQ-CYC-001Task registration accepts valid priority - lowtask_registration_period_ms=50; task_registration_offset_ms=0; task_registration_priority=lowTask registration accepted with low priority, task scheduled for execution
TC-CYC-013DecisionREQ-CYC-002Tick counter increments by base_period_ms on first tickrun_tick_count=1tick_ms_ output reads 10 after one tick execution
TC-CYC-014DecisionREQ-CYC-002Tick counter increments by base_period_ms on multiple ticksrun_tick_count=10tick_ms_ output reads 100 after ten tick executions
TC-CYC-015DecisionREQ-CYC-002Tick counter increments by custom base_period_msscheduler_base_period_ms=20; run_tick_count=5tick_ms_ output reads 100 after five tick executions
TC-CYC-016BVAREQ-CYC-002Tick counter monotonicity near uint64_t overflowinitial_tick_ms=18446744073709551586; run_tick_count=5tick_ms_ output wraps modulo 2^64 and reads (18446744073709551586 + 50) mod 2^64 = 20 after five ticks
TC-CYC-017BVAREQ-CYC-003Task registration at maximum capacity boundaryREVIEW REQUIRED
TC-CYC-018BVAREQ-CYC-003Task registration rejection beyond maximum capacityREVIEW REQUIRED
TC-CYC-019BVAREQ-CYC-003Task execution per tick at maximum limitREVIEW REQUIRED
TC-CYC-020DecisionREQ-CYC-003Task execution limit enforced when more tasks due than max_tasks_per_tickREVIEW REQUIRED
TC-CYC-021DecisionREQ-CYC-004Time unit consistency - tick_ms_ in millisecondsrun_tick_count=1tick_ms_ output reads 10, representing milliseconds, after one tick with base_period_ms=10
TC-CYC-022DecisionREQ-CYC-004Period conversion from ms to tick countstask_registration_period_ms=50; task_registration_offset_ms=0; task_registration_priority=highTask executes every 50ms (5 ticks), observable through task callback effects on signal_bus_t outputs
TC-CYC-023DecisionREQ-CYC-004Offset conversion from ms to tick countstask_registration_period_ms=100; task_registration_offset_ms=30; task_registration_priority=mediumTask first executes at tick_ms_=30, then every 100ms thereafter, observable through task callback effects
TC-CYC-024DecisionREQ-CYC-004Frequency to period conversion using hz_to_ms_formulaREVIEW REQUIRED
TC-CYC-025DecisionREQ-CYC-005Task callback exception handling - exception caughtREVIEW REQUIRED
TC-CYC-026DecisionREQ-CYC-005Task callback exception - fault loggedREVIEW REQUIRED
TC-CYC-027DecisionREQ-CYC-005Task callback exception - task marked with fault statusREVIEW REQUIRED
TC-CYC-028DecisionREQ-CYC-005Task callback exception - fault_task_policy enforcedREVIEW REQUIRED
TC-CYC-029DecisionREQ-CYC-005Uninitialized signal_bus_t error on run_tickREVIEW REQUIRED
TC-CYC-030DecisionREQ-CYC-006Periodic task execution at exact scheduling point - zero offsettask_registration_period_ms=50; task_registration_offset_ms=0; task_registration_priority=high; run_tick_count=10Task executes at tick_ms_ values 0, 50, 100 (every 50ms) within tolerance 0ms, observable through task callback effects on signal_bus_t outputs
TC-CYC-031DecisionREQ-CYC-006Periodic task execution at exact scheduling point - non-zero offsettask_registration_period_ms=100; task_registration_offset_ms=20; task_registration_priority=medium; run_tick_count=25Task executes at tick_ms_ values 20, 120, 220 (offset 20ms, period 100ms) within tolerance 0ms, observable through task effects
TC-CYC-032DecisionREQ-CYC-006Task priority ordering - high before mediumtask_1_period_ms=50; task_1_offset_ms=0; task_1_priority=high; task_2_period_ms=50; task_2_offset_ms=0; task_2_priority=medium; run_tick_count=5High priority task (priority 0) executes before medium priority task (priority 1) observable through signal_bus_t write order and output states
TC-CYC-033DecisionREQ-CYC-006Task priority ordering - medium before lowtask_1_period_ms=60; task_1_offset_ms=0; task_1_priority=medium; task_2_period_ms=60; task_2_offset_ms=0; task_2_priority=low; run_tick_count=6Medium priority task (priority 1) executes before low priority task (priority 2) observable through signal_bus_t write order and output states
TC-CYC-034DecisionREQ-CYC-006Task priority ordering - all three prioritiestask_1_period_ms=30; task_1_offset_ms=0; task_1_priority=low; task_2_period_ms=30; task_2_offset_ms=0; task_2_priority=high; task_3_period_ms=30; task_3_offset_ms=0; task_3_priority=medium; run_tick_count=3Tasks execute in order: high(0), then medium(1), then low(2) regardless of registration order, observable through signal_bus_t output states
TC-CYC-035DecisionREQ-CYC-006Stable sort preserves registration order within same prioritytask_1_period_ms=40; task_1_offset_ms=0; task_1_priority=high; task_1_registration_order=1; task_2_period_ms=40; task_2_offset_ms=0; task_2_priority=high; task_2_registration_order=2; task_3_period_ms=40; task_3_offset_ms=0; task_3_priority=high; task_3_registration_order=3; run_tick_count=4Tasks execute in registration order (task1, task2, task3) within high priority, observable through signal_bus_t write sequence and output states
TC-CYC-036DecisionREQ-CYC-006All due task callbacks complete within max_tick_execution_time_msREVIEW REQUIRED
TC-CYC-037BVAREQ-CYC-007Alive counters array at maximum valid index boundaryalive_counter_module_index=11Write to alive_counters_[11] succeeds (valid, last index for 12 entries 0-11), observable through alive_counters_ output array
TC-CYC-038BVAREQ-CYC-007Alive counters array prevents write beyond maximum boundalive_counter_module_index=12Write to alive_counters_[12] rejected (beyond bound for 12 entries 0-11), no out-of-bounds write occurs
TC-CYC-039BVAREQ-CYC-007Alive counters array at minimum valid index boundaryalive_counter_module_index=0Write to alive_counters_[0] succeeds (valid, first index), observable through alive_counters_ output array
TC-CYC-040BVAREQ-CYC-007Lidar scan points at maximum limitlidar_scan_point_count=360lidar_scan_ vector contains exactly 360 points (maximum allowed), observable through lidar_scan_ output vector size
TC-CYC-041BVAREQ-CYC-007Lidar scan points exceed maximum limit rejectedlidar_scan_point_count=361lidar_scan_ vector limited to 360 points, 361st point rejected or container prevents addition, observable through lidar_scan_ output vector size <= 360
TC-CYC-042BVAREQ-CYC-007Obstacles at maximum limitobstacle_count=32obstacles_ vector contains exactly 32 obstacles (maximum allowed), observable through obstacles_ output vector size
TC-CYC-043BVAREQ-CYC-007Obstacles exceed maximum limit rejectedobstacle_count=33obstacles_ vector limited to 32 obstacles, 33rd obstacle rejected or container prevents addition, observable through obstacles_ output vector size <= 32
TC-CYC-044StateREQ-CYC-008Scheduler in uninitialized state before signal_bus_t initializationREVIEW REQUIRED
TC-CYC-045StateREQ-CYC-008Scheduler transitions to registration state after initializationREVIEW REQUIRED
TC-CYC-046StateREQ-CYC-008Task registration allowed in registration statetask_registration_period_ms=20; task_registration_offset_ms=0; task_registration_priority=highTask registration succeeds in registration state, observable through task execution after run_tick begins
TC-CYC-047StateREQ-CYC-008Scheduler transitions to running state on first run_tickrun_tick_count=1REVIEW REQUIRED
TC-CYC-048StateREQ-CYC-008Task registration rejected in running staterun_tick_count=1; task_registration_period_ms=30; task_registration_offset_ms=0; task_registration_priority=mediumTask registration rejected after scheduler enters running state, observable through registration failure mechanism
TC-CYC-049StateREQ-CYC-008run_tick rejected in uninitialized stateREVIEW REQUIRED
TC-CYC-050ConcurrencyREQ-CYC-009Sequential task execution within single tick - no concurrencytask_1_period_ms=50; task_1_offset_ms=0; task_1_priority=high; task_2_period_ms=50; task_2_offset_ms=0; task_2_priority=high; task_3_period_ms=50; task_3_offset_ms=0; task_3_priority=high; run_tick_count=5Tasks execute sequentially (task1 completes before task2 starts, task2 completes before task3 starts) within each tick, no concurrent execution, observable through signal_bus_t consistent state writes
TC-CYC-051InterfaceREQ-CYC-009Signal bus writes by task N visible to task N+1 in same ticktask_1_period_ms=40; task_1_offset_ms=0; task_1_priority=high; task_1_writes=odometry_.speed_mps; task_2_period_ms=40; task_2_offset_ms=0; task_2_priority=high; task_2_reads=odometry_.speed_mps; run_tick_count=4Task2 observes the value written by task1 to odometry_.speed_mps within the same tick, visible through task2's output effects reflecting task1's write
TC-CYC-052ConcurrencyREQ-CYC-009Signal bus synchronization mechanism when run_tick single-threadedrun_tick_count=10; concurrent_run_tick_calls=1Signal_bus_t accessed without synchronization mechanism (NONE) as specified, no data races occur, observable through consistent output states across all ticks
TC-CYC-053ConcurrencyREQ-CYC-009Signal bus data race prevention when run_tick multi-threadedrun_tick_count=10; concurrent_run_tick_calls=3Requirement specifies synchronization NONE. If run_tick can be called from multiple threads, data races may occur (requirement specifies NONE synchronization), observable through inconsistent or corrupted output states
TC-CYC-054InterfaceREQ-CYC-009Task callback signal_bus_t access mode - non-const referencetask_period_ms=20; task_offset_ms=0; task_priority=high; run_tick_count=2Task callback has non-const reference (READ_WRITE) access to signal_bus_t, can write outputs like odometry_.speed_mps, observable through modified output values after task execution
TC-CYC-055InterfaceREQ-CYC-009Task callback cannot directly modify scheduler statetask_period_ms=30; task_offset_ms=0; task_priority=medium; run_tick_count=3Task callback can modify signal_bus_t outputs but cannot modify scheduler internal state (task list, tick_ms_ outside normal increment, state transitions), observable through scheduler continuing normal operation
TC-CYC-056BVAREQ-CYC-002Tick counter at zero initial valuerun_tick_count=0tick_ms_ output reads 0 before any tick execution
TC-CYC-057BVAREQ-CYC-006Task execution scheduling formula - boundary at offset equals 0task_registration_period_ms=40; task_registration_offset_ms=0; task_registration_priority=high; run_tick_count=8Task executes when ((tick_ms_ - 0) % 40) equals 0 within tolerance 0: executes at tick_ms_ = 0, 40, 80, observable through task effects
TC-CYC-058BVAREQ-CYC-006Task execution scheduling formula - boundary at offset equals period-1task_registration_period_ms=60; task_registration_offset_ms=59; task_registration_priority=low; run_tick_count=15Task executes when ((tick_ms_ - 0) % 60) equals 59 within tolerance 0: executes at tick_ms_ = 59, 119, observable through task effects
TC-CYC-059ScenarioREQ-CYC-001, REQ-CYC-006End-to-end task registration and periodic executiontask_registration_period_ms=100; task_registration_offset_ms=10; task_registration_priority=medium; run_tick_count=25Task registration accepted (REQ-CYC-001: period=100 divisible by 10, offset=10 < period=100, priority=medium valid), task executes at tick_ms_ = 10, 110 (REQ-CYC-006: scheduling formula satisfied), observable through task callback effects on signal_bus_t outputs
TC-CYC-060ScenarioREQ-CYC-002, REQ-CYC-006Time progression and task scheduling correlationtask_registration_period_ms=50; task_registration_offset_ms=20; task_registration_priority=high; run_tick_count=15tick_ms_ increments by 10 each tick (REQ-CYC-002), reaching 150 after 15 ticks; task executes when tick_ms_=20, 70, 120 (REQ-CYC-006 scheduling formula), observable through tick_ms_ output and task effects
TC-CYC-061EPREQ-CYC-007Alive counters nominal operation - module 5alive_counter_module_index=5; alive_counter_increment=1alive_counters_[5] increments successfully (within valid 0-11 range), observable through alive_counters_ output array showing incremented value
TC-CYC-062EPREQ-CYC-007Lidar scan points nominal operation - 180 pointslidar_scan_point_count=180lidar_scan_ vector contains 180 points (well below 360 maximum), observable through lidar_scan_ output vector size = 180
TC-CYC-063EPREQ-CYC-007Obstacles nominal operation - 16 obstaclesobstacle_count=16obstacles_ vector contains 16 obstacles (well below 32 maximum), observable through obstacles_ output vector size = 16
TC-CYC-064EPREQ-CYC-001Task registration nominal - 100ms period, 0ms offset, high prioritytask_registration_period_ms=100; task_registration_offset_ms=0; task_registration_priority=highTask registration accepted (all validation criteria satisfied: period=100 divisible by 10, offset=0 < period=100, priority=high valid)
TC-CYC-065BVAREQ-CYC-004Period conversion boundary - minimum valid period 10mstask_registration_period_ms=10; task_registration_offset_ms=0; task_registration_priority=highTask period 10ms converts to 1 tick count (10/10=1), task executes every tick, observable through task effects at tick_ms_ = 0, 10, 20, 30...
TC-CYC-066DecisionREQ-CYC-006Multiple tasks same priority - stable sort maintains registration ordertask_A_period_ms=50; task_A_offset_ms=0; task_A_priority=medium; task_A_registration_order=1; task_B_period_ms=50; task_B_offset_ms=0; task_B_priority=medium; task_B_registration_order=2; task_C_period_ms=50; task_C_offset_ms=0; task_C_priority=medium; task_C_registration_order=3; run_tick_count=5At tick_ms_=0 and 50, tasks execute in registration order: task_A first, task_B second, task_C third (stable sort within medium priority), observable through signal_bus_t write sequence
TC-CYC-067DecisionREQ-CYC-002Tick counter monotonicity over extended operationrun_tick_count=1000tick_ms_ increments monotonically from 0 to 10000 (1000 ticks * 10ms/tick) without skips, decrements, or duplicates, observable through tick_ms_ output after 1000 ticks = 10000
TC-CYC-068EPREQ-CYC-001Task registration with minimum valid offset - 0mstask_registration_period_ms=80; task_registration_offset_ms=0; task_registration_priority=lowTask registration accepted with offset=0ms (minimum valid offset), task first executes at tick_ms_=0
TC-CYC-069ScenarioREQ-CYC-006Mixed priority tasks execution order - realistic scenariotask_H1_period_ms=100; task_H1_offset_ms=0; task_H1_priority=high; task_H2_period_ms=100; task_H2_offset_ms=0; task_H2_priority=high; task_M1_period_ms=100; task_M1_offset_ms=0; task_M1_priority=medium; task_M2_period_ms=100; task_M2_offset_ms=0; task_M2_priority=medium; task_L1_period_ms=100; task_L1_offset_ms=0; task_L1_priority=low; run_tick_count=10Tasks execute in priority order: H1, H2 (high), then M1, M2 (medium), then L1 (low), with registration order preserved within each priority level, observable through signal_bus_t write sequence and output states
TC-CYC-070DecisionREQ-CYC-004Large period conversion accuracy - 1000mstask_registration_period_ms=1000; task_registration_offset_ms=0; task_registration_priority=medium; run_tick_count=150Task period 1000ms converts to 100 tick counts (1000/10=100), task executes at tick_ms_ = 0, 1000, observable through task effects only at these times
TC-CYC-071InterfaceREQ-CYC-009Signal bus data propagation chain - three sequential taskstask_1_period_ms=60; task_1_offset_ms=0; task_1_priority=high; task_1_writes=odometry_.speed_mps; task_2_period_ms=60; task_2_offset_ms=0; task_2_priority=high; task_2_reads=odometry_.speed_mps; task_2_writes=pose_.speed_mps; task_3_period_ms=60; task_3_offset_ms=0; task_3_priority=high; task_3_reads=pose_.speed_mps; run_tick_count=6Within same tick at tick_ms_=0,60,120: task1 writes odometry_.speed_mps, task2 reads that value and writes pose_.speed_mps, task3 reads pose_.speed_mps written by task2, complete data chain visible, observable through task3's outputs reflecting task1's input
TC-CYC-072BVAREQ-CYC-007Lidar scan points at boundary minus one - 359 pointslidar_scan_point_count=359lidar_scan_ vector contains exactly 359 points (just below 360 maximum), observable through lidar_scan_ output vector size = 359
TC-CYC-073BVAREQ-CYC-007Obstacles at boundary minus one - 31 obstaclesobstacle_count=31obstacles_ vector contains exactly 31 obstacles (just below 32 maximum), observable through obstacles_ output vector size = 31
TC-CYC-074DecisionREQ-CYC-001Task registration compound rejection - multiple violationstask_registration_period_ms=33; task_registration_offset_ms=40; task_registration_priority=invalidTask registration rejected (period=33 not divisible by 10, offset=40 >= period=33, priority=invalid not in {high,medium,low}), no task added
TC-CYC-075ScenarioREQ-CYC-002, REQ-CYC-004Custom base period - 20ms tick periodscheduler_base_period_ms=20; task_registration_period_ms=60; task_registration_offset_ms=0; task_registration_priority=high; run_tick_count=10tick_ms_ increments by 20 each tick (REQ-CYC-002 with custom base), reaching 200 after 10 ticks; task period 60ms converts to 3 tick counts (60/20=3, REQ-CYC-004 conversion), task executes at tick_ms_=0,60,120,180