diff --git a/.planning/AC-TRACEABILITY.md b/.planning/AC-TRACEABILITY.md index b720513..3bc45ab 100644 --- a/.planning/AC-TRACEABILITY.md +++ b/.planning/AC-TRACEABILITY.md @@ -4,7 +4,7 @@ > Run `python scripts/gen_ac_traceability.py` to regenerate after AC doc or test edits. **ACs declared in acceptance_criteria.md:** 39 -**ACs covered by at least one test:** 14 +**ACs covered by at least one test:** 15 **ACs deferred (hardware or pending-phase):** 25 ## AC -> Test mapping @@ -14,9 +14,9 @@ | AC-1.1 | 5 | `tests/test_acceptance.py::test_ac1_normal_flight`
`tests/test_acceptance.py::test_ac5_sustained_throughput`
`tests/test_accuracy.py::test_pct_within_50m_with_sat_corrections`
`tests/test_accuracy.py::test_passes_acceptance_criteria_full_pass`
`tests/test_accuracy.py::test_passes_acceptance_criteria_accuracy_fail` | OK | | AC-1.2 | 2 | `tests/test_accuracy.py::test_pct_within_20m_with_sat_corrections`
`tests/test_accuracy.py::test_passes_acceptance_criteria_full_pass` | OK | | AC-1.3 | 1 | `tests/test_accuracy.py::test_vo_drift_under_100m_over_1km` | OK | -| AC-1.4 | 2 | `tests/test_acceptance.py::test_ac4_user_anchor_fix`
`tests/test_processor_pipe.py::test_create_flight_initialises_eskf` | OK | +| AC-1.4 | 7 | `tests/test_acceptance.py::test_ac4_user_anchor_fix`
`tests/test_log_schemas.py::test_mavlink_gps_input_round_trip`
`tests/test_log_schemas.py::test_mavlink_source_label_accepts_canonical_vocab[satellite_anchored]`
`tests/test_log_schemas.py::test_mavlink_source_label_accepts_canonical_vocab[vo_extrapolated]`
`tests/test_log_schemas.py::test_mavlink_source_label_accepts_canonical_vocab[dead_reckoned]`
`tests/test_log_schemas.py::test_mavlink_source_label_rejects_unknown`
`tests/test_processor_pipe.py::test_create_flight_initialises_eskf` | OK | | AC-2.1a | 2 | `tests/test_acceptance.py::test_ac2_tracking_loss_and_recovery`
`tests/test_accuracy.py::test_confidence_high_after_fresh_satellite` | OK | -| AC-2.1b | 0 | _none_ | DEFERRED (pending-phase-4) | +| AC-2.1b | 6 | `tests/test_log_schemas.py::test_anchor_decision_accept_round_trip`
`tests/test_log_schemas.py::test_anchor_decision_accepts_verify02_vocab[ok]`
`tests/test_log_schemas.py::test_anchor_decision_accepts_verify02_vocab[too_few_inliers]`
`tests/test_log_schemas.py::test_anchor_decision_accepts_verify02_vocab[mre_above_threshold]`
`tests/test_log_schemas.py::test_anchor_decision_accepts_verify02_vocab[degenerate_homography]`
`tests/test_log_schemas.py::test_anchor_decision_accepts_verify02_vocab[freshness_expired]` | DEFERRED (pending-phase-4) | | AC-2.2 | 1 | `tests/test_accuracy.py::test_covariance_shrinks_after_satellite_update` | OK | | AC-3.1 | 0 | _none_ | DEFERRED (pending-phase-4) | | AC-3.2 | 0 | _none_ | DEFERRED (pending-phase-4) | @@ -25,7 +25,7 @@ | AC-3.5 | 0 | _none_ | DEFERRED (pending-phase-3) | | AC-4.1 | 3 | `tests/test_acceptance.py::test_ac3_performance_per_frame`
`tests/test_accuracy.py::test_per_frame_latency_under_400ms`
`tests/test_accuracy.py::test_passes_acceptance_criteria_latency_fail` | OK | | AC-4.2 | 0 | _none_ | DEFERRED (pending-phase-4) | -| AC-4.3 | 20 | `tests/test_gps_input_encoding.py::test_gps_input_lat_lon_encoded_as_deg_e7`
`tests/test_gps_input_encoding.py::test_gps_input_lat_lon_offset_from_enu_position`
`tests/test_gps_input_encoding.py::test_gps_input_alt_in_meters_msl`
`tests/test_gps_input_encoding.py::test_gps_input_velocity_enu_to_ned_conversion`
`tests/test_gps_input_encoding.py::test_gps_input_satellites_visible_synthetic_10`
`tests/test_gps_input_encoding.py::test_gps_input_fix_type_high_confidence_is_3d`
`tests/test_gps_input_encoding.py::test_gps_input_fix_type_medium_confidence_is_3d`
`tests/test_gps_input_encoding.py::test_gps_input_fix_type_low_confidence_no_fix`
`tests/test_gps_input_encoding.py::test_gps_input_fix_type_failed_no_fix`
`tests/test_gps_input_encoding.py::test_gps_input_accuracy_from_covariance`
`tests/test_gps_input_encoding.py::test_gps_input_hdop_vdop_clamped_to_min`
`tests/test_gps_input_encoding.py::test_confidence_tier_mapping_complete`
`tests/test_mavlink.py::test_confidence_to_fix_type`
`tests/test_mavlink.py::test_eskf_to_gps_input_position`
`tests/test_mavlink.py::test_eskf_to_gps_input_lon`
`tests/test_sitl_integration.py::test_sitl_tcp_port_reachable`
`tests/test_sitl_integration.py::test_pymavlink_connection_to_sitl`
`tests/test_sitl_integration.py::test_gps_input_accepted_by_sitl`
`tests/test_sitl_integration.py::test_mavlink_bridge_start_stop_with_sitl`
`tests/test_sitl_integration.py::test_gps_input_rate_at_least_5hz` | OK | +| AC-4.3 | 26 | `tests/test_gps_input_encoding.py::test_gps_input_lat_lon_encoded_as_deg_e7`
`tests/test_gps_input_encoding.py::test_gps_input_lat_lon_offset_from_enu_position`
`tests/test_gps_input_encoding.py::test_gps_input_alt_in_meters_msl`
`tests/test_gps_input_encoding.py::test_gps_input_velocity_enu_to_ned_conversion`
`tests/test_gps_input_encoding.py::test_gps_input_satellites_visible_synthetic_10`
`tests/test_gps_input_encoding.py::test_gps_input_fix_type_high_confidence_is_3d`
`tests/test_gps_input_encoding.py::test_gps_input_fix_type_medium_confidence_is_3d`
`tests/test_gps_input_encoding.py::test_gps_input_fix_type_low_confidence_no_fix`
`tests/test_gps_input_encoding.py::test_gps_input_fix_type_failed_no_fix`
`tests/test_gps_input_encoding.py::test_gps_input_accuracy_from_covariance`
`tests/test_gps_input_encoding.py::test_gps_input_hdop_vdop_clamped_to_min`
`tests/test_gps_input_encoding.py::test_confidence_tier_mapping_complete`
`tests/test_log_schemas.py::test_mavlink_gps_input_round_trip`
`tests/test_log_schemas.py::test_mavlink_fix_type_bounds[-1]`
`tests/test_log_schemas.py::test_mavlink_fix_type_bounds[7]`
`tests/test_log_schemas.py::test_mavlink_fix_type_bounds[100]`
`tests/test_log_schemas.py::test_mavlink_extra_field_rejected`
`tests/test_log_schemas.py::test_mavlink_record_is_frozen`
`tests/test_mavlink.py::test_confidence_to_fix_type`
`tests/test_mavlink.py::test_eskf_to_gps_input_position`
`tests/test_mavlink.py::test_eskf_to_gps_input_lon`
`tests/test_sitl_integration.py::test_sitl_tcp_port_reachable`
`tests/test_sitl_integration.py::test_pymavlink_connection_to_sitl`
`tests/test_sitl_integration.py::test_gps_input_accepted_by_sitl`
`tests/test_sitl_integration.py::test_mavlink_bridge_start_stop_with_sitl`
`tests/test_sitl_integration.py::test_gps_input_rate_at_least_5hz` | OK | | AC-4.4 | 5 | `tests/test_acceptance.py::test_ac1_normal_flight`
`tests/test_acceptance.py::test_ac4_user_anchor_fix`
`tests/test_acceptance.py::test_ac5_sustained_throughput`
`tests/test_processor_pipe.py::test_mavlink_state_pushed_per_frame`
`tests/test_sitl_integration.py::test_gps_input_rate_at_least_5hz` | OK | | AC-4.5 | 0 | _none_ | DEFERRED (pending-phase-3) | | AC-5.1 | 0 | _none_ | DEFERRED (pending-phase-3) | @@ -33,7 +33,7 @@ | AC-5.3 | 0 | _none_ | DEFERRED (pending-phase-3) | | AC-6.1 | 0 | _none_ | DEFERRED (pending-phase-5) | | AC-6.2 | 0 | _none_ | DEFERRED (pending-phase-5) | -| AC-6.3 | 6 | `tests/test_schemas.py::TestGPSPoint::test_valid`
`tests/test_schemas.py::TestGPSPoint::test_lat_out_of_range`
`tests/test_schemas.py::TestGPSPoint::test_lon_out_of_range`
`tests/test_schemas.py::TestGPSPoint::test_serialization_roundtrip`
`tests/test_schemas.py::TestWaypoint::test_valid`
`tests/test_schemas.py::TestWaypoint::test_confidence_out_of_range` | OK | +| AC-6.3 | 7 | `tests/test_log_schemas.py::test_api_request_round_trip`
`tests/test_schemas.py::TestGPSPoint::test_valid`
`tests/test_schemas.py::TestGPSPoint::test_lat_out_of_range`
`tests/test_schemas.py::TestGPSPoint::test_lon_out_of_range`
`tests/test_schemas.py::TestGPSPoint::test_serialization_roundtrip`
`tests/test_schemas.py::TestWaypoint::test_valid`
`tests/test_schemas.py::TestWaypoint::test_confidence_out_of_range` | OK | | AC-7.1 | 0 | _none_ | DEFERRED (pending-phase-5) | | AC-7.2 | 0 | _none_ | DEFERRED (pending-phase-5) | | AC-8.1 | 0 | _none_ | DEFERRED (pending-phase-4) |