# Warehouse Cell Automated Test Report

**Overall result: PASSED**
**Coverage note:** 1 test(s) were skipped; review the reasons below and in the JUnit artifact.


## Execution summary

| Total | Passed | Failed | Errors | Skipped | Duration |
| ---: | ---: | ---: | ---: | ---: | ---: |
| 105 | 104 | 0 | 0 | 1 | 88.739 s |

## Environment and reproduction

| Field | Value |
| --- | --- |
| Generated (UTC) | 2026-08-13T02:47:20+00:00 |
| Host | pop-os |
| Operating system | Linux-6.16.3-76061603-generic-x86_64-with-glibc2.35 |
| Python | 3.10.12 (/usr/bin/python3) |
| ROS distribution | humble |
| ROS middleware | default / not set |
| ROS domain ID | 86 |
| Gazebo partition | warehouse_test_86_162606 |
| Git commit | not available |
| Execution mode | headless |
| Selected suite | all |
| Reproduction command | scripts/run_tests.sh --suite all --headless --ros-domain-id 86 |

## Test results

| Result | Scenario | Suite | Test | Duration |
| --- | --- | --- | --- | ---: |
| SKIP | WH-K8S-001 | pytest | `deployment.test_kubernetes_restart.test_kind_pod_restart_preserves_run_and_becomes_ready` | 0.002 s |
| PASS | WH-ACTION-001 | pytest | `e2e.test_action_fulfillment.test_action_reports_feedback_and_returns_completed_pallet` | 5.384 s |
| PASS | WH-NOM-001 | pytest | `e2e.test_nominal_fulfillment.test_multi_sku_order_moves_cases_and_builds_pallet` | 5.527 s |
| PASS | WH-NOM-002 | pytest | `e2e.test_nominal_fulfillment.test_two_orders_can_flow_to_independent_picker_stations` | 4.098 s |
| PASS | WH-ROUTE-001 | pytest | `e2e.test_routing_resilience.test_surge_wave_routes_all_orders_without_collision_or_deadlock` | 14.497 s |
| PASS | WH-SAFE-001 | pytest | `e2e.test_safety_and_recovery.test_emergency_stop_halts_motion_then_allows_order_to_resume` | 6.794 s |
| PASS | WH-FAULT-001 | pytest | `e2e.test_safety_and_recovery.test_stalled_vehicle_is_cleared_and_order_recovers` | 6.806 s |
| PASS | WH-FAULT-002 | pytest | `e2e.test_safety_and_recovery.test_timed_picker_jam_self_clears_without_losing_the_case` | 2.646 s |
| PASS | WH-TXN-001 | pytest | `integration.test_distributed_semantics.test_simultaneous_competing_orders_reserve_scarce_inventory_atomically` | 0.149 s |
| PASS | WH-STREAM-001 | pytest | `integration.test_distributed_semantics.test_live_event_stream_is_causal_unique_and_reconciles_to_state` | 3.348 s |
| PASS | WH-QOS-001 | pytest | `integration.test_distributed_semantics.test_late_subscriber_gets_latest_state_but_not_volatile_event_history` | 0.899 s |
| PASS | WH-SCALE-001 | pytest | `integration.test_fleet_scalability.test_surge_wave_characterizes_fleet_scaling_and_picker_saturation` | 0.813 s |
| PASS | WH-GZ-CONVERGE-001 | pytest | `integration.test_gazebo_pose_convergence.test_stopped_agv_pose_converges_from_ros_state_into_gazebo` | 4.472 s |
| PASS | WH-K8S-GATEWAY-001 | pytest | `integration.test_health_gateway.test_gateway_readiness_state_and_metrics_follow_ros_projection` | 0.693 s |
| PASS | WH-DIST-001 | pytest | `integration.test_idempotent_retry_contract.test_abandoned_success_response_is_reconciled_by_idempotent_retry` | 0.497 s |
| PASS | WH-INT-LIVE-001 | pytest | `integration.test_live_cell_contract.test_state_stream_contains_populated_unique_cell` | 0.030 s |
| PASS | WH-INT-LIVE-002 | pytest | `integration.test_live_cell_contract.test_reset_is_deterministic_for_same_seed` | 0.012 s |
| PASS | WH-INT-LIVE-003 | pytest | `integration.test_live_cell_contract.test_invalid_order_is_rejected_without_mutating_cell` | 0.109 s |
| PASS | WH-PERF-001 | pytest | `integration.test_performance_characterization.test_seeded_wave_records_non_gating_percentile_baseline` | 0.580 s |
| PASS | WH-INT-001 | pytest | `integration.test_ros_interface_contract.test_cell_state_message_composes_all_entity_types` | 0.000 s |
| PASS | WH-INT-002 | pytest | `integration.test_ros_interface_contract.test_order_service_and_action_keep_sku_quantity_pairs_aligned` | 0.000 s |
| PASS | WH-INT-003 | pytest | `integration.test_ros_interface_contract.test_fault_and_estop_services_expose_diagnostic_responses` | 0.000 s |
| PASS | WH-PAUSE-001 | pytest | `system.test_controller_pause_recovery.test_sigstop_exposes_stale_state_and_sigcont_recovers_coherently` | 3.651 s |
| PASS | WH-RESTART-001 | pytest | `system.test_controller_restart_recovery.test_inflight_order_survives_controller_restart_exactly_once` | 8.179 s |
| PASS | WH-OBS-GDB-001 | pytest | `system.test_gdb_observability.test_gdb_captures_ros_python_and_dds_full_thread_stacks` | 2.120 s |
| PASS | WH-NETEM-001 | pytest | `system.test_netem_packet_faults.test_udp_packets_receive_real_latency_loss_timeout_and_partition` | 6.807 s |
| PASS | WH-NET-001 | pytest | `system.test_network_fault_relay.test_latency_is_injected_before_the_authoritative_call` | 1.097 s |
| PASS | WH-NET-002 | pytest | `system.test_network_fault_relay.test_timeout_after_commit_has_unknown_outcome_and_retry_is_idempotent` | 1.532 s |
| PASS | WH-NET-003 | pytest | `system.test_network_fault_relay.test_drop_and_partition_do_not_commit_and_recovery_accepts_retry` | 1.503 s |
| PASS | WH-OUTBOX-CRASH-001 | pytest | `system.test_outbox_duplicate_delivery.test_publish_before_mark_crash_replays_event_and_consumer_deduplicates` | 5.990 s |
| PASS | — | pytest | `unit.test_cli_scripts.test_run_tests_help_documents_visual_headless_and_gdb_modes` | 0.012 s |
| PASS | — | pytest | `unit.test_cli_scripts.test_run_demo_help_exposes_explicit_persistence_and_restart_controls` | 0.022 s |
| PASS | — | pytest | `unit.test_cli_scripts.test_gdb_stack_capture_help_describes_full_thread_evidence` | 0.036 s |
| PASS | — | pytest | `unit.test_cli_scripts.test_generate_report_cli_writes_markdown_and_json` | 0.052 s |
| PASS | — | pytest | `unit.test_cli_scripts.test_generate_report_can_fail_ci_after_still_writing_artifacts` | 0.041 s |
| PASS | WH-K8S-STATIC-001 | pytest | `unit.test_deployment_assets.test_manifest_connects_deployment_service_storage_and_probes` | 0.009 s |
| PASS | WH-K8S-STATIC-002 | pytest | `unit.test_deployment_assets.test_container_is_non_root_and_runtime_smoke_is_bounded` | 0.006 s |
| PASS | WH-ENGINE-001 | pytest | `unit.test_engine.test_nominal_multi_sku_order_completes_with_consistent_inventory` | 0.018 s |
| PASS | WH-ENGINE-002 | pytest | `unit.test_engine.test_default_mixed_wave_fulfills_both_pickers_without_collision` | 0.045 s |
| PASS | WH-ENGINE-003 | pytest | `unit.test_engine.test_insufficient_inventory_rejection_is_atomic` | 0.001 s |
| PASS | WH-ENGINE-004 | pytest | `unit.test_engine.test_invalid_orders_are_rejected_with_actionable_messages[-lines0-picker_01-order_id]` | 0.001 s |
| PASS | WH-ENGINE-004 | pytest | `unit.test_engine.test_invalid_orders_are_rejected_with_actionable_messages[bad-empty-lines1-picker_01-at least one]` | 0.001 s |
| PASS | WH-ENGINE-004 | pytest | `unit.test_engine.test_invalid_orders_are_rejected_with_actionable_messages[bad-zero-lines2-picker_01-positive]` | 0.001 s |
| PASS | WH-ENGINE-004 | pytest | `unit.test_engine.test_invalid_orders_are_rejected_with_actionable_messages[bad-picker-lines3-picker_99-unknown picker]` | 0.001 s |
| PASS | WH-ENGINE-005 | pytest | `unit.test_engine.test_duplicate_order_id_is_rejected_without_double_reservation` | 0.002 s |
| PASS | WH-SAFE-UNIT-001 | pytest | `unit.test_engine.test_emergency_stop_freezes_motion_and_processing_then_resumes` | 0.012 s |
| PASS | WH-FAULT-UNIT-001 | pytest | `unit.test_engine.test_timed_vehicle_stall_self_clears_and_order_recovers` | 0.006 s |
| PASS | WH-FAULT-UNIT-002 | pytest | `unit.test_engine.test_picker_jam_holds_case_until_manual_clear` | 0.008 s |
| PASS | WH-ENGINE-006 | pytest | `unit.test_engine.test_snapshot_is_a_deep_copy_suitable_for_ros_publication` | 0.001 s |
| PASS | WH-ENGINE-007 | pytest | `unit.test_engine.test_same_seed_and_inputs_produce_exactly_repeatable_trace` | 0.010 s |
| PASS | WH-ENGINE-008 | pytest | `unit.test_engine.test_event_drain_is_incremental_for_ros_event_publication` | 0.002 s |
| PASS | WH-SCALE-UNIT-001 | pytest | `unit.test_engine.test_supported_fleet_sizes_select_a_stable_vehicle_prefix[1-expected_vehicle_ids0]` | 0.001 s |
| PASS | WH-SCALE-UNIT-001 | pytest | `unit.test_engine.test_supported_fleet_sizes_select_a_stable_vehicle_prefix[2-expected_vehicle_ids1]` | 0.001 s |
| PASS | WH-SCALE-UNIT-001 | pytest | `unit.test_engine.test_supported_fleet_sizes_select_a_stable_vehicle_prefix[4-expected_vehicle_ids2]` | 0.000 s |
| PASS | WH-SCALE-UNIT-002 | pytest | `unit.test_engine.test_unsupported_fleet_size_is_rejected[0]` | 0.000 s |
| PASS | WH-SCALE-UNIT-002 | pytest | `unit.test_engine.test_unsupported_fleet_size_is_rejected[3]` | 0.000 s |
| PASS | WH-SCALE-UNIT-002 | pytest | `unit.test_engine.test_unsupported_fleet_size_is_rejected[5]` | 0.000 s |
| PASS | WH-STREAM-UNIT-003 | pytest | `unit.test_event_dedup.test_duplicate_event_id_is_applied_once` | 0.000 s |
| PASS | WH-STREAM-UNIT-004 | pytest | `unit.test_event_dedup.test_claim_is_atomic_across_competing_callbacks` | 0.002 s |
| PASS | — | pytest | `unit.test_event_dedup.test_empty_event_id_is_rejected` | 0.000 s |
| PASS | — | pytest | `unit.test_junit_to_jira.test_parses_nested_junit_and_computes_summary` | 0.001 s |
| PASS | — | pytest | `unit.test_junit_to_jira.test_markdown_is_jira_ready_and_escapes_tables` | 0.001 s |
| PASS | — | pytest | `unit.test_junit_to_jira.test_passed_report_has_no_ticket_drafts` | 0.001 s |
| PASS | — | pytest | `unit.test_junit_to_jira.test_characterization_measurements_are_visible_but_not_called_slos` | 0.001 s |
| PASS | — | pytest | `unit.test_junit_to_jira.test_raw_evidence_properties_render_as_ticket_attachments` | 0.001 s |
| PASS | — | pytest | `unit.test_junit_to_jira.test_json_summary_is_machine_readable` | 0.001 s |
| PASS | — | pytest | `unit.test_junit_to_jira.test_invalid_input_has_actionable_error[not xml-Invalid JUnit XML]` | 0.001 s |
| PASS | — | pytest | `unit.test_junit_to_jira.test_invalid_input_has_actionable_error[<robot/>-Unsupported JUnit root]` | 0.001 s |
| PASS | — | pytest | `unit.test_junit_to_jira.test_missing_input_has_actionable_error` | 0.000 s |
| PASS | — | pytest | `unit.test_junit_to_jira.test_very_large_trace_is_bounded_for_jira_but_keeps_both_ends` | 0.001 s |
| PASS | — | pytest | `unit.test_junit_to_jira.test_all_skipped_run_is_not_reported_as_a_pass` | 0.001 s |
| PASS | WH-SCHEMA-001 | pytest | `unit.test_metrics_schema.test_current_metrics_document_round_trips` | 0.001 s |
| PASS | WH-SCHEMA-001 | pytest | `unit.test_metrics_schema.test_older_document_gets_defaults_and_additive_field_is_preserved` | 0.000 s |
| PASS | WH-SCHEMA-001 | pytest | `unit.test_metrics_schema.test_malformed_or_wrong_type_metrics_fail_actionably[not json-invalid warehouse metrics JSON]` | 0.001 s |
| PASS | WH-SCHEMA-001 | pytest | `unit.test_metrics_schema.test_malformed_or_wrong_type_metrics_fail_actionably[[]-must be a JSON object]` | 0.001 s |
| PASS | WH-SCHEMA-001 | pytest | `unit.test_metrics_schema.test_malformed_or_wrong_type_metrics_fail_actionably[{"schema_version": 1}-missing required field 'scenario']` | 0.000 s |
| PASS | WH-SCHEMA-001 | pytest | `unit.test_metrics_schema.test_malformed_or_wrong_type_metrics_fail_actionably[{"schema_version": 1, "scenario": "empty", "simulation_time_sec": "soon", "completed_orders": 0, "palletized_items": 0, "throughput_items_per_min": 0.0, "emergency_stop": false}-simulation_time_sec.*number]` | 0.000 s |
| PASS | WH-SCHEMA-001 | pytest | `unit.test_metrics_schema.test_malformed_or_wrong_type_metrics_fail_actionably[{"schema_version": true, "scenario": "empty", "simulation_time_sec": 0.0, "completed_orders": 0, "palletized_items": 0, "throughput_items_per_min": 0.0, "emergency_stop": false}-schema_version.*int]` | 0.001 s |
| PASS | WH-UNIT-MODEL-001 | pytest | `unit.test_models.test_pose_moves_towards_target_without_overshooting` | 0.001 s |
| PASS | WH-UNIT-MODEL-002 | pytest | `unit.test_models.test_pose_negative_motion_is_a_safe_noop` | 0.000 s |
| PASS | WH-UNIT-MODEL-003 | pytest | `unit.test_models.test_yaw_quaternion_is_normalized` | 0.000 s |
| PASS | WH-UNIT-MODEL-004 | pytest | `unit.test_models.test_order_derived_counts_track_completed_cases` | 0.000 s |
| PASS | WH-UNIT-PALLET-001 | pytest | `unit.test_pallet_pattern.test_first_layer_has_six_unique_balanced_carton_positions` | 0.000 s |
| PASS | WH-UNIT-PALLET-002 | pytest | `unit.test_pallet_pattern.test_second_layer_is_raised_and_rotated_for_interlock` | 0.000 s |
| PASS | WH-UNIT-PALLET-003 | pytest | `unit.test_pallet_pattern.test_negative_pallet_index_is_rejected[placement]` | 0.001 s |
| PASS | WH-UNIT-PALLET-003 | pytest | `unit.test_pallet_pattern.test_negative_pallet_index_is_rejected[layer_for]` | 0.000 s |
| PASS | WH-ROUTE-UNIT-001 | pytest | `unit.test_routing.test_straight_aisle_route_reaches_exact_requested_pose` | 0.000 s |
| PASS | WH-ROUTE-UNIT-002 | pytest | `unit.test_routing.test_route_detours_around_blocked_aisle_with_vehicle_clearance` | 0.001 s |
| PASS | WH-ROUTE-UNIT-003 | pytest | `unit.test_routing.test_route_is_deterministic_for_repeatable_failure_reproduction` | 0.002 s |
| PASS | WH-ROUTE-UNIT-004 | pytest | `unit.test_routing.test_obstructed_route_endpoints_fail_with_context[start0-goal0-start]` | 0.001 s |
| PASS | WH-ROUTE-UNIT-004 | pytest | `unit.test_routing.test_obstructed_route_endpoints_fail_with_context[start1-goal1-goal]` | 0.001 s |
| PASS | WH-ROUTE-UNIT-005 | pytest | `unit.test_routing.test_fully_dividing_barrier_reports_no_route` | 0.001 s |
| PASS | WH-ROUTE-UNIT-006 | pytest | `unit.test_routing.test_invalid_grid_resolution_is_rejected` | 0.000 s |
| PASS | WH-UNIT-SCENARIO-001 | pytest | `unit.test_scenarios.test_each_scenario_is_populated_and_has_complete_topology[mixed_wave]` | 0.001 s |
| PASS | WH-UNIT-SCENARIO-001 | pytest | `unit.test_scenarios.test_each_scenario_is_populated_and_has_complete_topology[surge_wave]` | 0.000 s |
| PASS | WH-UNIT-SCENARIO-001 | pytest | `unit.test_scenarios.test_each_scenario_is_populated_and_has_complete_topology[fault_recovery]` | 0.000 s |
| PASS | WH-UNIT-SCENARIO-001 | pytest | `unit.test_scenarios.test_each_scenario_is_populated_and_has_complete_topology[empty]` | 0.000 s |
| PASS | WH-UNIT-SCENARIO-002 | pytest | `unit.test_scenarios.test_scenario_builds_are_independent_for_test_isolation` | 0.000 s |
| PASS | WH-UNIT-SCENARIO-003 | pytest | `unit.test_scenarios.test_unknown_scenario_reports_available_choices` | 0.000 s |
| PASS | WH-DIST-UNIT-001 | pytest | `unit.test_state_store.test_identical_request_is_replayed_without_duplicate_business_effect` | 0.003 s |
| PASS | WH-DIST-UNIT-002 | pytest | `unit.test_state_store.test_reused_idempotency_key_with_different_content_is_a_conflict` | 0.004 s |
| PASS | WH-RESTART-UNIT-001 | pytest | `unit.test_state_store.test_sqlite_checkpoint_restores_in_flight_work_and_completes_once` | 0.040 s |
| PASS | WH-STREAM-UNIT-001 | pytest | `unit.test_state_store.test_event_outbox_is_ordered_replayable_and_marked_after_publication` | 0.032 s |
| PASS | WH-STREAM-UNIT-002 | pytest | `unit.test_state_store.test_order_events_form_a_correlated_causation_chain_across_restart` | 0.031 s |
| PASS | WH-SCALE-UNIT-003 | pytest | `unit.test_state_store.test_checkpoint_restores_the_configured_fleet_size` | 0.080 s |

## Characterization measurements

These values are test observations under the recorded environment, not production SLOs.

| Scenario | Test | Metric | Value |
| --- | --- | --- | ---: |
| WH-SCALE-001 | `integration.test_fleet_scalability.test_surge_wave_characterizes_fleet_scaling_and_picker_saturation` | deterministic_repeats_per_fleet | 5 |
| WH-SCALE-001 | `integration.test_fleet_scalability.test_surge_wave_characterizes_fleet_scaling_and_picker_saturation` | fleet_1_cycle_median_sec | 217.25 |
| WH-SCALE-001 | `integration.test_fleet_scalability.test_surge_wave_characterizes_fleet_scaling_and_picker_saturation` | fleet_2_cycle_median_sec | 116.1 |
| WH-SCALE-001 | `integration.test_fleet_scalability.test_surge_wave_characterizes_fleet_scaling_and_picker_saturation` | fleet_4_cycle_median_sec | 115.6 |
| WH-SCALE-001 | `integration.test_fleet_scalability.test_surge_wave_characterizes_fleet_scaling_and_picker_saturation` | fleet_1_throughput_median_items_per_min | 3.314 |
| WH-SCALE-001 | `integration.test_fleet_scalability.test_surge_wave_characterizes_fleet_scaling_and_picker_saturation` | fleet_2_throughput_median_items_per_min | 6.202 |
| WH-SCALE-001 | `integration.test_fleet_scalability.test_surge_wave_characterizes_fleet_scaling_and_picker_saturation` | fleet_4_throughput_median_items_per_min | 6.228 |
| WH-SCALE-001 | `integration.test_fleet_scalability.test_surge_wave_characterizes_fleet_scaling_and_picker_saturation` | one_to_two_cycle_reduction_percent | 46.559 |
| WH-SCALE-001 | `integration.test_fleet_scalability.test_surge_wave_characterizes_fleet_scaling_and_picker_saturation` | two_to_four_cycle_reduction_percent | 0.431 |
| WH-PERF-001 | `integration.test_performance_characterization.test_seeded_wave_records_non_gating_percentile_baseline` | sample_count | 10 |
| WH-PERF-001 | `integration.test_performance_characterization.test_seeded_wave_records_non_gating_percentile_baseline` | wall_p50_ms | 54.449 |
| WH-PERF-001 | `integration.test_performance_characterization.test_seeded_wave_records_non_gating_percentile_baseline` | wall_p95_ms | 55.692 |
| WH-PERF-001 | `integration.test_performance_characterization.test_seeded_wave_records_non_gating_percentile_baseline` | wall_p99_ms | 55.692 |
| WH-PERF-001 | `integration.test_performance_characterization.test_seeded_wave_records_non_gating_percentile_baseline` | cycle_p95_sec | 115.6 |
| WH-PERF-001 | `integration.test_performance_characterization.test_seeded_wave_records_non_gating_percentile_baseline` | throughput_p50_items_per_min | 6.228 |
| WH-PERF-001 | `integration.test_performance_characterization.test_seeded_wave_records_non_gating_percentile_baseline` | failure_rate | 0.0 |
| WH-NETEM-001 | `system.test_netem_packet_faults.test_udp_packets_receive_real_latency_loss_timeout_and_partition` | packet_latency_round_trip_sec | 0.374048 |
| WH-NETEM-001 | `system.test_netem_packet_faults.test_udp_packets_receive_real_latency_loss_timeout_and_partition` | packet_timeout_deadline_sec | 0.45 |
| WH-NET-001 | `system.test_network_fault_relay.test_latency_is_injected_before_the_authoritative_call` | rpc_latency_sec | 0.36700899101560935 |
| WH-NET-002 | `system.test_network_fault_relay.test_timeout_after_commit_has_unknown_outcome_and_retry_is_idempotent` | client_deadline_sec | 0.2 |
| WH-NET-002 | `system.test_network_fault_relay.test_timeout_after_commit_has_unknown_outcome_and_retry_is_idempotent` | deadline_observation_sec | 0.21656331297708675 |
| WH-NET-002 | `system.test_network_fault_relay.test_timeout_after_commit_has_unknown_outcome_and_retry_is_idempotent` | authoritative_order_count | 1 |
| WH-NET-003 | `system.test_network_fault_relay.test_drop_and_partition_do_not_commit_and_recovery_accepts_retry` | pre_forward_drop_commits | 0 |
| WH-NET-003 | `system.test_network_fault_relay.test_drop_and_partition_do_not_commit_and_recovery_accepts_retry` | partition_commits_before_recovery | 0 |
| WH-NET-003 | `system.test_network_fault_relay.test_drop_and_partition_do_not_commit_and_recovery_accepts_retry` | recovery_retry_commits | 1 |

## Evidence attachments

These paths identify raw artifacts captured by executable scenarios. Attach or link them with the JIRA ticket when sharing the report.

| Scenario | Test | Evidence | Path |
| --- | --- | --- | --- |
| WH-OBS-GDB-001 | `system.test_gdb_observability.test_gdb_captures_ros_python_and_dds_full_thread_stacks` | gdb full stack | `/home/natebiddle/Desktop/ROS2WarehouseCell/artifacts/final-validation-wave2/gdb-cell-controller-full-stack.txt` |
| WH-NETEM-001 | `system.test_netem_packet_faults.test_udp_packets_receive_real_latency_loss_timeout_and_partition` | netem json | `/home/natebiddle/Desktop/ROS2WarehouseCell/artifacts/final-validation-wave2/netem-evidence.json` |

## Failure analysis and JIRA ticket drafts

No failed or errored test cases were reported.

## Attached artifacts checklist

- [ ] JUnit XML
- [ ] ROS 2 and Gazebo logs
- [ ] Screenshot or screen recording (visual run)
- [ ] GDB backtrace or core dump (debug run)
- [ ] Relevant order/scenario input
