diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index b06abc52..ecfa84f0 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -253,3 +253,27 @@ jobs: - name: Tear down local stack if: always() run: docker compose -f docker-compose.yml -f .github/docker-compose.ci.yml down -v + + release-manager-gate: + name: Release Manager gate + runs-on: [self-hosted, Linux, X64, default] + needs: [php, edge-agent, edge-broker, edge-gateway-backend] + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + + steps: + - name: Record Release Manager API gate + run: | + set -euo pipefail + test -n "$RELEASE_MANAGER_GATE_TOKEN" || (echo "RELEASE_MANAGER_GATE_TOKEN is required" >&2; exit 1) + curl --fail --show-error --silent \ + -X POST "$RELEASE_MANAGER_GATE_URL" \ + -H "Authorization: Bearer $RELEASE_MANAGER_GATE_TOKEN" \ + -H "Content-Type: application/json" \ + --data "{\"channel_slug\":\"stable\",\"app\":\"api\",\"repository\":\"$RELEASE_REPOSITORY\",\"branch\":\"$RELEASE_BRANCH\",\"expected_commit\":\"$RELEASE_EXPECTED_COMMIT\",\"workflow_url\":\"$RELEASE_WORKFLOW_URL\",\"auto_sync\":true,\"wait_timeout_seconds\":300,\"poll_interval_seconds\":10,\"required_checks\":[]}" + env: + RELEASE_MANAGER_GATE_URL: ${{ secrets.RELEASE_MANAGER_GATE_URL || 'https://api.truckwash.io/release/gate/test-runs' }} + RELEASE_MANAGER_GATE_TOKEN: ${{ secrets.RELEASE_MANAGER_GATE_TOKEN }} + RELEASE_REPOSITORY: ${{ github.repository }} + RELEASE_BRANCH: ${{ github.ref_name }} + RELEASE_EXPECTED_COMMIT: ${{ github.sha }} + RELEASE_WORKFLOW_URL: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} diff --git a/services/nginx/app/.phpunit.cache/test-results b/services/nginx/app/.phpunit.cache/test-results index ea9e0da3..d5dc3f50 100644 --- a/services/nginx/app/.phpunit.cache/test-results +++ b/services/nginx/app/.phpunit.cache/test-results @@ -1 +1 @@ -{"version":"pest_3.8.6","defects":{"P\\Tests\\Unit\\Selfserve\\SelfserveOpenApiSpecTest::__pest_evaluable_it_documents_self_serve_machine_type__eligibility__summary__and_webhook_endpoints":1,"P\\Tests\\Unit\\Selfserve\\SelfserveOpenApiSpecTest::__pest_evaluable_it_defines_reusable_self_serve_wash_and_machine_type_schemas":1,"P\\Tests\\Unit\\Invoicing\\EconomicV2BookedDepartment75DistributionTest::__pest_evaluable_it_redistributes_booked_department_75_net_amounts_using_fixed_pricing_and_wash_subscription_weights":7,"P\\Tests\\Unit\\Invoicing\\EconomicV2BookedDepartment75DistributionTest::__pest_evaluable_it_keeps_classified_booked_department_75_amounts_undistributed_when_no_monthly_basis_exists":8,"P\\Tests\\Unit\\Invoicing\\EconomicV2BookedDepartment75DistributionTest::__pest_evaluable_it_keeps_unclassified_booked_department_75_lines_undistributed_with_warnings":8,"P\\Tests\\Unit\\Invoicing\\EconomicV2OpenApiSpecTest::__pest_evaluable_it_documents_v2_historical_distribution_and_pricing_history_paths_in_openapi":1,"P\\Tests\\Unit\\Invoicing\\EconomicV2OpenApiSpecTest::__pest_evaluable_it_defines_new_reusable_v2_schemas_for_normalization_comparison_versioning_and_distribution":1,"P\\Tests\\Unit\\Invoicing\\EconomicV2BookedDepartment75DistributionTest::__pest_evaluable_it_supports_bulk_booked_invoice_line_payloads_with_top_level_department_numbers":7,"P\\Tests\\Unit\\Redis\\RedisAtomicReservationTest::__pest_evaluable_it_claims_a_slot_atomically_with_nx_and_expiration":8,"P\\Tests\\Unit\\Redis\\RedisAtomicReservationTest::__pest_evaluable_it_returns_false_when_the_slot_is_already_claimed_and_clamps_ttl_to_one_second":8,"P\\Tests\\Unit\\Invoicing\\EconomicV2OpenApiSpecTest::__pest_evaluable_it_documents_economic_v2_invoice_paths_in_openapi":1,"P\\Tests\\Unit\\Invoicing\\EconomicV2OpenApiSpecTest::__pest_evaluable_it_aligns_legacy_compare_schema_with_runtime_payload_by_removing_stale_required_order__ids":1,"P\\Tests\\Unit\\Search\\SystemSearchEntityTypeCoverageTest::__pest_evaluable_it_documents_every_supported_search_entity_type_in_openapi_enum":1,"P\\Tests\\Unit\\Search\\SystemSearchOpenApiSpecTest::__pest_evaluable_it_documents_system_wide_search_endpoints_in_openapi":1,"P\\Tests\\Unit\\Search\\SystemSearchOpenApiSpecTest::__pest_evaluable_it_documents_debug__intent_and_parser_metadata_schema_in_openapi":1,"P\\Tests\\Unit\\Search\\SystemSearchOpenApiSpecTest::__pest_evaluable_it_documents_e_conomic_indexed_customer_matching_and_synonym_behavior":1,"P\\Tests\\Integration\\Database\\DbConnectionTest::__pest_evaluable_it_can_connect_to_a_configured_MySQL_instance_in_integration_mode":1,"P\\Tests\\Integration\\Invoicing\\EconomicV2BackfillAndDistributionIntegrationTest::__pest_evaluable_it_runs_best_effort_backfill_repeatedly_without_introducing_duplicate_same_start_rows":1,"P\\Tests\\Integration\\Invoicing\\EconomicV2BackfillAndDistributionIntegrationTest::__pest_evaluable_it_resolves_version_aware_distribution_payload_shapes_over_a_real_date_range":1,"P\\Tests\\Integration\\Invoicing\\EconomicV2VersioningServiceIntegrationTest::__pest_evaluable_it_creates_closes_and_rotates_fixed_pricing_versions_without_overlap":1,"P\\Tests\\Integration\\Invoicing\\EconomicV2VersioningServiceIntegrationTest::__pest_evaluable_it_tracks_vehicle_and_discount_version_lifecycles_with_closure_semantics":1,"P\\Tests\\Integration\\Permissions\\LegacyPermissionRedisCacheScriptTest::__pest_evaluable_it_keeps_legacy_route_permission_redis_cache_script_green":1,"P\\Tests\\Unit\\Goals\\GoalsOpenApiSpecTest::__pest_evaluable_it_documents_advanced_goals_target_duration_fields_in_openapi":1,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTimelineSchemaConformanceTest::__pest_evaluable_it_documents_the_date_key_in_the_openapi_department_weather_timeline_schema":1,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherFallbackBehaviorTest::__pest_evaluable_it_builds_timeline_entries_with_mostly__clear_weather_when_forecast_payload_is_empty":8,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherFallbackBehaviorTest::__pest_evaluable_it_wires_departments_weather_route_through_the_forecast_fallback_path":7,"P\\Tests\\Unit\\Orders\\AttachmentsListManyTest::__pest_evaluable_it_groups_attachments_by_object_id_and_preserves_empty_object_groups":8,"P\\Tests\\Unit\\Orders\\AttachmentsListManyTest::__pest_evaluable_it_keeps_listMany_payload_parity_with_list_for_one_object_id":8,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTargetsOpenApiSpecTest::__pest_evaluable_it_documents_department_weather_target_endpoints_and_reusable_schemas_in_openapi":1,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTargetsOpenApiSpecTest::__pest_evaluable_it_documents_unknown_weather_status_behavior_when_targets_are_missing":1,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_respects_the_1_request_per_second_Shelly_gate_for_back_to_back_requests":8,"P\\Tests\\Unit\\Selfserve\\SelfserveOpenApiSpecTest::__pest_evaluable_it_documents_in_progress_self_serve_wash_start_and_machine_relay_fields":1,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_stores_config_json_with_apostrophes_without_violating_json_constraints":8,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_adds_vehicle_type_product_on_STOP_when_program_selector_is_on__then_turns_off_cleaner_machine_and_selector_relays":7,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_skips_vehicle_type_product_add_when_program_selector_is_off_and_only_disables_configured_relays":7,"P\\Tests\\Unit\\Selfserve\\SelfserveOpenApiSpecTest::__pest_evaluable_it_documents_self_serve_machine_wash_included_minutes_in_config_schemas":1,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_fails_fast_when_workspace_id_is_missing_for_gate_calls":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_fails_fast_when_channel_id_is_missing_for_gate_calls":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_fails_with_terminal_status_details_when_call_never_reaches_accepted_state":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_hangs_up_when_call_reaches_accepted_state":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_hangs_up_immediately_when_status_transitions_to_accepted":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_maps_legacy_timeout_option_to_documented_ringTimeout_payload_field":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_clamps_derived_ringTimeout_to_Bird_documented_max_when_gate_timeout_is_high":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_passes_documented_hangup_cause_when_provided":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_drops_unsupported_hangup_cause_values_from_request_payload":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_fails_fast_when_workspace_id_is_missing_for_gate_flash_calls":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_creates_gate_flash_call_with_documented_ringTimeout_payload":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_polls_flash_call_and_succeeds_once_accepted":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_fails_flash_gate_flow_when_terminal_failure_status_is_returned":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_does_not_fallback_to_regular_gate_call_when_flash_succeeds":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_falls_back_to_regular_gate_call_when_flash_fails":8,"P\\Tests\\Unit\\Selfserve\\SelfserveOpenApiSpecTest::__pest_evaluable_it_documents_property_gate_lane_commands_and_sanitized_gate_failure_responses":1,"P\\Tests\\Unit\\Bird\\BirdModuleClientMappingTest::__pest_evaluable_it_returns_raw_payload_for_malformed_JSON_responses_and_null_for_empty_responses":8,"P\\Tests\\Unit\\Bird\\BirdRouteWiringTest::__pest_evaluable_it_keeps_Bird_number_and_webhook_routes_intact":7,"P\\Tests\\Unit\\Bird\\BirdModuleClientMappingTest::__pest_evaluable_it_handles_malformed_and_empty_response_bodies_without_throwing_transport_errors":8,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherStatusTargetsTest::__pest_evaluable_it_aggregates_multi_department_slot_statuses_using_worst_severity_and_unknown_fallback_rules":7,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_adds_vehicle_type_product_on_STOP_when_program_selector_relay_is_online__then_turns_off_cleaner_and_machine_relays":7,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_bills_primary_product_when_selector_relay_is_online_even_if_relay_output_is_off":7,"P\\Tests\\Unit\\Bird\\BirdOpenApiSpecTest::__pest_evaluable_it_documents_all_Bird_voice_call_parity_endpoints_including_gather_recordings_insights_and_log":1,"P\\Tests\\Unit\\Bird\\BirdOpenApiSpecTest::__pest_evaluable_it_documents_flash_hangup_endpoint_and_marks_end_alias_as_deprecated":1,"P\\Tests\\Unit\\Bird\\BirdOpenApiSpecTest::__pest_evaluable_it_defines_request_and_response_schemas_for_Bird_call_command_recording_insight_log_and_flash_payloads":1,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueRouteRegistrationTest::__pest_evaluable_it_registers_collected_invoice_queue_endpoints_in_orderInvoicesRoute":7,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_uses_a_consistent_unavailable_service_contract_for_missing_queue_dependencies":7,"P\\Tests\\Unit\\Invoicing\\EconomicTransferOrderItemSkipTest::__pest_evaluable_it_wires_zero_cost_and_zero_quantity_skip_guard_into_transfer_line_builder":7,"P\\Tests\\Integration\\Invoicing\\EconomicTransferQueueIntegrationTest::__pest_evaluable_it_processes_queued_transfer_jobs_to_completion":1,"P\\Tests\\Integration\\Invoicing\\EconomicTransferQueueIntegrationTest::__pest_evaluable_it_deduplicates_active_jobs_per_transfer_target":1,"P\\Tests\\Integration\\Invoicing\\EconomicTransferQueueIntegrationTest::__pest_evaluable_it_rejects_invalid_payloads_without_inserting_queue_rows":1,"P\\Tests\\Integration\\Invoicing\\EconomicTransferQueueIntegrationTest::__pest_evaluable_it_supports_fail_retry_and_reprocess_lifecycle_transitions":1,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_supports_synchronous_fallback_branches_before_queue_enqueue_on_economic_invoice_export_routes":7,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_keeps_queue_status_endpoints_guarded_while_collected_invoice_export_routes_support_synchronous_fallback":7,"P\\Tests\\Unit\\Invoicing\\UserCollectedInvoiceUpdateRouteValidationTest::__pest_evaluable_it_supports_independent_po__number_and_closed__at_updates_for_PUT__collected_invoices_in_user_route":7,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueRouteHardeningTest::__pest_evaluable_it_returns_pagination_metadata_and_strict_status_handling_for_collected_invoice_queue_list":7,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueRouteHardeningTest::__pest_evaluable_it_enforces_retry_constraints_for_collected_invoice_queue_jobs_before_retry_execution":7,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueOpenApiSpecTest::__pest_evaluable_it_documents_collected_queue_list_metadata_and_strict_status_filter_enum_in_openapi":7,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueDetailsSummaryBuilderTest::__pest_evaluable_it_builds_a_completed_collected_invoice_queue_summary_from_payload_and_result":8,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueDetailsSummaryBuilderTest::__pest_evaluable_it_prefers_queue_error_messages_for_failed_jobs_and_keeps_null_safe_outcome_fields":8,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueDetailsSummaryBuilderTest::__pest_evaluable_it_uses_deterministic_status_message_fallback_when_no_explicit_message_exists":8,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueDetailsSummaryBuilderTest::__pest_evaluable_it_handles_object_payload_result_values_and_malformed_fields_without_throwing":8,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueWorkerTickRouteTest::__pest_evaluable_it_ticks_collected_invoice_transfer_queue_from_queue_list_and_status_routes":7,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueWorkerTickRouteTest::__pest_evaluable_it_ticks_order_transfer_queue_from_draft_and_invoice_status_routes":7,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayUpdateLifecycleTest::__pest_evaluable_it_builds_the_installer_around_the_PHP_agent_artifacts_and_management_polling_config":8,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayUpdateLifecycleTest::__pest_evaluable_it_exposes_update_payload__credential_rotation__and_operation_endpoints_without_shell_transport_wiring":8,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerHeartbeatStatusTest::__pest_evaluable_it_derives_relay_fallback_and_transport_health_details_without_shell_or_update_runtime_state":7,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_resolves_edge_agent_artifacts_from_the_source_tree_layout":7,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_prioritizes_mounted_and_baked_in_artifact_directories_before_repo_fallbacks":7,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_prioritizes_router_resources_before_mounted_and_baked_in_artifact_directories":7,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_lists_orders_for_an_admin_scoped_user_and_limits_the_results_to_the_permitted_departments":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_lists_only_the_targeted_customer_orders_for_subuser_sessions":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_returns_the_current_auth_and_permission_failures_when_order_listing_is_not_allowed":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_creates_orders_through_the_real_endpoint":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_rejects_invalid_order_creation_requests":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_updates_orders_through_the_primary_endpoint":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_reassigns_invoice_collections_when_changing_an_order_across_the_draft_customer_boundary":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_supports_legacy_field_value_metadata_updates_through_the_primary_endpoint":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_rejects_invalid_updates_through_the_primary_order_endpoint":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_updates_orders_through_the_legacy_alias_endpoint":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_supports_legacy_field_value_metadata_updates_through_the_alias_endpoint":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_rejects_invalid_updates_through_the_legacy_alias_endpoint":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_rejects_unsupported_legacy_field_value_updates_on_both_update_endpoints":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_deletes_orders_through_the_real_endpoint":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_rejects_invalid_order_delete_requests":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_regenerates_attached_wash_certificates_when_certificate_metadata_changes_through_the_primary_endpoint":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_regenerates_attached_wash_certificates_for_legacy_field_value_updates_through_the_alias_endpoint":8,"P\\Tests\\Api\\ApiCoverageManifestTest::__pest_evaluable_it_keeps_every_selected_API_operation_covered_by_happy_path_and_failure_tests":8,"P\\Tests\\Api\\ApiCoverageManifestTest::__pest_evaluable_it_keeps_the_OpenAPI_manifest_entries_aligned_with_the_API_spec":8,"P\\Tests\\Api\\ApiFixturesCleanupTest::__pest_evaluable_it_removes_generated_customer_traces_during_fixture_cleanup":8,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_logs_in_with_valid_customer_credentials":8,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_rejects_invalid_login_payloads_and_credentials":8,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_returns_the_cached_auth_session_payload_for_a_valid_token":8,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_includes_economic_runtime_config_for_uncached_auth_sessions":8,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_rejects_invalid_auth_session_tokens":8,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_logs_out_and_invalidates_the_token_for_future_session_calls":8,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_logs_out_and_invalidates_cached_subuser_sessions":8,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_rejects_invalid_logout_tokens":8,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_returns_the_raw_202_gather_webhook_contract_over_HTTP":8,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_still_prompts_for_department_selection_when_only_one_department_is_eligible":8,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_accepts_the_legacy_initial_webhook_body_with_top_level_call_identifiers":8,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_returns_native_flow_gather_data_after_a_top_level_department_selection_when_distinct_gate_choices_exist":8,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_opens_the_gate_immediately_after_a_top_level_department_selection_when_entrance_and_exit_share_the_same_gate":8,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_uses_a_multi_digit_gather_contract_when_10_departments_are_eligible":8,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_returns_a_raw_400_transport_error_for_malformed_webhook_payloads":8,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_lists_only_visible_departments_and_can_return_a_single_department_with_the_slack_webhook":8,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_rejects_department_listing_when_the_permission_is_missing":8,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_creates_departments_through_the_real_endpoint":8,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_rejects_invalid_department_create_requests":8,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_updates_departments_through_the_real_endpoint":8,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_rejects_invalid_department_update_requests":8,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_lists_department_categories_for_a_department":8,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_rejects_invalid_department_category_requests":8,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_lists_the_draft_customer_config_entry_in_economic_config_responses":8,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_round_trips_the_draft_customer_config_value_through_economic_config_updates":8,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_rejects_order_draft_exports_for_the_configured_draft_customer":8,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_rejects_booked_invoice_exports_for_the_configured_draft_customer":8,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_rejects_collected_invoice_exports_for_the_configured_draft_customer":8,"P\\Tests\\Api\\PingApiTest::__pest_evaluable_it_returns_the_ping_contract":8,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_returns_a_setup_required_error_when_department_terminal_readers_are_requested_without_terminal_setup":8,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_sends_a_Stripe_invoice_by_email_and_persists_the_hosted_invoice_association":8,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_returns_a_conflict_when_a_Stripe_hosted_invoice_is_already_active_for_the_order":8,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_allows_sending_a_new_Stripe_hosted_invoice_when_the_existing_association_is_already_terminal":8,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_voids_an_unpaid_Stripe_hosted_invoice_and_clears_the_local_order_association":8,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_refuses_to_cancel_a_paid_Stripe_hosted_invoice":8,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_returns_a_setup_required_error_when_creating_a_payment_intent_for_a_department_without_terminal_setup":8,"P\\Tests\\Api\\VehiclesApiTest::__pest_evaluable_it_returns_the_newest_vehicle_last__order__id_that_still_has_order_items":8,"P\\Tests\\Api\\VehiclesApiTest::__pest_evaluable_it_returns_a_null_vehicle_last__order__id_when_no_order_with_items_exists":8,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayViewCacheTest::__pest_evaluable_it_syncs_gateway_snapshots_into_cached_list_payloads_and_refreshes_fleet_usage":7,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayModuleRouteWiringTest::__pest_evaluable_it_keeps_only_the_module_facade_in_the_global_classes_directory_and_conditionally_loads_module_routes":7,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_builds_install_script_urls_with_the_compose_edge_gateway_artifacts_and_forwarded_https_scheme":8,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayUpdateLifecycleTest::__pest_evaluable_it_builds_the_installer_around_the_compose_stack_artifacts_and_management_polling_config":7,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayUpdateLifecycleTest::__pest_evaluable_it_exposes_update_payload__credential_rotation__cancel_endpoints__and_operation_endpoints_without_shell_transport_wiring":7,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayRouteWiringTest::__pest_evaluable_it_registers_the_v2_operator_facing_edge_gateway_routes":7,"P\\Tests\\Unit\\Selfserve\\EdgeGatewaySchemaBootstrapTest::__pest_evaluable_it_defines_the_v2_edge_gateway_schema_bootstrap_tables":7,"P\\Tests\\Unit\\Selfserve\\EdgeGatewaySchemaBootstrapTest::__pest_evaluable_it_stores_operation_metadata_and_event_timelines_for_management_workflows":7,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_prefers_EDGE__PUBLIC__API__URL_when_explicitly_configured":8,"P\\Tests\\Api\\PlateScannersApiTest::__pest_evaluable_it_returns_the_updated_lane_id_after_editing_a_scanner_whose_null_lane_was_already_cached":8,"P\\Tests\\Api\\EdgeGatewayAgentApiTest::__pest_evaluable_it_serves_installer_artifacts_and_recovers_gateway_runtime_status_after_fresh_heartbeats":8,"P\\Tests\\Api\\EdgeGatewayAgentApiTest::__pest_evaluable_it_polls_operations_and_commands__submits_results__and_records_broker_presence_for_task_pages":8,"P\\Tests\\Api\\EdgeGatewayBrokerApiTest::__pest_evaluable_it_builds_broker_backlog_and_completes_gateway_operations_through_broker_endpoints":8,"P\\Tests\\Api\\EdgeGatewayOperatorApiTest::__pest_evaluable_it_creates_install_tokens__tracks_installer_status__and_exposes_claimed_gateway_detail_to_authorized_operators":8,"P\\Tests\\Api\\EdgeGatewayOperatorApiTest::__pest_evaluable_it_manages_edge_gateway_metadata__bindings__operations__sessions__rotation__cutover__and_deletion":8,"P\\Tests\\Integration\\EdgeGateway\\EdgeGatewayBackendIntegrationTest::__pest_evaluable_it_assembles_tasks__logs__statistics__operations__commands__and_shell_lifecycle_state_from_persisted_records":1,"P\\Tests\\Api\\EdgeGatewayBrokerApiTest::__pest_evaluable_it_rejects_invalid_edge_broker_shared_secrets":8,"P\\Tests\\Api\\EdgeGatewayOperatorApiTest::__pest_evaluable_it_rejects_operator_edge_routes_when_module_permission_or_department_access_is_missing":8,"P\\Tests\\Api\\EdgeGatewayAgentApiTest::__pest_evaluable_it_rejects_missing_and_invalid_edge_agent_tokens":8,"P\\Tests\\Integration\\EdgeGateway\\EdgeGatewayBackendIntegrationTest::__pest_evaluable_it_persists_gateway_cutover_relay_bindings_used_by_self_serve_Shelly_dispatch":1,"P\\Tests\\Api\\EdgeGatewayBrokerApiTest::__pest_evaluable_it_validates_broker_sessions_and_ingests_presence__telemetry__logs__and_shell_lifecycle_data":8,"P\\Tests\\Api\\EdgeGatewayBrokerApiTest::__pest_evaluable_it_rejects_shell_session_creation_while_broker_presence_is_unavailable":8,"P\\Tests\\Api\\EdgeGatewayOperatorApiTest::__pest_evaluable_it_ignores_and_soft_deletes_edge_gateways_whose_department_no_longer_exists":8,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_appends_forwarded_ports_when_the_forwarded_host_omits_them":8,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_builds_websocket_broker_urls_on_the_traefik_broker_path":8,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_builds_localhost_websocket_broker_urls_on_the_local_traefik_api_prefix":8,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_keeps_root_host_api_urls_unprefixed_when_the_request_is_not_under_the_local_api_alias":8,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_resolves_simulator_gateway_service_bindings_from_lane_relay_slots":7,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_counts_overtime_minutes_when_a_saved_shift_end_extends_past_the_approved_original_end":7,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_counts_unapproved_overtime_from_a_bounded_shift_updateTime_fallback":7,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_caps_current_slot_hours_to_elapsed_minutes_and_zeroes_future_slots":7,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_round_trips_the_default_distribution_department_config_value_through_economic_config_updates":8,"P\\Tests\\Unit\\Replication\\ReplicationSecretBoxTest::__pest_evaluable_it_encrypts_replication_secrets_without_storing_plaintext":8,"P\\Tests\\Unit\\Replication\\ReplicationSecretBoxTest::__pest_evaluable_it_builds_active_database_and_redis_config_from_encrypted_bootstrap_snapshots":8,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_does_not_require_replica_SQL_threads_before_database_provisioning_configures_them":7,"P\\Tests\\Unit\\Invoicing\\EconomicDraftCustomerOpenApiSpecTest::__pest_evaluable_it_documents_transaction_draft_customer_config_and_auth_runtime_fields_in_all_tracked_openapi_copies":1,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_computes_MinIO_free_space_and_catch_up_math_safely":7,"P\\Tests\\Integration\\DailyReports\\DepartmentDailyReportComplaintsIntegrationTest::__pest_evaluable_it_counts_complaint_rows_by_department_and_created__at_reporting_range":1,"P\\Tests\\Integration\\DailyReports\\DepartmentDailyReportComplaintsIntegrationTest::__pest_evaluable_it_updates_and_deletes_complaint_rows":1,"P\\Tests\\Integration\\DailyReports\\DepartmentDailyReportComplaintsIntegrationTest::__pest_evaluable_it_parses_created__by__name_from_the_users_table":1,"P\\Tests\\Integration\\DailyReports\\DepartmentOutsideHoursStatisticsServiceIntegrationTest::__pest_evaluable_it_integrates_orders__xlvask__and_self_serve_into_one_outside_hours_summary_with_missing_hours_diagnostics":1,"P\\Tests\\Integration\\EdgeGateway\\EdgeGatewayBackendIntegrationTest::__pest_evaluable_it_persists_install_session_updates_and_derives_gateway_runtime_status_from_heartbeats":1,"P\\Tests\\Integration\\Invoicing\\EconomicTransferQueueIntegrationTest::__pest_evaluable_it_processes_only_collected_invoice_jobs_and_respects_the_manual_batch_limit":1,"P\\Tests\\Integration\\SystemStatus\\SuperuserSystemStatusInfrastructureProbeTest::__pest_evaluable_it_can_probe_the_configured_database_in_integration_mode":1,"P\\Tests\\Integration\\SystemStatus\\SuperuserSystemStatusInfrastructureProbeTest::__pest_evaluable_it_can_probe_redis_in_integration_mode_when_configured":1,"P\\Tests\\Integration\\SystemStatus\\SuperuserSystemStatusInfrastructureProbeTest::__pest_evaluable_it_can_probe_minio_in_integration_mode_when_configured":1,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_creates_Coolify_service_payloads_from_raw_compose_without_a_service_type":7,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_uses_the_selected_Coolify_project_and_resolves_server_UUID_from_the_instance_default":8,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_creates_Coolify_GitHub_App_application_payloads_so_pulls_use_the_app_token":7,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_uses_the_self_contained_Coolify_API_Dockerfile_for_API_applications":7,"P\\Tests\\Unit\\Tooling\\ComposerEntrypointTest::__pest_evaluable_it_checks_PSR_HTTP_message_interfaces_before_trusting_a_Composer_vendor_tree":7,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_defines_release_manager_schema__routes__permissions__and_system_status_integration_hooks":7,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_requires_non_default_release_channel_runtime_URLs_and_preserves_load_balancer_paths":7,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_wires_MinIO_replication_through_routes_and_bootstrap_snapshots":7,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_defines_Coolify_schema__route_permissions__and_replication_integration_hooks":7,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_chooses_a_requested_runtime_channel_only_when_it_is_available_to_the_principal":8,"P\\Tests\\Api\\OrderBookingsCompletionApiTest::__pest_evaluable_it_rejects_standalone_order_booking_completion_outside_POS":8,"P\\Tests\\Api\\OrderBookingsCompletionApiTest::__pest_evaluable_it_allows_linked_POS_order_booking_completion_for_mobile_POS_compatibility":8,"P\\Tests\\Api\\OrderBookingsCompletionApiTest::__pest_evaluable_it_accepts_numeric_safety_seal_strings_when_completing_a_linked_POS_order_booking":8,"P\\Tests\\Api\\OrderBookingsCompletionApiTest::__pest_evaluable_it_disables_the_legacy_complete_wash_without_certificate_route":8,"P\\Tests\\Api\\OrderBookingsUpdateApiTest::__pest_evaluable_it_detaches_an_order_booking_and_clears_the_matching_order_link":8,"P\\Tests\\Api\\OrderBookingsUpdateApiTest::__pest_evaluable_it_keeps_the_linked_order_when_order__id_is_omitted_from_an_order_booking_update":8,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_allows_explicit_runtime_selection_of_any_enabled_release_channel":7,"P\\Tests\\Api\\SelfserveLaneWashInProgressApiTest::__pest_evaluable_it_requires_authentication_before_checking_in_progress_wash_permissions":8,"P\\Tests\\Api\\SelfserveLaneWashInProgressApiTest::__pest_evaluable_it_reports_both_elevated_and_customer_self_serve_permissions_when_lane_polling_is_not_allowed":8,"P\\Tests\\Api\\SelfserveLaneWashInProgressApiTest::__pest_evaluable_it_allows_customer_self_serve_permission_to_view_their_own_in_progress_wash_details":8,"P\\Tests\\Api\\SelfserveLaneWashInProgressApiTest::__pest_evaluable_it_redacts_another_customers_in_progress_wash_from_customer_self_serve_lane_polling":8,"P\\Tests\\Api\\SelfserveFixtureApiTest::__pest_evaluable_it_creates_a_comprehensive_self_serve_API_scenario_with_demo_relays":8,"P\\Tests\\Api\\SelfserveZZZShellyGuardApiTest::__pest_evaluable_it_did_not_record_any_real_Shelly_request_attempts_during_self_serve_API_tests":8,"P\\Tests\\Api\\ApiFixturesCleanupTest::__pest_evaluable_it_restores_preserved_module_config_rows_during_fixture_cleanup":8,"P\\Tests\\Api\\BrandingApiTest::__pest_evaluable_it_creates_lists_and_updates_complete_branding_values":8,"P\\Tests\\Api\\BrandingApiTest::__pest_evaluable_it_rejects_branding_requests_without_permissions_or_valid_input":8,"P\\Tests\\Api\\BrandingApiTest::__pest_evaluable_it_assigns_and_clears_department_branding_for_superusers":8,"P\\Tests\\Api\\BrandingApiTest::__pest_evaluable_it_rejects_invalid_department_branding_assignments":8,"P\\Tests\\Api\\CollectedInvoiceMonthlySplitApiTest::__pest_evaluable_it_previews_monthly_split_changes_without_moving_orders_or_creating_collections":8,"P\\Tests\\Api\\CollectedInvoiceMonthlySplitApiTest::__pest_evaluable_it_splits_a_selected_March_and_April_collected_invoice_into_monthly_collections":8,"P\\Tests\\Api\\CollectedInvoiceMonthlySplitApiTest::__pest_evaluable_it_sets_closed__at_to_month_end_when_split_month_has_ended":8,"P\\Tests\\Api\\CollectedInvoiceMonthlySplitApiTest::__pest_evaluable_it_splits_the_whole_affected_collection_even_when_only_one_month_is_selected":8,"P\\Tests\\Api\\CollectedInvoiceMonthlySplitApiTest::__pest_evaluable_it_does_not_affect_booked_collected_invoices":8,"P\\Tests\\Api\\CollectedInvoiceMonthlySplitApiTest::__pest_evaluable_it_skips_draft_linked__Stripe__and_single_month_collections":8,"P\\Tests\\Api\\CollectedInvoiceMonthlySplitApiTest::__pest_evaluable_it_rejects_invalid_monthly_split_date_ranges":8,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_allows_superusers_to_filter_archived_departments":8,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_does_not_allow_regular_department_listings_to_reveal_archived_departments_through_filters":8,"P\\Tests\\Api\\EdgeGatewayConfigApiTest::__pest_evaluable_it_stores_broker_settings_in_edge_gateway_module_config_and_uses_them_for_shell_sessions":8,"P\\Tests\\Api\\EdgeGatewayConfigApiTest::__pest_evaluable_it_returns_broker_diagnostics_for_the_current_edge_gateway_module_config_values":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_defaults_order_PO_from_a_linked_booking_when_creating_without_an_order_PO":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_keeps_an_explicit_order_PO_when_creating_a_linked_order":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_defaults_blank_order_PO_from_a_linked_booking_on_order_updates":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_requires_explicit_confirmation_before_deleting_protected_orders":8,"P\\Tests\\Api\\PlateScannersApiTest::__pest_evaluable_it_rejects_plate_scanner_edits_when_the_permission_is_missing":8,"P\\Tests\\Api\\ReferenceSuggestionsApiTest::__pest_evaluable_it_returns_ranked_POS_reference_suggestions_from_bookings__orders__and_customer_vehicles":8,"P\\Tests\\Api\\ReferenceSuggestionsApiTest::__pest_evaluable_it_orders_reference_suggestions_by_match_relevance_before_context_and_frequency":8,"P\\Tests\\Api\\ReferenceSuggestionsApiTest::__pest_evaluable_it_enforces_authentication__list_permission__and_department_access_for_reference_suggestions":8},"times":{"P\\Tests\\Unit\\Auth\\CreateTokenTest::__pest_evaluable_it_creates_a_64_char_auth_token_for_an_existing_user":0.11,"P\\Tests\\Unit\\Auth\\CreateTokenTest::__pest_evaluable_it_throws_a_clear_exception_when_customer_user_is_missing":0.017,"P\\Tests\\Unit\\Auth\\LegacyAuthScriptParityTest::__pest_evaluable_it_keeps_passkey_challenge_legacy_script_green_during_migration":0.032,"P\\Tests\\Unit\\Auth\\LegacyAuthScriptParityTest::__pest_evaluable_it_keeps_register_CVR_legacy_script_green_during_migration":0.035,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteIvrTest::__pest_evaluable_it_builds_deterministic_department_digit_map_and_caps_to_9_options":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteIvrTest::__pest_evaluable_it_resolves_department_ids_by_selected_digit":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteIvrTest::__pest_evaluable_it_resolves_gate_type_digit_to_entrance_or_exit":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteIvrTest::__pest_evaluable_it_stores__loads_and_clears_ivr_state_with_ttl":0.001,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteIvrTest::__pest_evaluable_it_validates_state_caller_fingerprint_matching":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteIvrTest::__pest_evaluable_it_builds_department_and_gate_prompts":0,"P\\Tests\\Unit\\Permissions\\PermissionNodeDefinitionTest::__pest_evaluable_it_creates_permission_nodes_linked_to_subuser_permission_keys":0,"P\\Tests\\Unit\\Permissions\\PermissionNodeDefinitionTest::__pest_evaluable_it_rejects_empty_permission_definitions":0,"P\\Tests\\Unit\\Selfserve\\NormalizationTest::__pest_evaluable_it_normalizes_button_arrays__json_and_csv_inputs":0,"P\\Tests\\Unit\\Selfserve\\NormalizationTest::__pest_evaluable_it_rejects_invalid_button_inputs":0,"P\\Tests\\Unit\\Selfserve\\NormalizationTest::__pest_evaluable_it_normalizes_vehicle_type_values_and_null_semantics":0,"P\\Tests\\Unit\\Selfserve\\NormalizationTest::__pest_evaluable_it_rejects_invalid_vehicle_type_values":0,"P\\Tests\\Unit\\Selfserve\\NormalizationTest::__pest_evaluable_it_rejects_non_numeric_vehicle_type_strings":0,"P\\Tests\\Unit\\Selfserve\\NormalizationTest::__pest_evaluable_it_keeps_lane_service_enum_contract_for_MACHINE":0,"P\\Tests\\Unit\\Subusers\\SubuserGrantInitializationTest::__pest_evaluable_it_initializes_booking_node_grants_without_DB_dependency":0,"P\\Tests\\Unit\\Subusers\\SubuserGrantInitializationTest::__pest_evaluable_it_initializes_selfserve_node_grants_without_DB_dependency":0,"P\\Tests\\Unit\\Subusers\\SubusersRoutePermissionLinkTest::__pest_evaluable_it_keeps_subusers_route_list_permission_linked_to_SUBUSERS__LIST_node":0.009,"P\\Tests\\Unit\\Search\\SystemSearchEntityTypeCoverageTest::__pest_evaluable_it_keeps_route_and_service_entity_type_registries_in_sync_with_expanded_coverage":0,"P\\Tests\\Unit\\Search\\SystemSearchEntityTypeCoverageTest::__pest_evaluable_it_documents_every_supported_search_entity_type_in_openapi_enum":0.047,"P\\Tests\\Unit\\Search\\SystemSearchEconomicCustomerIndexWiringTest::__pest_evaluable_it_wires_local_e_conomic_customer_index_into_customer_related_search_entities":0.016,"P\\Tests\\Unit\\Search\\SystemSearchEconomicCustomerIndexWiringTest::__pest_evaluable_it_registers_cron_tasks_that_keep_the_e_conomic_search_index_refreshed":0.018,"P\\Tests\\Unit\\Search\\SystemSearchInvalidationHooksTest::__pest_evaluable_it_marks_system_search_cache_dirty_from_generic_db_object_mutation_flows":0.052,"P\\Tests\\Unit\\Search\\SystemSearchInvalidationHooksTest::__pest_evaluable_it_marks_system_search_cache_dirty_from_object_property_mutations":0.01,"P\\Tests\\Unit\\Search\\SystemSearchInvalidationHooksTest::__pest_evaluable_it_marks_system_search_cache_dirty_when_module_config_values_change":0.008,"P\\Tests\\Unit\\Search\\SystemSearchInvalidationHooksTest::__pest_evaluable_it_registers_cron_maintenance_task_for_system_search_cache":0.075,"P\\Tests\\Unit\\Search\\SystemSearchOpenAiIntentParserTest::__pest_evaluable_it_redacts_obvious_sensitive_fragments_before_sending_query_to_intent_parser":0.001,"P\\Tests\\Unit\\Search\\SystemSearchOpenAiIntentParserTest::__pest_evaluable_it_builds_payload_with_redacted_query_and_parses_strict_JSON_output":0.001,"P\\Tests\\Unit\\Search\\SystemSearchOpenAiIntentParserTest::__pest_evaluable_it_falls_back_safely_when_OpenAI_is_disabled":0,"P\\Tests\\Unit\\Search\\SystemSearchOpenAiIntentParserTest::__pest_evaluable_it_handles_malformed_OpenAI_response_payloads_without_throwing":0,"P\\Tests\\Unit\\Search\\SystemSearchOpenAiIntentParserTest::__pest_evaluable_it_uses_parser_cache_for_identical_query_and_allowed_type_combinations":0,"P\\Tests\\Unit\\Search\\SystemSearchOpenAiIntentParserTest::__pest_evaluable_it_caps_alias_and_hint_payloads_from_OpenAI_and_filters_hints_to_allowed_types":0,"P\\Tests\\Unit\\Search\\SystemSearchOpenApiSpecTest::__pest_evaluable_it_documents_system_wide_search_endpoints_in_openapi":0.106,"P\\Tests\\Unit\\Search\\SystemSearchOpenApiSpecTest::__pest_evaluable_it_documents_debug__intent_and_parser_metadata_schema_in_openapi":0.035,"P\\Tests\\Unit\\Search\\SystemSearchOpenApiSpecTest::__pest_evaluable_it_documents_e_conomic_indexed_customer_matching_and_synonym_behavior":0.022,"P\\Tests\\Unit\\Search\\SystemSearchRouteBehaviorTest::__pest_evaluable_it_normalizes_type_lists_from_csv_json_and_arrays":0,"P\\Tests\\Unit\\Search\\SystemSearchRouteBehaviorTest::__pest_evaluable_it_parses_booleans_and_clamps_integers_using_route_defaults":0,"P\\Tests\\Unit\\Search\\SystemSearchRouteBehaviorTest::__pest_evaluable_it_exposes_expected_searchable_entity_types":0,"P\\Tests\\Unit\\Search\\SystemSearchRouteWiringTest::__pest_evaluable_it_registers_system_wide_search_GET_and_POST_endpoints_with_intent_debug_support":0.028,"P\\Tests\\Unit\\Search\\SystemSearchRouteWiringTest::__pest_evaluable_it_registers_superuser_cache_clear_and_rebuild_endpoints_for_system_search":0.031,"P\\Tests\\Unit\\Search\\SystemSearchRouteWiringTest::__pest_evaluable_it_passes_permission_and_own_scope_context_into_system_search_service":0.008,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_does_not_invoke_intent_parser_when_lexical_confidence_is_already_high":0.001,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_invokes_parser_on_low_confidence_lexical_results_and_applies_hints_only_boosts":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_never_lets_parser_entity_hints_override_explicit_include_filters":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_returns_fallback_parser_metadata_when_parser_fails_gracefully":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_scopes_query_cache_by_permission_context_to_avoid_cross_user_cache_leakage":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_caps_AI_driven_expanded_terms_to_prevent_query_amplification":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_expands_danish_discount_wording_into_lexical_discount_synonyms":0.003,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_invokes_parser_for_intent_driven_natural_language_queries_even_when_lexical_score_is_high":0.003,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_uses_association_hints_to_pull_related_customer_records_from_non_customer_matches":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_prefers_newer_records_when_relevance_scores_are_comparable":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_keeps_explicit_identifier_matches_ahead_of_newer_but_weaker_records":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_promotes_invoices_orders_order_bookings_and_customers_in_ranking":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_never_prioritizes_cancelled_bookings_over_active_bookings":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_heavily_demotes_configured_low_priority_entity_types_in_ranking":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_tokenizes_unicode_names_without_stripping_non_ascii_letters":0.001,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_does_not_treat_explicit_identifier_queries_as_intent_driven":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_requires_broader_term_coverage_for_multi_word_scoring":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_enriches_object_attachment_results_with_associated_customer_context":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_includes_the_economic_customer_index_in_cache_dependencies_for_customer_scoped_results":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_falls_back_to_invoice_date_ranges_when_invoice_names_are_missing":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_derives_xlvask_customer_numbers_only_from_digits_only_extern_ids":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_replaces_unnamed_user_titles_with_the_customer_context_name":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_uses_the_goal_criteria_label_for_department_goal_titles":0,"P\\Tests\\Integration\\Search\\SystemSearchCacheIntegrationTest::__pest_evaluable_it_reuses_parser_cache_entries_for_repeated_natural_language_intent_requests":0.129,"P\\Tests\\Integration\\Search\\SystemSearchCacheIntegrationTest::__pest_evaluable_it_clears_parser_cache_namespace_via_clearAll_to_force_a_fresh_parse":0,"P\\Tests\\Integration\\Search\\SystemSearchCacheIntegrationTest::__pest_evaluable_it_bumps_per_table_cache_versions_when_a_dirty_table_marker_is_registered":0.05,"P\\Tests\\Unit\\Invoicing\\EconomicV2DistributionServiceFallbackTest::__pest_evaluable_it_falls_back_to_system_orders_for_fixed_pricing_when_regular_orders_yield_no_customers":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2DistributionServiceFallbackTest::__pest_evaluable_it_falls_back_to_system_orders_for_wash_subscriptions_when_regular_orders_yield_no_customers":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2CliBackfillCommandTest::__pest_evaluable_it_registers_economic_v2_backfill_command_in_cli_dispatcher":0.005,"P\\Tests\\Unit\\Invoicing\\EconomicV2CliBackfillCommandTest::__pest_evaluable_it_provides_a_backfill_cron_script_entrypoint":0.007,"P\\Tests\\Unit\\Invoicing\\EconomicV2CompareEngineTest::__pest_evaluable_it_returns_exact__match_when_totals_lines_and_departments_are_identical":0.001,"P\\Tests\\Unit\\Invoicing\\EconomicV2CompareEngineTest::__pest_evaluable_it_returns_total__mismatch_when_only_totals_differ":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2CompareEngineTest::__pest_evaluable_it_detects_line_level_mismatches_for_quantity_and_price":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2CompareEngineTest::__pest_evaluable_it_detects_departmental_distribution_mismatches":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2CompareEngineTest::__pest_evaluable_it_returns_missing__target_when_draft_or_booked_target_is_unavailable":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2LineNormalizerTest::__pest_evaluable_it_normalizes_draft_invoice_lines_including_departmental_distributions":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2LineNormalizerTest::__pest_evaluable_it_marks_text_only_zero_value_lines_as_non_billable_and_keeps_deterministic_key":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2LineNormalizerTest::__pest_evaluable_it_normalizes_booked_invoices_and_computes_net_total_delta_from_lines":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2LineNormalizerTest::__pest_evaluable_it_contains_internal_normalization_path_with_departmental_metadata_support":0.005,"P\\Tests\\Unit\\Invoicing\\EconomicV2OpenApiSpecTest::__pest_evaluable_it_documents_economic_v2_invoice_paths_in_openapi":0.016,"P\\Tests\\Unit\\Invoicing\\EconomicV2OpenApiSpecTest::__pest_evaluable_it_documents_v2_historical_distribution_and_pricing_history_paths_in_openapi":0.011,"P\\Tests\\Unit\\Invoicing\\EconomicV2OpenApiSpecTest::__pest_evaluable_it_aligns_legacy_compare_schema_with_runtime_payload_by_removing_stale_required_order__ids":0.012,"P\\Tests\\Unit\\Invoicing\\EconomicV2OpenApiSpecTest::__pest_evaluable_it_defines_new_reusable_v2_schemas_for_normalization_comparison_versioning_and_distribution":0.01,"P\\Tests\\Unit\\Invoicing\\EconomicV2RevenueAndBarredSupportTest::__pest_evaluable_it_supports_barred_filtering_when_listing_e_conomic_customers":0.08,"P\\Tests\\Unit\\Invoicing\\EconomicV2RevenueAndBarredSupportTest::__pest_evaluable_it_implements_a_dedicated_v2_e_conomic_revenue_statistics_service_and_route":0.014,"P\\Tests\\Unit\\Invoicing\\EconomicV2RouteAndVersioningHooksTest::__pest_evaluable_it_registers_all_collected_invoice_economic_v2_routes_with_explicit_permissions":0.006,"P\\Tests\\Unit\\Invoicing\\EconomicV2RouteAndVersioningHooksTest::__pest_evaluable_it_registers_version_aware_distribution_and_pricing_history_v2_routes":0.008,"P\\Tests\\Unit\\Invoicing\\EconomicV2RouteAndVersioningHooksTest::__pest_evaluable_it_caches_v2_distribution_responses_with_a_configurable_redis_ttl":0.004,"P\\Tests\\Unit\\Invoicing\\EconomicV2RouteAndVersioningHooksTest::__pest_evaluable_it_writes_fixed_pricing_versions_from_create_and_delete_flows":0.005,"P\\Tests\\Unit\\Invoicing\\EconomicV2RouteAndVersioningHooksTest::__pest_evaluable_it_writes_vehicle_subscription_versions_for_create_update_delete_flows":0.003,"P\\Tests\\Unit\\Invoicing\\EconomicV2RouteAndVersioningHooksTest::__pest_evaluable_it_writes_discount_override_versions_from_superuser_discounts_route":0.007,"P\\Tests\\Unit\\Invoicing\\EconomicV2RouteAndVersioningHooksTest::__pest_evaluable_it_keeps_legacy_compare_endpoint_path_for_backward_compatibility":0.002,"P\\Tests\\Unit\\Invoicing\\EconomicV2VersioningServiceStructureTest::__pest_evaluable_it_implements_effective_range_lifecycle_methods_for_all_versioned_entities":0.036,"P\\Tests\\Unit\\Invoicing\\EconomicV2VersioningServiceStructureTest::__pest_evaluable_it_closes_previous_active_interval_before_inserting_a_new_version":0.021,"P\\Tests\\Unit\\Invoicing\\EconomicV2VersioningServiceStructureTest::__pest_evaluable_it_includes_best_effort_backfill_with_provenance_and_confidence_metadata":0.005,"P\\Tests\\Unit\\Invoicing\\EconomicV2VersioningServiceStructureTest::__pest_evaluable_it_anchors_historical_resolution_on_order_created__at_timestamps_in_distribution_service":0.013,"P\\Tests\\Unit\\Invoicing\\InvoicingOrdersCalculationsHardeningTest::__pest_evaluable_it_guards_against_empty_order_ids_in_net_amount_calculation":0.081,"P\\Tests\\Unit\\Invoicing\\InvoicingOrdersCalculationsHardeningTest::__pest_evaluable_it_guards_against_empty_customer_arrays_in_date_range_transaction_fetches":0.074,"P\\Tests\\Unit\\Invoicing\\InvoicingOrdersCalculationsHardeningTest::__pest_evaluable_it_uses_centralized_duplicate_filtering_for_possible_duplicate_detection":0.081,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodRouteCacheHelpersTest::__pest_evaluable_it_uses_sane_ttl_defaults_and_clamps_negative_ttl_to_zero":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodRouteCacheHelpersTest::__pest_evaluable_it_builds_deterministic_cache_keys_per_scope_and_date_range":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodRouteCacheHelpersTest::__pest_evaluable_it_falls_back_to_resolver_directly_when_cache_ttl_is_disabled":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodRouteGuardsTest::__pest_evaluable_it_requires_superuser_permission_for_invoicing_period_distribution_all_endpoint":0.05,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodRouteGuardsTest::__pest_evaluable_it_uses_shared_date_range_normalization_across_invoicing_period_endpoints":0.705,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodUtilsTest::__pest_evaluable_it_normalizes_a_valid_invoicing_date_range_to_full_day_timestamps":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodUtilsTest::__pest_evaluable_it_rejects_invalid_date_formats":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodUtilsTest::__pest_evaluable_it_rejects_descending_date_ranges":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodUtilsTest::__pest_evaluable_it_finds_duplicate_orders_regardless_of_original_input_order":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2DistributionServiceFallbackTest::__pest_evaluable_it_runs_best_effort_backfill_when_fixed_pricing_version_history_is_empty":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConditionEvaluatorTest::__pest_evaluable_it_evaluates_self_serve_conditions_with_combined_AND_and_OR_semantics":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConditionEvaluatorTest::__pest_evaluable_it_prefers_condition_results_over_question_answers_when_evaluating_task_gates":0,"P\\Tests\\Unit\\Selfserve\\SelfserveOpenApiSpecTest::__pest_evaluable_it_documents_self_serve_machine_type__eligibility__summary__and_webhook_endpoints":0.009,"P\\Tests\\Unit\\Selfserve\\SelfserveOpenApiSpecTest::__pest_evaluable_it_defines_reusable_self_serve_wash_and_machine_type_schemas":0.007,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_self_serve_machine_types__eligibility__summaries__and_machine_start_webhook_routes":0.013,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_keeps_machine_type_support_wired_into_lanes__tasks__and_conditions_routes":0.023,"P\\Tests\\Unit\\N8n\\N8nRouteHelpersTest::__pest_evaluable_it_normalizes_webhook_methods_and_falls_back_to_POST_for_unsupported_verbs":0,"P\\Tests\\Unit\\N8n\\N8nRouteHelpersTest::__pest_evaluable_it_filters_request_parameters_down_to_the_allowed_n8n_query_keys":0,"P\\Tests\\Unit\\N8n\\N8nRouteWiringTest::__pest_evaluable_it_registers_workflow_lifecycle_endpoints_for_the_n8n_module":0.182,"P\\Tests\\Unit\\N8n\\N8nRouteWiringTest::__pest_evaluable_it_registers_execution_and_webhook_trigger_endpoints_for_the_n8n_module":0.115,"P\\Tests\\Unit\\Invoicing\\EconomicV2BookedDepartment75DistributionTest::__pest_evaluable_it_redistributes_booked_department_75_net_amounts_using_fixed_pricing_and_wash_subscription_weights":0.001,"P\\Tests\\Unit\\Invoicing\\EconomicV2BookedDepartment75DistributionTest::__pest_evaluable_it_keeps_classified_booked_department_75_amounts_undistributed_when_no_monthly_basis_exists":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2BookedDepartment75DistributionTest::__pest_evaluable_it_keeps_unclassified_booked_department_75_lines_undistributed_with_warnings":0,"P\\Tests\\Unit\\Invoicing\\EconomicEndpointUrlEncodingTest::__pest_evaluable_it_encodes_raw_filter_query_values_that_include_timestamps":0,"P\\Tests\\Unit\\Invoicing\\EconomicEndpointUrlEncodingTest::__pest_evaluable_it_avoids_double_encoding_query_values_that_are_already_escaped":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2BookedDepartment75DistributionTest::__pest_evaluable_it_supports_bulk_booked_invoice_line_payloads_with_top_level_department_numbers":0,"P\\Tests\\Unit\\Redis\\RedisAtomicReservationTest::__pest_evaluable_it_claims_a_slot_atomically_with_nx_and_expiration":0,"P\\Tests\\Unit\\Redis\\RedisAtomicReservationTest::__pest_evaluable_it_returns_false_when_the_slot_is_already_claimed_and_clamps_ttl_to_one_second":0,"P\\Tests\\Unit\\Bookings\\OrderBookingRouteIdempotencyGuardTest::__pest_evaluable_it_guards_order_booking_creation_with_redis_backed_idempotency":0.101,"P\\Tests\\Unit\\DynamicImages\\DynamicImagePreRenderCronWiringTest::__pest_evaluable_it_registers_dynamic_image_pre_render_cron_task_and_related_helpers":0.01,"P\\Tests\\Integration\\Database\\DbConnectionTest::__pest_evaluable_it_can_connect_to_a_configured_MySQL_instance_in_integration_mode":0.016,"P\\Tests\\Integration\\Invoicing\\EconomicV2BackfillAndDistributionIntegrationTest::__pest_evaluable_it_runs_best_effort_backfill_repeatedly_without_introducing_duplicate_same_start_rows":0.013,"P\\Tests\\Integration\\Invoicing\\EconomicV2BackfillAndDistributionIntegrationTest::__pest_evaluable_it_resolves_version_aware_distribution_payload_shapes_over_a_real_date_range":0.016,"P\\Tests\\Integration\\Invoicing\\EconomicV2VersioningServiceIntegrationTest::__pest_evaluable_it_creates_closes_and_rotates_fixed_pricing_versions_without_overlap":0.015,"P\\Tests\\Integration\\Invoicing\\EconomicV2VersioningServiceIntegrationTest::__pest_evaluable_it_tracks_vehicle_and_discount_version_lifecycles_with_closure_semantics":0.014,"P\\Tests\\Integration\\Permissions\\LegacyPermissionRedisCacheScriptTest::__pest_evaluable_it_keeps_legacy_route_permission_redis_cache_script_green":0.01,"P\\Tests\\Unit\\Permissions\\AllowOwnOrDepartmentAccessForbiddenTest::__pest_evaluable_it_returns_both_own_and_elevated_permissions_when_both_are_missing":0,"P\\Tests\\Unit\\Permissions\\AllowOwnOrDepartmentAccessForbiddenTest::__pest_evaluable_it_returns_only_elevated_permission_when_own_permission_exists_but_own_context_fails":0,"P\\Tests\\Unit\\Permissions\\AllowOwnOrDepartmentAccessForbiddenTest::__pest_evaluable_it_allows_elevated_permission_path_without_forbidden_and_validates_department_access":0,"P\\Tests\\Unit\\Permissions\\ForbiddenResponseWiringTest::__pest_evaluable_it_routes_and_trait_use_forbidden_responses_for_permission_and_ownership_denials":0.19,"P\\Tests\\Unit\\Permissions\\GroupPermissionSessionInvalidationWiringTest::__pest_evaluable_it_invalidates_related_user_permission_and_auth_session_caches_when_group_permissions_change":0.064,"P\\Tests\\Unit\\Goals\\GoalsCriteriaTargetDurationTest::__pest_evaluable_it_parses_advanced_target_duration_from_snake__case_fields":0.36,"P\\Tests\\Unit\\Goals\\GoalsCriteriaTargetDurationTest::__pest_evaluable_it_parses_advanced_target_duration_from_camelCase_aliases":0,"P\\Tests\\Unit\\Goals\\GoalsCriteriaTargetDurationTest::__pest_evaluable_it_normalizes_ENTIRE__DURATION_to_ignore_target__duration__every":0,"P\\Tests\\Unit\\Goals\\GoalsCriteriaTargetDurationTest::__pest_evaluable_it_defaults_recurring_target__duration__every_to_1_when_omitted":0,"P\\Tests\\Unit\\Goals\\GoalsCriteriaTargetDurationTest::__pest_evaluable_it_keeps_strict_legacy_mode_when_target__duration_is_invalid":0,"P\\Tests\\Unit\\Goals\\GoalsCriteriaTargetMathTest::__pest_evaluable_it_computes_weekly_target_using_touched_ISO_weeks_for_March_2026":0,"P\\Tests\\Unit\\Goals\\GoalsCriteriaTargetMathTest::__pest_evaluable_it_applies_target__duration__every_for_weekly_cadence":0,"P\\Tests\\Unit\\Goals\\GoalsCriteriaTargetMathTest::__pest_evaluable_it_prorates_ENTIRE__DURATION_target_by_overlap_days":0,"P\\Tests\\Unit\\Goals\\GoalsCriteriaTargetMathTest::__pest_evaluable_it_splits_advanced_target_by_override_weights_per_department":0,"P\\Tests\\Unit\\Goals\\GoalsCriteriaTargetMathTest::__pest_evaluable_it_preserves_legacy_target_behavior_when_target__duration_is_missing":0,"P\\Tests\\Unit\\Goals\\GoalsLegacyRendererScriptsTest::__pest_evaluable_it_keeps_legacy_monthly_renderer_script_green":0.466,"P\\Tests\\Unit\\Goals\\GoalsLegacyRendererScriptsTest::__pest_evaluable_it_keeps_legacy_department_daily_renderer_script_green":0.879,"P\\Tests\\Unit\\Goals\\GoalsOpenApiSpecTest::__pest_evaluable_it_documents_advanced_goals_target_duration_fields_in_openapi":0.07,"P\\Tests\\Unit\\Workfeed\\WorkfeedClientConformanceTest::__pest_evaluable_it_uses_company_scoped_workfeed_endpoints_and_raw_Authorization_header":0.006,"P\\Tests\\Unit\\Workfeed\\WorkfeedClientConformanceTest::__pest_evaluable_it_normalizes_documented_shift_query_parameters":0.005,"P\\Tests\\Unit\\Workfeed\\WorkfeedConfigRouteWiringTest::__pest_evaluable_it_registers_module_config_endpoints_for_workfeed":0.007,"P\\Tests\\Unit\\Workfeed\\WorkfeedRouteHelpersTest::__pest_evaluable_it_filters_request_parameters_down_to_the_allowed_workfeed_query_keys":0.001,"P\\Tests\\Unit\\Workfeed\\WorkfeedRouteWiringTest::__pest_evaluable_it_registers_employee_and_department_endpoints_for_the_workfeed_module":0.008,"P\\Tests\\Unit\\Workfeed\\WorkfeedRouteWiringTest::__pest_evaluable_it_registers_shift_endpoints_for_the_workfeed_module":0.008,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_calculates_workfeed_employee_hours_for_the_hour_slot_based_on_overlap":0.001,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_extracts_department_id_from_supported_workfeed_shift_shapes":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_normalizes_wrapped_workfeed_collections_from_common_response_keys":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTimelineSchemaConformanceTest::__pest_evaluable_it_includes_a_date_key_in_department_weather_timeline_entries":0.006,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTimelineSchemaConformanceTest::__pest_evaluable_it_documents_the_date_key_in_the_openapi_department_weather_timeline_schema":0.034,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTimelineRangeTest::__pest_evaluable_it_builds_a_timeline_range_from_start_of_yesterday_to_end_of_today":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTimelineRangeTest::__pest_evaluable_it_builds_a_timeline_range_relative_to_an_explicit_selected_date_override":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_calculates_workfeed_employee_hours_across_multiple_departments_for_one_hour_slot":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_normalizes_department_id_input_from_scalar_csv_and_nested_array_values":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTimelineRangeTest::__pest_evaluable_it_builds_a_timeline_range_relative_to_explicit_date__from_and_date__to_override":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTimelineRangeTest::__pest_evaluable_it_resolves_forecast_day_count_for_a_given_timeline_range_with_sane_limits":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherFallbackBehaviorTest::__pest_evaluable_it_resolves_weather_coordinates_from_valid_coordinates_only":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherFallbackBehaviorTest::__pest_evaluable_it_returns_null_weather_coordinates_when_all_department_locations_are_invalid":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherFallbackBehaviorTest::__pest_evaluable_it_classifies_weatherapi_no_matching_location_errors_as_location_lookup_failures":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherFallbackBehaviorTest::__pest_evaluable_it_does_not_classify_non_location_weatherapi_errors_as_location_lookup_failures":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherFallbackBehaviorTest::__pest_evaluable_it_returns_an_empty_forecast_fallback_when_coordinates_are_unavailable":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherFallbackBehaviorTest::__pest_evaluable_it_builds_timeline_entries_with_mostly__clear_weather_when_forecast_payload_is_empty":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherFallbackBehaviorTest::__pest_evaluable_it_wires_departments_weather_route_through_the_forecast_fallback_path":0.007,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheHelpersTest::__pest_evaluable_it_uses_sane_ttl_defaults_and_clamps_negative_ttl_to_zero":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheHelpersTest::__pest_evaluable_it_builds_deterministic_cache_keys_for_department_sets_and_timeline_ranges":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheHelpersTest::__pest_evaluable_it_builds_order_insensitive_cache_keys_for_equivalent_department_id_sets":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheHelpersTest::__pest_evaluable_it_falls_back_to_resolver_directly_when_cache_ttl_is_disabled":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTimelineRangeTest::__pest_evaluable_it_marks_non_started_slots_as_unknown_regardless_of_wash_hour_ratio":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherPreloadCronWiringTest::__pest_evaluable_it_registers_and_implements_cron_preloading_for_department_weather_cache":0.012,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheHelpersTest::__pest_evaluable_it_uses_sane_stale_ttl_defaults_and_clamps_stale_ttl_below_fresh_ttl":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheHelpersTest::__pest_evaluable_it_uses_sane_hot_activity_ttl_defaults_and_clamps_to_a_positive_value":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheRuntimeBehaviorTest::__pest_evaluable_it_serves_fresh_cached_payloads_without_invoking_the_resolver":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheRuntimeBehaviorTest::__pest_evaluable_it_serves_stale_cached_payloads_and_enqueues_a_refresh_signal":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheRuntimeBehaviorTest::__pest_evaluable_it_recomputes_and_rewrites_cache_payloads_when_stale_window_is_exceeded":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheRuntimeBehaviorTest::__pest_evaluable_it_records_hot_keys_order_insensitively_and_applies_preload_target_caps":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_normalizes_batched_wash_count_rows_into_hourly_slot_totals":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_wires_department_weather_route_to_use_batched_wash_aggregation":0.015,"P\\Tests\\Unit\\Orders\\AttachmentsListManyTest::__pest_evaluable_it_groups_attachments_by_object_id_and_preserves_empty_object_groups":0,"P\\Tests\\Unit\\Orders\\AttachmentsListManyTest::__pest_evaluable_it_keeps_listMany_payload_parity_with_list_for_one_object_id":0,"P\\Tests\\Unit\\Orders\\EconomicModuleOrdersBatchHelpersTest::__pest_evaluable_it_ensures_economic_module_rows_in_one_sanitized_batch":0,"P\\Tests\\Unit\\Orders\\EconomicModuleOrdersBatchHelpersTest::__pest_evaluable_it_returns_id_keyed_economic_module_payload_with_null_defaults":0,"P\\Tests\\Unit\\Orders\\OrdersRouteListBatchingWiringTest::__pest_evaluable_it_wires_GET__orders_through_batched_enrichment_and_stripe_snapshot_caching":0.116,"P\\Tests\\Unit\\Orders\\UsersCashierNamesBatchTest::__pest_evaluable_it_returns_cashier_names_from_cache_and_fetches_missing_ones_in_batch":0,"P\\Tests\\Unit\\Orders\\UsersCashierNamesBatchTest::__pest_evaluable_it_returns_deterministic_map_for_duplicate_and_unsorted_cashier_ids":0,"P\\Tests\\Unit\\Orders\\UsersCashierNamesBatchWiringTest::__pest_evaluable_it_implements_batched_cashier_name_lookup_with_cache_first_fallback_behavior":0.141,"P\\Tests\\Unit\\Orders\\UsersCashierNamesBatchWiringTest::__pest_evaluable_it_sanitizes_and_deduplicates_cashier_ids_before_batch_lookup":0.064,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_counts_overtime_minutes_when_a_shift_carries_an_extended_approval_end_timestamp":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_counts_unapproved_overtime_from_a_bounded_shift_updateTime_fallback":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_does_not_treat_late_unapproved_administrative_edits_as_overtime":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheHelpersTest::__pest_evaluable_it_changes_weather_timeline_cache_key_when_department_weather_targets_change":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherStatusTargetsTest::__pest_evaluable_it_evaluates_healthy_degraded_and_unhealthy_statuses_from_configured_department_targets":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherStatusTargetsTest::__pest_evaluable_it_returns_unknown_when_configured_targets_are_missing_for_department_status_evaluation":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherStatusTargetsTest::__pest_evaluable_it_aggregates_multi_department_slot_statuses_using_worst_severity_and_unknown_fallback_rules":0.046,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTargetsOpenApiSpecTest::__pest_evaluable_it_documents_department_weather_target_endpoints_and_reusable_schemas_in_openapi":0.008,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTargetsOpenApiSpecTest::__pest_evaluable_it_documents_unknown_weather_status_behavior_when_targets_are_missing":0.01,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTargetsRouteWiringTest::__pest_evaluable_it_registers_department_weather_target_routes_with_explicit_read_and_manage_permissions":0.006,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTargetsRouteWiringTest::__pest_evaluable_it_persists_department_weather_targets_using_canonical_department_variable_keys":0.005,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_machine_relay_status_get_and_set_endpoints":0.005,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_batches_sequential_machine_relay_status_requests_into_a_single_Shelly_get_call":0.001,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_respects_the_1_request_per_second_Shelly_gate_for_back_to_back_requests":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_retries_missing_Shelly_status_payloads_until_relay_status_becomes_ready":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_times_out_with_a_clear_Shelly_readiness_error_when_payload_remains_missing":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_uses_direct_set_switch_and_seeds_cache_so_immediate_status_read_does_not_call_Shelly_get":0,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_self_serve_lane_gate_open_endpoint":0.005,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_in_progress_self_serve_wash_details_endpoint":0.004,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_adds_vehicle_type_product_on_STOP_when_program_selector_is_on__then_turns_off_cleaner_machine_and_selector_relays":0.132,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_skips_vehicle_type_product_add_when_program_selector_is_off_and_only_disables_configured_relays":0.001,"P\\Tests\\Unit\\Selfserve\\DepartmentSelfServeEnabledRelaySyncWiringTest::__pest_evaluable_it_syncs_lane_relay_states_when_department_self_serve_enabled_flag_changes":0.034,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_supports_hard_relay_set_even_when_lane_status_is_CLOSED":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStartCleanerRelayWiringTest::__pest_evaluable_it_enables_cleaner_relay_on_wash_start_command_and_webhook_flow":0.016,"P\\Tests\\Unit\\Selfserve\\SelfserveWashCompletionRelayWiringTest::__pest_evaluable_it_forces_machine_relay_off_when_a_self_serve_wash_session_is_completed":0.003,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePortControllerTest::__pest_evaluable_it_opens_exit_port_by_switching_relay__in__id_on":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePortControllerTest::__pest_evaluable_it_opens_entrance_port_by_switching_relay__out__id_on":0,"P\\Tests\\Unit\\Selfserve\\SelfserveOpenApiSpecTest::__pest_evaluable_it_documents_in_progress_self_serve_wash_start_and_machine_relay_fields":0.007,"P\\Tests\\Unit\\Selfserve\\SelfserveConditionEvaluatorTest::__pest_evaluable_it_evaluates_typed_task_gates_with_strict_semantics":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_validates_typed_task_gates_for_known_references":0.001,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_fails_validation_when_typed_task_gates_reference_unknown_entities":0,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_self_serve_config_draft_publish_rollback_lifecycle_endpoints":0.006,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_keeps_legacy_self_serve_CRUD_routes_syncing_canonical_drafts":0.019,"P\\Tests\\Unit\\Selfserve\\SelfserveStartCleanerRelayWiringTest::__pest_evaluable_it_keeps_cleaner_relay_enable_wired_into_machine_relay_start_paths":0.01,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_stores_config_json_with_apostrophes_without_violating_json_constraints":0.277,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_encodes_config_json_payloads_with_apostrophes_before_persistence":0,"P\\Tests\\Unit\\Selfserve\\SelfserveWashCompletionRelayWiringTest::__pest_evaluable_it_forces_machine_and_cleaner_relays_off_when_a_self_serve_wash_session_is_completed":0.007,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_vehicle_type_override_into_self_serve_preview_and_synchronization_routes":0.009,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_uses_local_demo_responses_and_skips_Shelly_cloud_calls_for_demo_relay_ids":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_returns_default_OFF_status_for_demo_relay_ids_without_Shelly_lookups":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_excludes_demo_relay_ids_from_Shelly_status_batch_payloads":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePortControllerTest::__pest_evaluable_it_keeps_demo_relay_gate_open_queued_but_skips_Shelly_switch_calls":0,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_allowed_services_route_through_machine_relay_visibility_sync":0.006,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_enables_MACHINE_relay_when_MACHINE_is_visible_in_allowed_services":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_turns_MACHINE_relay_off_immediately_when_MACHINE_is_not_visible":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_does_not_enable_MACHINE_relay_when_allowEnable_is_false_even_if_MACHINE_is_visible":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_is_a_safe_no_op_when_MACHINE_relay_is_not_configured":0,"P\\Tests\\Unit\\Selfserve\\SelfserveRelayVisibilitySyncWiringTest::__pest_evaluable_it_synchronizes_machine_relay_from_visible_services_during_session_synchronization":0.011,"P\\Tests\\Unit\\Selfserve\\SelfserveRelayVisibilitySyncWiringTest::__pest_evaluable_it_adds_explicit_relay_disable_session_helper_for_visibility_driven_OFF_transitions":0.006,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_self_serve_property_gate_command_permissions":0.015,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneCommandEnumTest::__pest_evaluable_it_parses_property_gate_lane_commands":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePropertyGateCommandTest::__pest_evaluable_it_opens_entrance_gate_for_OPEN__PROPERTY__ACCESS__GATE_command":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePropertyGateCommandTest::__pest_evaluable_it_opens_exit_gate_for_OPEN__PROPERTY__EXIT__GATE_command":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePropertyGateCommandTest::__pest_evaluable_it_blocks_property_gate_commands_when_department_self_serve_is_disabled":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePropertyGateCommandTest::__pest_evaluable_it_throws_a_clear_error_when_entrance_gate_is_missing_for_property_access_command":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePropertyGateCommandTest::__pest_evaluable_it_wraps_low_level_gate_errors_for_property_access_command_failures":0.002,"P\\Tests\\Unit\\Selfserve\\SelfserveWashFlowMachineAllowedWiringTest::__pest_evaluable_it_reads_machine_allowed_state_from_session_summary_payload_safely":0.007,"P\\Tests\\Unit\\Selfserve\\DbObjectPaginationLegacyColumnCompatibilityTest::__pest_evaluable_it_guards_pagination_against_searchable_fields_missing_from_legacy_schemas":0.05,"P\\Tests\\Unit\\Selfserve\\SelfserveSchemaBootstrapCompatibilityTest::__pest_evaluable_it_adds_dynamic__images__vehicle__type_column_for_legacy_selfserve_wash_session_task_schemas":0.006,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneInvoiceIncludedMinutesTest::__pest_evaluable_it_computes_billable_minutes_when_elapsed_minutes_exceed_included_minutes":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneInvoiceIncludedMinutesTest::__pest_evaluable_it_computes_zero_billable_minutes_when_elapsed_minutes_equal_included_minutes":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneInvoiceIncludedMinutesTest::__pest_evaluable_it_computes_zero_billable_minutes_when_included_minutes_exceed_elapsed_minutes":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneInvoiceIncludedMinutesTest::__pest_evaluable_it_handles_zero_and_low_elapsed_wash_time_edge_cases":0,"P\\Tests\\Unit\\Selfserve\\SelfserveOpenApiSpecTest::__pest_evaluable_it_documents_self_serve_machine_wash_included_minutes_in_config_schemas":0.006,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_machine_wash_included_minutes_into_self_serve_module_config":0.008,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_blocks_explicit_relay_writes_when_department_self_serve_is_disabled":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_returns_disabled_no_op_from_machine_relay_visibility_sync_when_department_self_serve_is_disabled":0,"P\\Tests\\Unit\\Selfserve\\SelfserveOpenApiSpecTest::__pest_evaluable_it_documents_property_gate_lane_commands_and_sanitized_gate_failure_responses":0.007,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_fails_fast_when_workspace_id_is_missing_for_gate_calls":0.022,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_fails_fast_when_channel_id_is_missing_for_gate_calls":0,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_fails_with_terminal_status_details_when_call_never_reaches_accepted_state":0.067,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_hangs_up_when_call_reaches_accepted_state":0.001,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_hangs_up_immediately_when_status_transitions_to_accepted":0,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_maps_legacy_timeout_option_to_documented_ringTimeout_payload_field":0,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_clamps_derived_ringTimeout_to_Bird_documented_max_when_gate_timeout_is_high":0,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_passes_documented_hangup_cause_when_provided":0,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_drops_unsupported_hangup_cause_values_from_request_payload":0,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_fails_fast_when_workspace_id_is_missing_for_gate_flash_calls":0,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_creates_gate_flash_call_with_documented_ringTimeout_payload":0,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_polls_flash_call_and_succeeds_once_accepted":0,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_fails_flash_gate_flow_when_terminal_failure_status_is_returned":0,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_does_not_fallback_to_regular_gate_call_when_flash_succeeds":0,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_falls_back_to_regular_gate_call_when_flash_fails":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePropertyGateCommandTest::__pest_evaluable_it_wraps_low_level_gate_errors_for_property_exit_command_failures":0.002,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_falls_back_to_regular_gate_call_when_flash_caller_id_is_not_confirmed":0,"P\\Tests\\Unit\\Bird\\BirdModuleClientMappingTest::__pest_evaluable_it_maps_voice_call_facade_methods_to_documented_endpoints_and_methods":0.024,"P\\Tests\\Unit\\Bird\\BirdModuleClientMappingTest::__pest_evaluable_it_maps_recordings_insights_log_and_flash_methods_to_documented_resources":0.001,"P\\Tests\\Unit\\Bird\\BirdModuleClientMappingTest::__pest_evaluable_it_encodes_path_segments_before_building_outbound_endpoints":0,"P\\Tests\\Unit\\Bird\\BirdModuleClientMappingTest::__pest_evaluable_it_serializes_query_parameters_for_GET_transport_requests":0,"P\\Tests\\Unit\\Bird\\BirdModuleClientMappingTest::__pest_evaluable_it_maps_4xx_and_5xx_transport_failures_into_informative_exceptions":0,"P\\Tests\\Unit\\Bird\\BirdModuleClientMappingTest::__pest_evaluable_it_returns_raw_payload_for_malformed_JSON_responses_and_null_for_empty_responses":0.007,"P\\Tests\\Unit\\Bird\\BirdOpenApiSpecTest::__pest_evaluable_it_documents_all_Bird_voice_call_parity_endpoints_including_gather_recordings_insights_and_log":0.008,"P\\Tests\\Unit\\Bird\\BirdOpenApiSpecTest::__pest_evaluable_it_documents_flash_hangup_endpoint_and_marks_end_alias_as_deprecated":0.006,"P\\Tests\\Unit\\Bird\\BirdOpenApiSpecTest::__pest_evaluable_it_defines_request_and_response_schemas_for_Bird_call_command_recording_insight_log_and_flash_payloads":0.009,"P\\Tests\\Unit\\Bird\\BirdRequestValidationTest::__pest_evaluable_it_accepts_valid_payloads_for_create_and_nested_call_flow_commands":0.002,"P\\Tests\\Unit\\Bird\\BirdRequestValidationTest::__pest_evaluable_it_rejects_unknown_fields_and_invalid_enum_values_in_strict_schemas":0.051,"P\\Tests\\Unit\\Bird\\BirdRequestValidationTest::__pest_evaluable_it_supports_CSV_normalization_in_schema_validation_for_log_filters":0,"P\\Tests\\Unit\\Bird\\BirdRequestValidationTest::__pest_evaluable_it_validates_flash_hangup_payloads_for_both_supported_request_shapes":0,"P\\Tests\\Unit\\Bird\\BirdRequestValidationTest::__pest_evaluable_it_fails_before_forward_step_when_strict_validation_fails_and_forwards_when_valid":0,"P\\Tests\\Unit\\Bird\\BirdRouteWiringTest::__pest_evaluable_it_registers_full_Bird_voice_call_route_surface_with_strict_validation_and_permissions":0.04,"P\\Tests\\Unit\\Bird\\BirdRouteWiringTest::__pest_evaluable_it_registers_flash_hangup_endpoint_and_keeps_end_alias_wired_as_compatibility_path":0.033,"P\\Tests\\Unit\\Bird\\BirdRouteWiringTest::__pest_evaluable_it_keeps_Bird_number_and_webhook_routes_intact":0.063,"P\\Tests\\Unit\\Bird\\BirdModuleClientMappingTest::__pest_evaluable_it_handles_malformed_and_empty_response_bodies_without_throwing_transport_errors":0.005,"P\\Tests\\Unit\\Selfserve\\DepartmentGatesRelaysRouteWiringTest::__pest_evaluable_it_validates_department_gate_config_on_both_create_and_update_routes":0.059,"P\\Tests\\Unit\\Selfserve\\SelfserveSchemaBootstrapCompatibilityTest::__pest_evaluable_it_adds_wash__started__at_column_for_legacy_selfserve_wash_session_schemas":0.004,"P\\Tests\\Unit\\Selfserve\\SelfserveWashStartedAtWiringTest::__pest_evaluable_it_stores_wash__started__at_in_self_serve_wash_sessions_when_machine_start_is_triggered":0.004,"P\\Tests\\Unit\\Selfserve\\SelfserveWashStartedAtWiringTest::__pest_evaluable_it_passes_lane_wash_start_time_into_the_session_machine_start_marker":0.01,"P\\Tests\\Unit\\Selfserve\\SelfserveWashStartedAtWiringTest::__pest_evaluable_it_resolves_in_progress_wash__started__at_from_session_with_compatibility_fallbacks":0.004,"P\\Tests\\Unit\\Bird\\BirdPayloadClassesTest::__pest_evaluable_it_normalizes_say_payload_and_applies_hangup_default":0.596,"P\\Tests\\Unit\\Bird\\BirdPayloadClassesTest::__pest_evaluable_it_normalizes_log_query_csv_and_integer_fields":0,"P\\Tests\\Unit\\Bird\\BirdPayloadClassesTest::__pest_evaluable_it_normalizes_nested_create_call_payload_sections_and_drops_unknown_keys":0,"P\\Tests\\Unit\\Bird\\BirdPayloadClassesTest::__pest_evaluable_it_keeps_gather_nested_say_payload_unchanged_when_hangup_is_omitted":0,"P\\Tests\\Unit\\Bird\\BirdPayloadClassesTest::__pest_evaluable_it_supports_no_body_and_flash_hangup_payload_normalization":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_respects_the_2_second_Shelly_gate_for_back_to_back_requests":0.023,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_enforces_a_2_second_gap_between_sequential_switch_requests_used_by_wash_start_and_stop_flows":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_keeps_back_to_back_get_switch_requests_ordered_through_the_relay_controller":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_executes_sequential_switch_requests_used_by_wash_start_and_stop_flows":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePortControllerTest::__pest_evaluable_it_does_not_print_Shelly_switch_responses_to_output":0,"P\\Tests\\Unit\\Selfserve\\ShellyGlobalRateLimitWiringTest::__pest_evaluable_it_enforces_a_global_2_second_Shelly_gate_in_sendPostRequest":0.006,"P\\Tests\\Unit\\Selfserve\\ShellyGlobalRateLimitWiringTest::__pest_evaluable_it_uses_Redis_NX_PX_semantics_for_cross_request_Shelly_rate_limiting":0.006,"P\\Tests\\Unit\\Selfserve\\ShellyGlobalRateLimitBehaviorTest::__pest_evaluable_it_enforces_the_2_second_Shelly_gate_across_separate_request_contexts":0,"P\\Tests\\Unit\\Selfserve\\ShellyGlobalRateLimitBehaviorTest::__pest_evaluable_it_does_not_delay_when_the_Shelly_gate_is_already_expired":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_adds_vehicle_type_product_on_STOP_when_program_selector_relay_is_online__then_turns_off_cleaner_and_machine_relays":0.62,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_skips_vehicle_type_product_add_when_program_selector_relay_is_offline_and_only_disables_configured_relays":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_bills_primary_product_when_selector_relay_is_online_even_if_relay_output_is_off":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneInvoiceModeBillingTest::__pest_evaluable_it_bills_manual_self_serve_stop_using_full_elapsed_minutes_without_included_minute_reduction":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneInvoiceModeBillingTest::__pest_evaluable_it_keeps_included_minute_reduction_for_automatic_mode":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_sends_Slack_on_first_dtmf_input_captured_within_the_300_second_window":0.005,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_does_not_send_Slack_when_dtmf_input_repeats_without_change":0.008,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_sends_Slack_again_when_dtmf_input_changes_within_the_window":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_keeps_gathering_and_does_not_hang_up_before_300_seconds_have_elapsed":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_announces_timeout_waits_10_seconds_and_sends_hangup_once_at_or_after_300_seconds":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_keeps_polling_until_terminal_status_and_only_then_finalizes":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_finalizes_immediately_when_webhook_payload_is_already_terminal_before_timeout_logic":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_does_not_duplicate_timeout_or_hangup_actions_across_retries_and_lock_contention":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_keeps_state_when_polling_fails_so_completion_is_not_falsely_reported":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_sends_Slack_when_dtmf_input_repeats_without_change":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_answers_immediately_once_and_does_not_re_answer_on_subsequent_webhook_retries":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_configures_gather_with_retry_loop_semantics_until_input_is_entered":0.004,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_sends_Slack_when_gather_result_provides_keys_field_instead_of_dtmf":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_sends_Slack_when_gather_conditions_variable_keys_carries_the_entered_value":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_configures_gather_to_check_every_2_seconds_with_retry_loop_semantics_until_input_is_entered":0,"P\\Tests\\Unit\\Users\\UsersAutomaticGetTargetUserFromRequestTest::__pest_evaluable_it_ignores_non_numeric_customer__number_values_from_request":0.042,"P\\Tests\\Unit\\Users\\UsersAutomaticGetTargetUserFromRequestTest::__pest_evaluable_it_casts_numeric_customer__number_strings_to_int_before_lookup":0,"P\\Tests\\Unit\\Users\\UsersAutomaticGetTargetUserFromRequestTest::__pest_evaluable_it_prefers_user__id_when_both_user__id_and_customer__number_are_valid":0,"P\\Tests\\Unit\\Users\\UsersAutomaticGetTargetUserFromRequestTest::__pest_evaluable_it_falls_back_to_customer__number_when_user__id_is_invalid":0,"P\\Tests\\Unit\\Users\\UsersAutomaticGetTargetUserFromRequestTest::__pest_evaluable_it_normalizes_request_identifiers_before_user_lookups":0.005,"P\\Tests\\Unit\\Users\\UsersAutomaticGetTargetUserFromRequestTest::__pest_evaluable_it_rejects_non_positive_and_non_digit_request_values":0.003,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRoutePaginationFallbackTest::__pest_evaluable_it_uses_pagination_results_when_present":0.006,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRoutePaginationFallbackTest::__pest_evaluable_it_falls_back_to_collection_count_when_pagination_metadata_is_missing":0,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRoutePaginationFallbackTest::__pest_evaluable_it_returns_zero_when_neither_pagination_nor_collection_is_available":0,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRoutePaginationFallbackTest::__pest_evaluable_it_counts_object_based_collections_when_pagination_metadata_is_missing":0,"P\\Tests\\Unit\\Invoicing\\EconomicPaymentTermsRouteCollectionExtractionTest::__pest_evaluable_it_uses_collection_when_present":0,"P\\Tests\\Unit\\Invoicing\\EconomicPaymentTermsRouteCollectionExtractionTest::__pest_evaluable_it_falls_back_to_paymentTerms_when_collection_is_missing":0,"P\\Tests\\Unit\\Invoicing\\EconomicPaymentTermsRouteCollectionExtractionTest::__pest_evaluable_it_supports_top_level_array_payloads":0,"P\\Tests\\Unit\\Invoicing\\EconomicPaymentTermsRouteCollectionExtractionTest::__pest_evaluable_it_returns_an_empty_array_when_no_known_collection_shape_exists":0,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_uses_grant__2_in_economic__endpoint__t_when_explicitly_requested_and_configured":0,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_falls_back_to_grant__1_in_economic__endpoint__t_when_grant__2_is_missing":0.003,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_throws_for_missing_required_primary_grant_in_economic__endpoint__t":0.002,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_throws_for_missing_app_secret_in_economic__endpoint__t":0,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_uses_grant__2_in_legacy_economic__m_when_available":0,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_falls_back_to_grant__1_in_legacy_economic__m_when_grant__2_is_missing":0.002,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_throws_for_missing_required_primary_grant_in_legacy_economic__m":0.002,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_throws_for_missing_app_secret_in_legacy_economic__m":0,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRoutePaginationFallbackTest::__pest_evaluable_it_uses_unfiltered_total_when_no_customer_filters_are_active":0.004,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRoutePaginationFallbackTest::__pest_evaluable_it_uses_filtered_total_when_search_is_active":0,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRoutePaginationFallbackTest::__pest_evaluable_it_uses_filtered_total_when_barred_filter_is_active":0,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRoutePaginationFallbackTest::__pest_evaluable_it_treats__null__search_and_barred_values_as_no_filter":0,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRoutePaginationFallbackTest::__pest_evaluable_it_falls_back_to_filtered_total_when_unfiltered_total_is_missing":0,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRouteEconomicFailureHandlingTest::__pest_evaluable_it_maps_e_conomic_integration_failures_in_customer_listing_to_explicit_502_responses":0.007,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRouteEconomicFailureHandlingTest::__pest_evaluable_it_logs_LIST__CUSTOMERS_success_only_after_pagination_and_customer_mapping_are_completed":0.005,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRouteEconomicFailureHandlingTest::__pest_evaluable_it_guards_against_malformed_customer_list_payloads_before_calling_paginate":0.006,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_throws_deterministic_upstream_exceptions_for_non_2xx_endpoint_trait_responses":0,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_throws_deterministic_upstream_exceptions_for_non_2xx_legacy_economic__m_responses":0,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_returns_raw_payload_unchanged_on_successful_HTTP_statuses":0,"P\\Tests\\Unit\\Invoicing\\EconomicCustomersListResponseValidationTest::__pest_evaluable_it_accepts_valid_list_payloads_that_include_collection_and_pagination_results":0,"P\\Tests\\Unit\\Invoicing\\EconomicCustomersListResponseValidationTest::__pest_evaluable_it_throws_when_pagination_is_missing_from_the_response_payload":0,"P\\Tests\\Unit\\Invoicing\\EconomicCustomersListResponseValidationTest::__pest_evaluable_it_throws_when_upstream_responds_with_an_error_shaped_payload":0,"P\\Tests\\Unit\\Router\\RouterThrowableHandlingTest::__pest_evaluable_it_catches_throwables_during_auto_route_loading_and_maps_them_to_internal_server_errors":0.039,"P\\Tests\\Unit\\Users\\EconomicCustomerZeroHandlingTest::__pest_evaluable_it_does_not_request_e_conomic_customer_data_when_customer_number_is_zero":0.004,"P\\Tests\\Unit\\Users\\EconomicCustomerZeroHandlingTest::__pest_evaluable_it_short_circuits_e_conomic_customer_lookup_for_non_positive_customer_numbers":0.003,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueRouteRegistrationTest::__pest_evaluable_it_registers_queued_economic_invoice_endpoints_in_economicInvoiceRoute":0.013,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueRouteRegistrationTest::__pest_evaluable_it_registers_collected_invoice_queue_endpoints_in_orderInvoicesRoute":0.011,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueSchemaBootstrapTest::__pest_evaluable_it_defines_economic_transfer_queue_jobs_schema_bootstrap_table_and_tracking_columns":0.011,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueSchemaBootstrapTest::__pest_evaluable_it_provides_queue_processor_class_constants_and_processing_entrypoint":0.004,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueCronIntegrationTest::__pest_evaluable_it_registers_economic_transfer_queue_cron_task_and_handler":0.007,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueOpenApiSpecTest::__pest_evaluable_it_documents_economic_transfer_queue_paths_in_openapi":0.013,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueOpenApiSpecTest::__pest_evaluable_it_documents_economic_transfer_queue_schemas_in_openapi":0.01,"P\\Tests\\Unit\\Invoicing\\EconomicTransferOrderItemSkipTest::__pest_evaluable_it_skips_order_items_with_zero_quantity_for_e_conomic_export":0,"P\\Tests\\Unit\\Invoicing\\EconomicTransferOrderItemSkipTest::__pest_evaluable_it_skips_order_items_with_zero_price_for_e_conomic_export":0.006,"P\\Tests\\Unit\\Invoicing\\EconomicTransferOrderItemSkipTest::__pest_evaluable_it_keeps_positive_quantity_and_price_items_billable_for_e_conomic_export":0,"P\\Tests\\Unit\\Invoicing\\EconomicTransferOrderItemSkipTest::__pest_evaluable_it_wires_zero_cost_and_zero_quantity_skip_guard_into_transfer_line_builder":0.048,"P\\Tests\\Unit\\Invoicing\\EconomicInvoiceDraftZeroItemSkipWiringTest::__pest_evaluable_it_skips_zero_cost_and_zero_quantity_items_in_legacy_economic_draft_helper":0.023,"P\\Tests\\Unit\\Invoicing\\EconomicTransferOrderItemSkipTest::__pest_evaluable_it_skips_malformed_order_item_payloads_for_e_conomic_export_safety":0,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueHardeningTest::__pest_evaluable_it_hardens_transfer_queue_with_type_validation_retry_caps_and_stale_lock_recovery":0.043,"P\\Tests\\Unit\\Router\\AutoloadRedisCacheValidationTest::__pest_evaluable_it_validates_cached_autoload_paths_before_returning_and_clears_stale_cache_entries":0.008,"P\\Tests\\Unit\\Orders\\OrdersRegistrationDateRangeQueryTest::__pest_evaluable_it_applies_created__at_bounds_directly_in_SQL_when_filtering_orders_by_registration_number":0.001,"P\\Tests\\Unit\\Orders\\OrdersRegistrationDateRangeQueryTest::__pest_evaluable_it_rejects_an_inverted_date_range_for_registration_lookups":0,"P\\Tests\\Unit\\Orders\\OrdersRegistrationDateRangeQueryTest::__pest_evaluable_it_returns_early_when_registration_number_is_blank":0.004,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueCronIntegrationTest::__pest_evaluable_it_wires_queue_worker_class_loading_for_CLI_queue_action":0.006,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_guards_all_economic_invoice_queue_endpoints_before_constructing_queue_service":0.012,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_guards_all_collected_invoice_queue_endpoints_before_constructing_queue_service":0.011,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_uses_a_consistent_unavailable_service_contract_for_missing_queue_dependencies":0.009,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_gracefully_handles_unavailable_queue_dependencies_on_collected_invoice_queue_endpoints":0.005,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceEconomicQueueResponseContractTest::__pest_evaluable_it_returns_the_queue_job_id_in_POST__collected_invoices_economic_enqueue_response":0.204,"P\\Tests\\Unit\\Invoicing\\UserCollectedInvoiceUpdateRouteValidationTest::__pest_evaluable_it_requires_id_and_at_least_one_mutable_field_for_PUT__collected_invoices_in_user_route":0.019,"P\\Tests\\Unit\\Invoicing\\UserCollectedInvoiceUpdateRouteValidationTest::__pest_evaluable_it_supports_independent_po__number_and_closed__at_updates_for_PUT__collected_invoices_in_user_route":0.008,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceEconomicQueueResponseContractTest::__pest_evaluable_it_returns_queued_contract_for_POST__collected_invoices_stripe_book":0.002,"P\\Tests\\Unit\\Invoicing\\EconomicDraftQueueOnlyRouteBehaviorTest::__pest_evaluable_it_keeps_order_draft_export_route_queue_only":0.006,"P\\Tests\\Unit\\Invoicing\\EconomicDraftQueueOnlyRouteBehaviorTest::__pest_evaluable_it_keeps_collected_invoice_draft_producing_routes_queue_only_in_orderInvoicesRoute":0.004,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_guards_collected_invoice_and_stripe_draft_producing_endpoints_before_constructing_queue_service":0.004,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueOpenApiSpecTest::__pest_evaluable_it_documents_unavailable_queue_dependency_responses_for_async_economic_transfer_endpoints":0.007,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueuePayloadValidationTest::__pest_evaluable_it_normalizes_order_payloads_to_strict_positive_integer_ids":0,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueuePayloadValidationTest::__pest_evaluable_it_normalizes_collected_invoice_payload_booleans_to_strict_bool_values":0,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueuePayloadValidationTest::__pest_evaluable_it_rejects_invalid_transfer_payloads_before_enqueue_write_attempts":0,"P\\Tests\\Integration\\Invoicing\\EconomicTransferQueueIntegrationTest::__pest_evaluable_it_processes_queued_transfer_jobs_to_completion":0.016,"P\\Tests\\Integration\\Invoicing\\EconomicTransferQueueIntegrationTest::__pest_evaluable_it_deduplicates_active_jobs_per_transfer_target":0.016,"P\\Tests\\Integration\\Invoicing\\EconomicTransferQueueIntegrationTest::__pest_evaluable_it_rejects_invalid_payloads_without_inserting_queue_rows":0.013,"P\\Tests\\Integration\\Invoicing\\EconomicTransferQueueIntegrationTest::__pest_evaluable_it_supports_fail_retry_and_reprocess_lifecycle_transitions":0.014,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_keeps_queue_guards_on_economic_invoice_queue_status_and_retry_routes":0.01,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_supports_synchronous_fallback_branches_before_queue_enqueue_on_economic_invoice_export_routes":0.005,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_keeps_queue_status_endpoints_guarded_while_collected_invoice_export_routes_support_synchronous_fallback":0.01,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_uses_a_consistent_unavailable_service_contract_for_queue_status_lifecycle_endpoints":0.057,"P\\Tests\\Unit\\Invoicing\\EconomicDraftQueueOnlyRouteBehaviorTest::__pest_evaluable_it_supports_synchronous_fallback_and_queued_processing_for_order_draft_export_route":0.006,"P\\Tests\\Unit\\Invoicing\\EconomicDraftQueueOnlyRouteBehaviorTest::__pest_evaluable_it_supports_synchronous_fallback_and_queued_processing_for_collected_invoice_draft_producing_routes":0.006,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceEconomicQueueResponseContractTest::__pest_evaluable_it_documents_both_synchronous_fallback_and_queued_response_contracts_for_POST__collected_invoices_economic":0.165,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceEconomicQueueResponseContractTest::__pest_evaluable_it_documents_both_synchronous_fallback_and_queued_response_contracts_for_POST__collected_invoices_stripe_book":0.018,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueOpenApiSpecTest::__pest_evaluable_it_documents_200_fallback_plus_202_queue_contracts_for_export_endpoints_and_keeps_503_on_queue_lifecycle_endpoints":0.009,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueRouteHardeningTest::__pest_evaluable_it_returns_pagination_metadata_and_strict_status_handling_for_collected_invoice_queue_list":0.006,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueRouteHardeningTest::__pest_evaluable_it_enforces_retry_constraints_for_collected_invoice_queue_jobs_before_retry_execution":0.008,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueOpenApiSpecTest::__pest_evaluable_it_documents_collected_queue_list_metadata_and_strict_status_filter_enum_in_openapi":0,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueDetailsSummaryBuilderTest::__pest_evaluable_it_builds_a_completed_collected_invoice_queue_summary_from_payload_and_result":0.029,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueDetailsSummaryBuilderTest::__pest_evaluable_it_prefers_queue_error_messages_for_failed_jobs_and_keeps_null_safe_outcome_fields":0,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueDetailsSummaryBuilderTest::__pest_evaluable_it_uses_deterministic_status_message_fallback_when_no_explicit_message_exists":0,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueDetailsSummaryBuilderTest::__pest_evaluable_it_handles_object_payload_result_values_and_malformed_fields_without_throwing":0,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueWorkerTickRouteTest::__pest_evaluable_it_ticks_collected_invoice_transfer_queue_from_queue_list_and_status_routes":0.008,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueWorkerTickRouteTest::__pest_evaluable_it_ticks_order_transfer_queue_from_draft_and_invoice_status_routes":0.009,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodQueueOverlayTest::__pest_evaluable_it_marks_queued_transactions_and_clears_requires__action_when_all_actionable_work_is_already_queued":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodQueueOverlayTest::__pest_evaluable_it_keeps_requires__action_true_when_a_customer_still_has_unqueued_actionable_transactions":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodQueueOverlayTest::__pest_evaluable_it_blocks_fixed_pricing_or_subscription_customers_with_no_transactions_when_a_relevant_queue_job_exists":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerCommandQueueTest::__pest_evaluable_it_queues_admin_commands__exposes_agent_poll_result_handlers__and_keeps_heartbeats_from_mutating_discovery_state":0.003,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerCommandQueueTest::__pest_evaluable_it_defines_the_dispatchable_gateway_guard_on_the_loaded_manager_class":0.009,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerHeartbeatStatusTest::__pest_evaluable_it_derives_effective_gateway_status_from_heartbeat_freshness with data set \"dataset \"recent heartbeat stays online\"\"":0.001,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerHeartbeatStatusTest::__pest_evaluable_it_derives_effective_gateway_status_from_heartbeat_freshness with data set \"dataset \"late heartbeat degrades after one minute\"\"":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerHeartbeatStatusTest::__pest_evaluable_it_derives_effective_gateway_status_from_heartbeat_freshness with data set \"dataset \"stale heartbeat goes offline after five minutes\"\"":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerHeartbeatStatusTest::__pest_evaluable_it_derives_effective_gateway_status_from_heartbeat_freshness with data set \"dataset \"explicit offline reports stay offline even when heartbeat is fresh\"\"":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerHeartbeatStatusTest::__pest_evaluable_it_derives_effective_gateway_status_from_heartbeat_freshness with data set \"dataset \"missing heartbeat is treated as offline\"\"":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerHeartbeatStatusTest::__pest_evaluable_it_marks_ready_discovery_as_stale_when_the_gateway_heartbeat_has_expired":0.727,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayRouteWiringTest::__pest_evaluable_it_registers_the_edge_gateway_management_REST_endpoints":0.021,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayRouteWiringTest::__pest_evaluable_it_registers_public_installer__claim__heartbeat__command_polling__and_internal_broker_auth_endpoints":0.004,"P\\Tests\\Unit\\Selfserve\\EdgeBrokerClientConfigTest::__pest_evaluable_it_uses_the_same_default_broker_url_and_shared_secret_fallback_as_the_docker_stack":0.267,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_builds_install_script_urls_with_forwarded_https_scheme_when_proxied":0.336,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_appends_forwarded_ports_when_the_forwarded_host_omits_them":0.28,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_infers_https_for_the_staging_api_host_when_only_the_https_port_is_present":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_prefers_EDGE__PUBLIC__API__URL_when_explicitly_configured":1.003,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_normalizes_public_broker_overrides_to_https_and_browser_shell_urls_to_wss":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_keeps_localhost_broker_overrides_on_plain_http_and_ws_for_local_development":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_includes_node_pty_build_prerequisites_in_the_generated_install_script":0.007,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_prefers_EDGE__PUBLIC__API__URL_when_explicitly_configured_and_derives_the_broker_from_the_api_origin":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_normalizes_public_broker_overrides_to_https__strips_paths__and_browser_shell_urls_to_wss":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerHeartbeatStatusTest::__pest_evaluable_it_merges_incoming_heartbeat_metadata_with_existing_gateway_metadata":0.006,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayRouteWiringTest::__pest_evaluable_it_registers_the_v2_operator_facing_edge_gateway_routes":0.008,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayRouteWiringTest::__pest_evaluable_it_registers_PHP_edge_agent_routes_for_operations_and_legacy_relay_command_polling":0.027,"P\\Tests\\Unit\\Selfserve\\EdgeGatewaySchemaBootstrapTest::__pest_evaluable_it_defines_the_v2_edge_gateway_schema_bootstrap_tables":0.006,"P\\Tests\\Unit\\Selfserve\\EdgeGatewaySchemaBootstrapTest::__pest_evaluable_it_stores_operation_metadata_and_event_timelines_for_management_workflows":0.005,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayUpdateLifecycleTest::__pest_evaluable_it_builds_the_installer_around_the_PHP_agent_artifacts_and_management_polling_config":0.011,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayUpdateLifecycleTest::__pest_evaluable_it_exposes_update_payload__credential_rotation__and_operation_endpoints_without_shell_transport_wiring":0.013,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerCommandQueueTest::__pest_evaluable_it_keeps_relay_dispatch_and_discovery_queueing_on_the_edge_gateway_manager":0.02,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerCommandQueueTest::__pest_evaluable_it_loads_relay_command_helpers_on_the_manager_and_gateway_operations_on_the_dedicated_service":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerHeartbeatStatusTest::__pest_evaluable_it_derives_relay_fallback_and_transport_health_details_without_shell_or_update_runtime_state":0.837,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_resolves_edge_agent_artifacts_from_the_source_tree_layout":0.445,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_includes_the_container_mounted_artifact_directory_as_a_candidate":0.021,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_reads_install_artifacts_through_the_shared_locator":0.019,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_builds_update_payloads_with_checksums_from_resolved_artifact_paths":2.276,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_resolves_edge_agent_artifacts_from_a_supported_runtime_layout":0.273,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_builds_install_script_urls_with_the_PHP_agent_artifacts_and_forwarded_https_scheme":0.001,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_explains_the_legacy_dist_mount_mismatch_when_php_artifacts_are_unavailable":0.005,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_prioritizes_mounted_and_baked_in_artifact_directories_before_repo_fallbacks":0.022,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_falls_back_to_baked_in_artifacts_when_the_mount_path_is_absent":0.013,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_prioritizes_router_resources_before_mounted_and_baked_in_artifact_directories":0,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_lists_orders_for_an_admin_scoped_user_and_limits_the_results_to_the_permitted_departments":1.109,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_lists_only_the_targeted_customer_orders_for_subuser_sessions":2.935,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_returns_the_current_auth_and_permission_failures_when_order_listing_is_not_allowed":1.375,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_creates_orders_through_the_real_endpoint":0.982,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_rejects_invalid_order_creation_requests":3.423,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_updates_orders_through_the_primary_endpoint":1.13,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_reassigns_invoice_collections_when_changing_an_order_across_the_draft_customer_boundary":1.615,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_supports_legacy_field_value_metadata_updates_through_the_primary_endpoint":5.592,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_rejects_invalid_updates_through_the_primary_order_endpoint":1.29,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_updates_orders_through_the_legacy_alias_endpoint":1.517,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_supports_legacy_field_value_metadata_updates_through_the_alias_endpoint":4.136,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_rejects_invalid_updates_through_the_legacy_alias_endpoint":0.512,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_rejects_unsupported_legacy_field_value_updates_on_both_update_endpoints":0.965,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_deletes_orders_through_the_real_endpoint":1.045,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_rejects_invalid_order_delete_requests":1.64,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_regenerates_attached_wash_certificates_when_certificate_metadata_changes_through_the_primary_endpoint":3.683,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_regenerates_attached_wash_certificates_for_legacy_field_value_updates_through_the_alias_endpoint":3.194,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayOperationLegacySchemaCompatibilityTest::__pest_evaluable_it_keeps_the_legacy_operation__type_column_compatible_with_v2_operation_queueing":0.022,"P\\Tests\\Unit\\Bookings\\OrderBookingsListCacheTest::__pest_evaluable_it_uses_sane_ttl_defaults_and_clamps_negative_ttl_to_zero":0,"P\\Tests\\Unit\\Bookings\\OrderBookingsListCacheTest::__pest_evaluable_it_builds_deterministic_keys_for_equivalent_contexts":0,"P\\Tests\\Unit\\Bookings\\OrderBookingsListCacheTest::__pest_evaluable_it_stores_and_retrieves_full_order_bookings_payloads":0.001,"P\\Tests\\Unit\\Bookings\\OrderBookingsListCacheTest::__pest_evaluable_it_ignores_malformed_cached_payloads_and_clears_order_bookings_list_caches":0.001,"P\\Tests\\Unit\\Bookings\\OrderBookingsRouteCacheWiringTest::__pest_evaluable_it_caches_the_paginated_order_bookings_list_response_and_invalidates_it_on_booking_changes":0.051,"P\\Tests\\Unit\\Bookings\\VehicleSearchBookedMetadataRouteContractTest::__pest_evaluable_it_keeps_booked_vehicle_search_metadata_aligned_with_filtered_pending_order_bookings":0.052,"P\\Tests\\Unit\\Bookings\\OrderBookingsCountsCacheTest::__pest_evaluable_it_uses_sane_ttl_defaults_and_clamps_negative_ttl_to_zero":0.001,"P\\Tests\\Unit\\Bookings\\OrderBookingsCountsCacheTest::__pest_evaluable_it_builds_deterministic_keys_for_equivalent_count_contexts":0.039,"P\\Tests\\Unit\\Bookings\\OrderBookingsCountsCacheTest::__pest_evaluable_it_stores_and_retrieves_normalized_booking_counts":0,"P\\Tests\\Unit\\Bookings\\OrderBookingsCountsCacheTest::__pest_evaluable_it_ignores_malformed_payloads_and_clears_order_bookings_count_caches":0,"P\\Tests\\Unit\\Bookings\\OrderBookingsCountsRouteWiringTest::__pest_evaluable_it_adds_a_cached_order_bookings_counts_endpoint_and_invalidates_it_on_booking_changes":0.04,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayFleetUsageStatisticsTest::__pest_evaluable_it_summarizes_fleet_usage_statistics_for_the_dashboard_landing_view":0,"P\\Tests\\Api\\ApiCoverageManifestTest::__pest_evaluable_it_keeps_every_selected_API_operation_covered_by_happy_path_and_failure_tests":0.271,"P\\Tests\\Api\\ApiCoverageManifestTest::__pest_evaluable_it_keeps_the_OpenAPI_manifest_entries_aligned_with_the_API_spec":0.097,"P\\Tests\\Api\\ApiFixturesCleanupTest::__pest_evaluable_it_removes_generated_customer_traces_during_fixture_cleanup":8.099,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_logs_in_with_valid_customer_credentials":0,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_rejects_invalid_login_payloads_and_credentials":0,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_returns_the_cached_auth_session_payload_for_a_valid_token":0,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_includes_economic_runtime_config_for_uncached_auth_sessions":0,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_rejects_invalid_auth_session_tokens":0,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_logs_out_and_invalidates_the_token_for_future_session_calls":0,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_logs_out_and_invalidates_cached_subuser_sessions":0,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_rejects_invalid_logout_tokens":0,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_returns_the_raw_202_gather_webhook_contract_over_HTTP":0.788,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_still_prompts_for_department_selection_when_only_one_department_is_eligible":0.732,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_accepts_the_legacy_initial_webhook_body_with_top_level_call_identifiers":0.692,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_returns_native_flow_gather_data_after_a_top_level_department_selection_when_distinct_gate_choices_exist":1.515,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_opens_the_gate_immediately_after_a_top_level_department_selection_when_entrance_and_exit_share_the_same_gate":1.719,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_uses_a_multi_digit_gather_contract_when_10_departments_are_eligible":0.587,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_returns_a_raw_400_transport_error_for_malformed_webhook_payloads":0.419,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_lists_only_visible_departments_and_can_return_a_single_department_with_the_slack_webhook":1.048,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_rejects_department_listing_when_the_permission_is_missing":0.378,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_creates_departments_through_the_real_endpoint":0.59,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_rejects_invalid_department_create_requests":1.554,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_updates_departments_through_the_real_endpoint":0.788,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_rejects_invalid_department_update_requests":1.552,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_lists_department_categories_for_a_department":1.006,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_rejects_invalid_department_category_requests":1.191,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_lists_the_draft_customer_config_entry_in_economic_config_responses":0,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_round_trips_the_draft_customer_config_value_through_economic_config_updates":0,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_rejects_order_draft_exports_for_the_configured_draft_customer":0,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_rejects_booked_invoice_exports_for_the_configured_draft_customer":0,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_rejects_collected_invoice_exports_for_the_configured_draft_customer":0,"P\\Tests\\Api\\PingApiTest::__pest_evaluable_it_returns_the_ping_contract":0.877,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_returns_a_setup_required_error_when_department_terminal_readers_are_requested_without_terminal_setup":1.281,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_sends_a_Stripe_invoice_by_email_and_persists_the_hosted_invoice_association":5.434,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_returns_a_conflict_when_a_Stripe_hosted_invoice_is_already_active_for_the_order":4.756,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_allows_sending_a_new_Stripe_hosted_invoice_when_the_existing_association_is_already_terminal":3.943,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_voids_an_unpaid_Stripe_hosted_invoice_and_clears_the_local_order_association":3.746,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_refuses_to_cancel_a_paid_Stripe_hosted_invoice":4.131,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_returns_a_setup_required_error_when_creating_a_payment_intent_for_a_department_without_terminal_setup":0.726,"P\\Tests\\Api\\VehiclesApiTest::__pest_evaluable_it_returns_the_newest_vehicle_last__order__id_that_still_has_order_items":1.326,"P\\Tests\\Api\\VehiclesApiTest::__pest_evaluable_it_returns_a_null_vehicle_last__order__id_when_no_order_with_items_exists":1.159,"P\\Tests\\Unit\\Users\\EconomicCustomerModelParsingTest::__pest_evaluable_it_parses_cached_economic_customer_payloads_that_use_snake__case_customer__number":0,"P\\Tests\\Unit\\Users\\EconomicCustomerModelParsingTest::__pest_evaluable_it_leaves_the_economic_customer_model_empty_when_no_valid_customer_number_is_present":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayFleetUsageStatisticsTest::__pest_evaluable_it_derives_fleet_usage_directly_from_cached_gateway_row_summaries":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_builds_install_script_urls_with_the_compose_edge_gateway_artifacts_and_forwarded_https_scheme":1.031,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayMetadataUpdateContractTest::__pest_evaluable_it_adds_a_gateway_metadata_update_endpoint_with_label_and_primary_assignment_fields":0.009,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayMetadataUpdateContractTest::__pest_evaluable_it_reassigns_department_primary_gateways_through_dedicated_manager_helpers":0.006,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayShellPollingTransportTest::__pest_evaluable_it_removes_shell_access_from_the_edge_gateway_HTTP_contracts":0.007,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayUpdateLifecycleTest::__pest_evaluable_it_builds_the_installer_around_the_compose_stack_artifacts_and_management_polling_config":0.06,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayViewCacheTest::__pest_evaluable_it_uses_sane_ttl_defaults_and_deterministic_cache_keys":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayViewCacheTest::__pest_evaluable_it_stores_and_retrieves_cached_list_and_detail_payloads":0.001,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayViewCacheTest::__pest_evaluable_it_syncs_gateway_snapshots_into_cached_list_payloads_and_refreshes_fleet_usage":0.001,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayViewCacheTest::__pest_evaluable_it_removes_deleted_gateways_from_cached_list_and_detail_payloads":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayUpdateLifecycleTest::__pest_evaluable_it_exposes_update_payload__credential_rotation__cancel_endpoints__and_operation_endpoints_without_shell_transport_wiring":0.02,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayModuleRouteWiringTest::__pest_evaluable_it_registers_module_scoped_edge_gateway_operator_routes":0.008,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayModuleRouteWiringTest::__pest_evaluable_it_registers_edge_gateway_module_config_endpoints":0.006,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayModuleRouteWiringTest::__pest_evaluable_it_registers_edge_gateway_config_endpoints_from_the_module_route_directory":0.015,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayModuleRouteWiringTest::__pest_evaluable_it_keeps_only_the_module_facade_in_the_global_classes_directory_and_conditionally_loads_module_routes":0.007,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayInstallSessionLifecycleTest::__pest_evaluable_it_caps_install_session_diagnostics_and_events_while_preserving_the_first_start_timestamp":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayInstallSessionLifecycleTest::__pest_evaluable_it_clears_terminal_failure_details_after_a_successful_claim_update":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayInstallSessionLifecycleTest::__pest_evaluable_it_marks_expired_non_terminal_install_sessions_as_terminal_when_read_back":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_builds_websocket_broker_urls_on_the_traefik_broker_path":0.965,"P\\Tests\\Unit\\Selfserve\\DepartmentGateConfigRelayTest::__pest_evaluable_it_validates_relay_gate_configs_and_keeps_relay_specific_fields_in_the_payload":0,"P\\Tests\\Unit\\Selfserve\\DepartmentGateConfigRelayTest::__pest_evaluable_it_rejects_relay_gate_configs_without_a_logical_relay_id":0,"P\\Tests\\Unit\\Bird\\DepartmentGatesRelayOpenTest::__pest_evaluable_it_dispatches_relay_backed_gates_through_the_edge_gateway_relay_manager":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayDepartmentWorkspaceContractTest::__pest_evaluable_it_defines_the_department_hardware_workspace_service_payload_surface":0.033,"P\\Tests\\Unit\\Selfserve\\PlateScannerWorkspaceContractTest::__pest_evaluable_it_adds_lane_aware_scanner_management_and_a_dedicated_rotate_key_action":0.01,"P\\Tests\\Unit\\Selfserve\\PlateScannerWorkspaceContractTest::__pest_evaluable_it_uses_the_scanner_default_lane_before_requiring_an_explicit_lane__id_in_machine_button_webhooks":0.004,"P\\Tests\\Unit\\Selfserve\\GatewayShellyTransportTest::__pest_evaluable_it_maps_gateway_relay_status_responses_into_the_Shelly_cloud_payload_shape":0,"P\\Tests\\Unit\\Selfserve\\GatewayShellyTransportTest::__pest_evaluable_it_maps_gateway_relay_switch_responses_into_the_Shelly_cloud_payload_shape":0,"P\\Tests\\Unit\\Selfserve\\GatewayShellyTransportTest::__pest_evaluable_it_requires_a_valid_department_id_for_gateway_transport_requests":0,"P\\Tests\\Unit\\Selfserve\\GatewayShellyTransportTest::__pest_evaluable_it_rejects_unsupported_gateway_transport_endpoints":0,"P\\Tests\\Unit\\Selfserve\\GatewayShellyTransportTest::__pest_evaluable_it_surfaces_binding_lookup_failures_while_resolving_relay_state_through_the_gateway_transport":0,"P\\Tests\\Unit\\Selfserve\\GatewayShellyTransportTest::__pest_evaluable_it_surfaces_offline_gateway_failures_while_dispatching_relay_switch_commands":0,"P\\Tests\\Api\\PlateScannersApiTest::__pest_evaluable_it_returns_the_updated_lane_id_after_editing_a_scanner_whose_null_lane_was_already_cached":21.835,"P\\Tests\\Api\\PlateScannersApiTest::__pest_evaluable_it_rejects_plate_scanner_edits_when_the_permission_is_missing":7.837,"P\\Tests\\Unit\\Selfserve\\ShellyRelayInventoryTest::__pest_evaluable_it_normalizes_owned_Shelly_devices_into_relay_select_options":0,"P\\Tests\\Unit\\Selfserve\\ShellyRelayInventoryTest::__pest_evaluable_it_fails_fast_when_Shelly_inventory_does_not_include_owned_devices_status":0,"P\\Tests\\Unit\\Selfserve\\DepartmentLaneRelayOptionsRouteWiringTest::__pest_evaluable_it_registers_a_department_lane_relay_options_endpoint_backed_by_Shelly_inventory":0.032,"P\\Tests\\Unit\\Selfserve\\DepartmentLaneRelayNullificationRouteWiringTest::__pest_evaluable_it_nullifies_department_lane_relay_fields_when_blank_select_values_are_submitted":0.008,"P\\Tests\\Api\\EdgeGatewayAgentApiTest::__pest_evaluable_it_serves_installer_artifacts_and_recovers_gateway_runtime_status_after_fresh_heartbeats":109.487,"P\\Tests\\Api\\EdgeGatewayAgentApiTest::__pest_evaluable_it_polls_operations_and_commands__submits_results__and_records_broker_presence_for_task_pages":229.768,"P\\Tests\\Api\\EdgeGatewayAgentApiTest::__pest_evaluable_it_rejects_missing_and_invalid_edge_agent_tokens":12.815,"P\\Tests\\Api\\EdgeGatewayBrokerApiTest::__pest_evaluable_it_validates_broker_sessions_and_ingests_presence__telemetry__logs__and_shell_lifecycle_data":180.867,"P\\Tests\\Api\\EdgeGatewayBrokerApiTest::__pest_evaluable_it_builds_broker_backlog_and_completes_gateway_operations_through_broker_endpoints":147.749,"P\\Tests\\Api\\EdgeGatewayBrokerApiTest::__pest_evaluable_it_rejects_invalid_edge_broker_shared_secrets":6.832,"P\\Tests\\Api\\EdgeGatewayOperatorApiTest::__pest_evaluable_it_creates_install_tokens__tracks_installer_status__and_exposes_claimed_gateway_detail_to_authorized_operators":134.744,"P\\Tests\\Api\\EdgeGatewayOperatorApiTest::__pest_evaluable_it_manages_edge_gateway_metadata__bindings__operations__sessions__rotation__cutover__and_deletion":272.219,"P\\Tests\\Api\\EdgeGatewayOperatorApiTest::__pest_evaluable_it_rejects_operator_edge_routes_when_module_permission_or_department_access_is_missing":46.681,"P\\Tests\\Integration\\EdgeGateway\\EdgeGatewayBackendIntegrationTest::__pest_evaluable_it_persists_install_session_updates_and_derives_gateway_runtime_status_from_heartbeats":0.015,"P\\Tests\\Integration\\EdgeGateway\\EdgeGatewayBackendIntegrationTest::__pest_evaluable_it_assembles_tasks__logs__statistics__operations__commands__and_shell_lifecycle_state_from_persisted_records":0.019,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_builds_localhost_websocket_broker_urls_on_the_local_traefik_api_prefix":1.312,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_keeps_root_host_api_urls_unprefixed_when_the_request_is_not_under_the_local_api_alias":0.603,"P\\Tests\\Unit\\Customers\\CustomerMassImportServiceTest::__pest_evaluable_it_imports_a_matching_e_conomic_customer_into_the_local_system_when_no_local_record_exists":0.001,"P\\Tests\\Unit\\Customers\\CustomerMassImportServiceTest::__pest_evaluable_it_reports_when_the_local_customer_already_has_a_login_account":0,"P\\Tests\\Unit\\Customers\\CustomerMassImportServiceTest::__pest_evaluable_it_creates_a_new_e_conomic_customer_and_returns_a_created_result_for_new_rows":0,"P\\Tests\\Unit\\Customers\\CustomerMassImportServiceTest::__pest_evaluable_it_creates_the_economic_record_for_an_existing_local_account_when_no_matching_upstream_customer_exists":0,"P\\Tests\\Unit\\Customers\\CustomerMassImportServiceTest::__pest_evaluable_it_rejects_CVR_conflicts_when_the_upstream_customer_number_does_not_match_the_submitted_phone_number":0,"P\\Tests\\Unit\\Customers\\CustomerMassImportServiceTest::__pest_evaluable_it_registers_the_customer_import_route_and_wires_it_through_the_mass_import_service":0.009,"P\\Tests\\Unit\\Users\\UsersCustomerNamesCacheTest::__pest_evaluable_it_builds_customer_name_cache_payloads_from_economic_data_or_display_name_fallbacks":0,"P\\Tests\\Unit\\Users\\UsersCustomerNamesCacheTest::__pest_evaluable_it_guards_bulk_customer_name_cache_writes_behind_a_resolved_payload_check":0.003,"P\\Tests\\Api\\EdgeGatewayOperatorApiTest::__pest_evaluable_it_ignores_and_soft_deletes_edge_gateways_whose_department_no_longer_exists":35.946,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerHeartbeatStatusTest::__pest_evaluable_it_only_trusts_broker_presence_while_the_broker_heartbeat_is_fresh":1.458,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerHeartbeatStatusTest::__pest_evaluable_it_refreshes_broker_presence_from_broker_telemetry_heartbeats":0.006,"P\\Tests\\Unit\\Selfserve\\ShellyTransportResolverTest::__pest_evaluable_it_resolves_the_injected_gateway_transport_when_a_department_is_in_gateway_mode":0,"P\\Tests\\Unit\\Selfserve\\ShellyTransportResolverTest::__pest_evaluable_it_resolves_the_injected_cloud_transport_when_a_department_is_in_cloud_mode":0,"P\\Tests\\Unit\\Selfserve\\ShellyTransportResolverTest::__pest_evaluable_it_lets_relay_tests_override_the_department_transport_without_changing_department_mode":0,"P\\Tests\\Unit\\Selfserve\\ShellyRelayInventoryTest::__pest_evaluable_it_falls_back_to_local_device_and_control_names_when_Shelly_cloud_list_metadata_is_unavailable":0,"P\\Tests\\Unit\\Selfserve\\GatewayShellyTransportTest::__pest_evaluable_it_uses_local_only_gateway_dispatch_for_explicit_local_transport_overrides":0,"P\\Tests\\Unit\\Selfserve\\ShellyTransportResolverTest::__pest_evaluable_it_marks_non_injected_local_overrides_as_local_only_gateway_transport":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePortControllerTest::__pest_evaluable_it_opens_exit_port_by_switching_relay__out__id_on":0.001,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePortControllerTest::__pest_evaluable_it_opens_entrance_port_by_switching_relay__in__id_on":0,"P\\Tests\\Unit\\Selfserve\\GatewayShellyTransportTest::__pest_evaluable_it_forwards_Shelly_toggle__after_timers_to_gateway_relay_switches":0,"P\\Tests\\Unit\\Selfserve\\ShellyTransportResolverTest::__pest_evaluable_it_marks_non_injected_local_and_gateway_overrides_as_local_only_gateway_transport":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_preserves_local_gateway_diagnostic_metadata_on_relay_status_snapshots":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_includes_positive_relay_timers_in_Shelly_switch_payloads":0,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_applies_Shelly_transport_overrides_across_self_serve_relay_side_effect_routes":0.004,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayLegacyRouteShimTest::__pest_evaluable_it_keeps_guarded_legacy_root_shims_for_moved_edge_gateway_routes":0.025,"P\\Tests\\Integration\\EdgeGateway\\EdgeGatewayBackendIntegrationTest::__pest_evaluable_it_persists_gateway_cutover_relay_bindings_used_by_self_serve_Shelly_dispatch":0.015,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePortControllerTest::__pest_evaluable_it_passes_explicit_timer_values_when_opening_lane_gates":0,"P\\Tests\\Unit\\Selfserve\\ShellyRelayInventoryTest::__pest_evaluable_it_keeps_Shelly_1_Mini_Gen3_type__model__and_generation_aligned_with_Shelly_metadata":0,"P\\Tests\\Api\\EdgeGatewayBrokerApiTest::__pest_evaluable_it_rejects_shell_session_creation_while_broker_presence_is_unavailable":23.503,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayModuleRouteWiringTest::__pest_evaluable_it_registers_broker_settings_as_editable_edge_gateway_module_config":0.007,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_self_serve_session_management_endpoints_and_OpenAPI_coverage":0.017,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_keeps_self_serve_force_stop_distinct_from_normal_STOP_relay_and_gate_behavior":0.028,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_keeps_read_only_self_serve_preview_and_summary_refreshes_from_touching_relay_hardware":0.003,"P\\Tests\\Unit\\Selfserve\\SelfserveWashFlowMachineAllowedWiringTest::__pest_evaluable_it_separates_session_synchronization_from_relay_hardware_synchronization":0.016,"P\\Tests\\Unit\\Selfserve\\ShellyRealRequestGuardTest::__pest_evaluable_it_blocks_and_records_test_mode_Shelly_POST_requests_before_cURL_can_run":0.001,"P\\Tests\\Unit\\Selfserve\\ShellyRealRequestGuardTest::__pest_evaluable_it_blocks_and_records_test_mode_Shelly_GET_requests_before_cURL_can_run":0,"P\\Tests\\Unit\\Selfserve\\ZZZShellyGuardSafetyMetaTest::__pest_evaluable_it_did_not_record_any_real_Shelly_request_attempts_during_self_serve_tests":0,"P\\Tests\\Api\\SelfserveFixtureApiTest::__pest_evaluable_it_creates_a_comprehensive_self_serve_API_scenario_with_demo_relays":0,"P\\Tests\\Api\\SelfserveZZZShellyGuardApiTest::__pest_evaluable_it_did_not_record_any_real_Shelly_request_attempts_during_self_serve_API_tests":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_serializes_questions__conditions__tasks__scopes__and_gateways_into_one_graph":0.001,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_derives_studio_vehicle_type_lookup_rows_from_selectable_wash_products":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_applies_saved_layout_without_changing_graph_semantics":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_keeps_layout_loading_compatible_with_native_PDO_named_placeholders":0.011,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_builds_guided_simulator_debug_payload_with_blockers_and_canvas_annotations":0.001,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_resolves_simulator_gateway_service_bindings_from_lane_relay_slots":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_persists_allowed_services_without_relay_writes_for_pre_start_wash_setup":0,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_the_all_in_one_self_serve_studio_replacement_endpoints":0.015,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStartEntranceTimeoutTest::__pest_evaluable_it_continues_start_when_entrance_relay_dispatch_times_out_ambiguously":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStartEntranceTimeoutTest::__pest_evaluable_it_still_fails_start_for_non_timeout_entrance_relay_errors":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStartEntranceTimeoutTest::__pest_evaluable_it_parses_deferred_relay_side_effects_on_start_command_arguments":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStartEntranceTimeoutTest::__pest_evaluable_it_skips_cleaner_and_machine_relay_side_effects_when_start_asks_to_defer_them":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStartEntranceTimeoutTest::__pest_evaluable_it_keeps_cleaner_and_machine_relay_side_effects_for_normal_start_commands":0,"P\\Tests\\Unit\\Selfserve\\SelfservePropertyGatePermissionBypassTest::__pest_evaluable_it_allows_property_gate_commands_for_customers_with_an_active_wash_in_the_target_department":0,"P\\Tests\\Unit\\Selfserve\\SelfservePropertyGatePermissionBypassTest::__pest_evaluable_it_does_not_bypass_property_gate_permissions_without_a_positive_customer_number":0,"P\\Tests\\Unit\\Selfserve\\SelfservePropertyGatePermissionBypassTest::__pest_evaluable_it_does_not_bypass_property_gate_permissions_when_the_customer_has_no_active_wash_in_the_target_department":0,"P\\Tests\\Unit\\Selfserve\\SelfserveOpenApiSpecTest::__pest_evaluable_it_documents_the_all_in_one_self_serve_studio_replacement_API":0.007,"P\\Tests\\Unit\\Selfserve\\SelfserveNonOwnedVehicleWashAccessTest::__pest_evaluable_it_allows_own_permission_customers_to_preview_borrowed_registration_plates_without_ownership_checks":0.005,"P\\Tests\\Unit\\Selfserve\\SelfserveNonOwnedVehicleWashAccessTest::__pest_evaluable_it_allows_customer_scoped_answers_to_be_stored_for_borrowed_registration_plates":0.003,"P\\Tests\\Unit\\Selfserve\\SelfserveNonOwnedVehicleWashAccessTest::__pest_evaluable_it_does_not_apply_saved_answers_from_another_customer_for_the_same_registration_plate":0.027,"P\\Tests\\Unit\\Selfserve\\SelfserveNonOwnedVehicleWashAccessTest::__pest_evaluable_it_scopes_saved_self_serve_answers_by_customer_number_and_registration_plate":0.004,"P\\Tests\\Unit\\Selfserve\\SelfserveNonOwnedVehicleWashAccessTest::__pest_evaluable_it_loads_saved_answers_from_the_authenticated_customer_context_instead_of_the_plate_owner":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_does_not_count_shifts_without_punches_when_checkIn_checkOut_are_null":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_counts_overtime_minutes_when_a_saved_shift_end_extends_past_the_approved_original_end":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_does_not_count_removed_approved_time_when_a_saved_shift_end_is_shortened":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_caps_current_slot_hours_to_elapsed_minutes_and_zeroes_future_slots":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_counts_checked_in_shifts_without_checkOut_up_to_occurredUntil":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodRouteGuardsTest::__pest_evaluable_it_keeps_the_main_period_response_local_only_for_booked_state_and_customer_names":0.024,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodRouteGuardsTest::__pest_evaluable_it_streams_the_main_period_response_instead_of_encoding_the_full_payload_at_once":0.033,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodRouteGuardsTest::__pest_evaluable_it_maps_batched_period_transaction_rows_to_the_legacy_transaction_response_shape":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodRouteGuardsTest::__pest_evaluable_it_uses_batched_period_transactions_and_keyed_customer_maps_in_the_main_period_route":0.033,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodRouteGuardsTest::__pest_evaluable_it_falls_back_to_configured_e_conomic_default_department_for_missing_customer_default_department_in_distributions":0.021,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_round_trips_the_default_distribution_department_config_value_through_economic_config_updates":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_computes_MySQL_GTID_interval_counts_and_coverage_percentages":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_reports_empty_source_GTID_sets_as_caught_up":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_computes_Redis_offset_percentages_safely":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_computes_MariaDB_GTID_coverage_by_domain_sequence":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_normalizes_public_replication_kind_aliases":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_supports_MariaDB_prerequisites_without_requiring_Oracle_MySQL_variables":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_reports_MariaDB_specific_blockers_when_GTID_or_binary_logging_prerequisites_are_missing":0,"P\\Tests\\Unit\\Replication\\ReplicationSecretBoxTest::__pest_evaluable_it_encrypts_replication_secrets_without_storing_plaintext":0.002,"P\\Tests\\Unit\\Replication\\ReplicationSecretBoxTest::__pest_evaluable_it_builds_active_database_and_redis_config_from_encrypted_bootstrap_snapshots":0,"P\\Tests\\Unit\\Replication\\SuperuserReplicationRouteWiringTest::__pest_evaluable_it_registers_superuser_replication_endpoints_and_permissions":0.019,"P\\Tests\\Unit\\Replication\\SuperuserReplicationRouteWiringTest::__pest_evaluable_it_documents_replication_management_in_openapi":0.016,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_generates_replication_ready_MariaDB_compose_templates_without_embedding_secrets":0.001,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_generates_Redis_replica_compose_templates_with_primary_connection_placeholders":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_does_not_require_replica_SQL_threads_before_database_provisioning_configures_them":0.006,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_creates_the_generated_replication_user_on_the_primary_during_provisioning":0.007,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_detects_missing_database_tables_before_provisioning_a_preseeded_replica":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_allows_failed_replicas_to_be_removed_without_allowing_primary_or_healthy_replica_removal":0.033,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_seeds_MariaDB_replicas_in_place_instead_of_requiring_container_recreation":0.024,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_keeps_replication_operation_progress_schema_idempotent_for_existing_installs":0.039,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_limits_MariaDB_log_table_seeding_to_the_last_month":0.002,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_skips_log_table_data_during_MariaDB_seeding_and_replication":0.003,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_keeps_operational_log_tables_schema_only_during_MariaDB_seeding_and_replication":0.005,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_provisions_Redis_replicas_after_a_connectivity_only_preflight_and_reports_sync_progress":0.015,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_keeps_Redis_promotion_caught_up__durable__and_metadata_safe":0.007,"P\\Tests\\Unit\\Auth\\CreateTokenTest::__pest_evaluable_it_creates_auth_tokens_and_reports_missing_customer_users_clearly":0.271,"P\\Tests\\Unit\\Auth\\EconomicCreateCustomerResponseTest::__pest_evaluable_it_returns_the_raw_upstream_create_response_and_preserves_the_requested_payload":0,"P\\Tests\\Unit\\Auth\\RegisterCvrLegacyScriptTest::__pest_evaluable_it_keeps_the_legacy_register_cvr_route_harness_passing":0.043,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_returns_a_raw_202_gather_response_for_initial_department_selection":0.205,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_accepts_legacy_initial_webhook_payloads_with_top_level_call_identifiers":0.005,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_returns_a_flow_data_gather_payload_after_department_selection_in_native_flow_mode_when_distinct_gate_choices_exist":0.002,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_opens_the_gate_immediately_after_department_selection_when_entrance_and_exit_resolve_to_the_same_gate_in_native_flow_mode":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_returns_a_flow_data_completion_payload_after_gate_confirmation_in_native_flow_mode":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_returns_a_second_stage_raw_202_gather_response_after_department_selection_when_distinct_gate_choices_exist":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_opens_the_shared_gate_immediately_after_department_selection_in_raw_command_mode":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_opens_the_selected_gate_and_clears_redis_state_on_final_selection":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_reprompts_with_invalid_selection_while_keeping_webhook_state":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_uses_fallback_dtmf_extraction_when_event_gather_keys_are_missing":0.001,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_prompts_for_department_selection_even_when_only_one_eligible_department_exists":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_prompts_for_a_single_available_gate_type_and_opens_only_after_explicit_confirmation":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_supports_multi_digit_department_selections_before_gate_confirmation":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_returns_a_direct_raw_200_completion_when_no_departments_are_eligible":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_continues_with_the_first_gather_prompt_when_backend_call_acceptance_fails":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_returns_a_business_failure_raw_200_response_when_gate_opening_fails":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteIvrTest::__pest_evaluable_it_builds_deterministic_department_digit_map_without_capping_options":0.009,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteIvrTest::__pest_evaluable_it_builds_compact_gate_option_maps_and_resolves_selected_gate_type_by_digit":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteIvrTest::__pest_evaluable_it_builds_department_prompts_with_multi_digit_guidance_and_compact_gate_prompts":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteIvrTest::__pest_evaluable_it_normalizes_menu_digit_input_from_Bird_dtmf_payload_values":0,"P\\Tests\\Unit\\Bird\\DepartmentGatesPhoneCallOpenTest::__pest_evaluable_it_forwards_phone_number_and_call_duration_threshold_to_the_Bird_gate_helper":0.002,"P\\Tests\\Unit\\Bird\\DepartmentGatesPhoneCallOpenTest::__pest_evaluable_it_wraps_Bird_helper_failures_and_reports_them_to_Slack":0,"P\\Tests\\Unit\\Bookings\\NonPosBookingCompletionRemovalTest::__pest_evaluable_it_unregisters_legacy_booking_completion_forms":0.13,"P\\Tests\\Unit\\Bookings\\NonPosBookingCompletionRemovalTest::__pest_evaluable_it_keeps_legacy_wash_certificate_downloads_but_disables_generation_and_completion":0.166,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsComplaintsOpenApiSpecTest::__pest_evaluable_it_documents_the_daily_report_complaints_CRUD_and_customer_lookup_endpoints_in_openapi":0.011,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsComplaintsRouteContractTest::__pest_evaluable_it_wires_complaint_create__lookup__list__edit__and_delete_routes_with_validation_and_parsing":0.01,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsOutsideHoursOpenApiSpecTest::__pest_evaluable_it_documents_outside_hours_summary_and_trend_schemas_in_openapi":0.016,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsOutsideHoursRouteContractTest::__pest_evaluable_it_wires_outside_hours_summary_and_trend_endpoints_through_the_dedicated_statistics_service":0.007,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsOutsideHoursRouteContractTest::__pest_evaluable_it_initializes_the_outside_hours_statistics_service_before_building_the_transaction_count_summary_payload":0.006,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsOverviewOpenApiSpecTest::__pest_evaluable_it_documents_the_daily_report_overview_endpoint_and_reusable_schemas_in_openapi":0.013,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsOverviewRouteTest::__pest_evaluable_it_builds_the_overview_payload_from_batched_repository_data_with_deterministic_tile_states":0.013,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsOverviewRouteTest::__pest_evaluable_it_marks_overtime_unavailable_when_not_every_selected_department_can_be_mapped_to_workfeed":0,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsOverviewRouteTest::__pest_evaluable_it_normalizes_department_id_input_from_csv_strings_and_nested_values":0,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsOverviewRouteTest::__pest_evaluable_it_limits_overtime_counting_to_the_selected_reporting_range":0,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsOverviewRouteTest::__pest_evaluable_it_does_not_count_negative_approved_overtime_when_a_saved_end_shortens_the_shift":0,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsOverviewRouteTest::__pest_evaluable_it_ignores_late_unapproved_administrative_edits_when_calculating_overtime":0,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsOverviewRouteTest::__pest_evaluable_it_wires_the_overview_route_to_batched_repository_methods_and_overview_path":0.013,"P\\Tests\\Unit\\DailyReports\\DepartmentOutsideHoursStatisticsServiceTest::__pest_evaluable_it_counts_only_outside_hours_washes_and_flags_missing_opening_hours_without_counting_them_as_closed":0.002,"P\\Tests\\Unit\\DailyReports\\DepartmentOutsideHoursStatisticsServiceTest::__pest_evaluable_it_deduplicates_linked_washes_with_self_serve_first__then_xlvask__then_orders":0,"P\\Tests\\Unit\\DailyReports\\DepartmentOutsideHoursStatisticsServiceTest::__pest_evaluable_it_builds_daily_trend_points_with_per_day_missing_hours_diagnostics":0.001,"P\\Tests\\Unit\\Database\\DbObjectRedisNamespaceSafetyTest::__pest_evaluable_it_keeps_db_object_Redis_access_namespace_safe":0.008,"P\\Tests\\Unit\\DynamicImages\\DepartmentLaneDynamicImageRouteTest::__pest_evaluable_it_allows_studio_lane_dynamic_image_previews_to_override_the_saved_image_id":0.012,"P\\Tests\\Unit\\DynamicImages\\DepartmentLaneDynamicImageRouteTest::__pest_evaluable_it_accepts_ordered_dynamic_image_button_tokens_including_reset_start_and_zero":0.003,"P\\Tests\\Unit\\DynamicImages\\DepartmentLaneDynamicImageRouteTest::__pest_evaluable_it_renders_machine_one_dynamic_image_steps_from_the_ordered_button_payload":0.014,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueDetailsSummaryBuilderTest::__pest_evaluable_it_uses_queued_job_payload_customer_context_before_result_data_exists":0,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueRouteHardeningTest::__pest_evaluable_it_exposes_collected_invoice_queue_monitor_and_per_user_terminal_clear_routes":0.008,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueRouteHardeningTest::__pest_evaluable_it_runs_collected_invoice_queue_batches_through_an_explicit_manual_endpoint":0.026,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_bounds_e_conomic_curl_calls_below_the_PHP_request_timeout":0.01,"P\\Tests\\Unit\\Invoicing\\EconomicCustomersDiscountFallbackTest::__pest_evaluable_it_falls_back_to_a_later_customer_template_product_when_earlier_probes_fail_on_missing_currency_prices":0,"P\\Tests\\Unit\\Invoicing\\EconomicCustomersDiscountFallbackTest::__pest_evaluable_it_returns_zero_when_every_customer_template_lookup_fails_due_to_missing_currency_prices":0,"P\\Tests\\Unit\\Invoicing\\EconomicCustomersDiscountFallbackTest::__pest_evaluable_it_rethrows_unrelated_discount_lookup_failures":0,"P\\Tests\\Unit\\Invoicing\\EconomicDraftCustomerOpenApiSpecTest::__pest_evaluable_it_documents_transaction_draft_customer_config_and_auth_runtime_fields_in_all_tracked_openapi_copies":0.306,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueCronEntrypointWiringTest::__pest_evaluable_it_wires_root_cron_entrypoint_to_the_full_cron_scheduler_with_queue_worker_tasks":0.009,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueOpenApiSpecTest::__pest_evaluable_it_documents_additive_collected_invoice_queue_pagination_metadata_and_retry_conflict_semantics":0.009,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueWorkerTickRouteTest::__pest_evaluable_it_exposes_an_explicit_collected_invoice_transfer_queue_run_route_instead_of_ticking_read_endpoints":0.013,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueWorkerTickRouteTest::__pest_evaluable_it_keeps_order_transfer_queue_status_routes_read_only":0.005,"P\\Tests\\Unit\\Invoicing\\EconomicV2BookedDepartment75DistributionTest::__pest_evaluable_it_assigns_classified_booked_department_75_amounts_to_fallback_when_no_monthly_basis_exists":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2DistributionServiceFallbackTest::__pest_evaluable_it_falls_back_to_system_orders_for_fixed_pricing_using_the_configured_fallback_department":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2DistributionServiceFallbackTest::__pest_evaluable_it_falls_back_to_system_orders_for_wash_subscriptions_using_the_configured_fallback_department":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2DistributionServiceFallbackTest::__pest_evaluable_it_uses_the_configured_fallback_department_when_a_subscription_has_no_customer_department_basis":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2DistributionServiceFallbackTest::__pest_evaluable_it_excludes_orphaned_customer_traces_from_fixed_pricing_and_customer_price_distributions":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2DistributionServiceFallbackTest::__pest_evaluable_it_excludes_orphaned_customers_from_subscription_fallback_versions":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2DistributionServiceOrderOverrideTest::__pest_evaluable_it_inherits_department_eligibility_when_no_order_override_is_set":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2DistributionServiceOrderOverrideTest::__pest_evaluable_it_allows_an_order_level_include_override_to_overrule_department_exclusion":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2DistributionServiceOrderOverrideTest::__pest_evaluable_it_allows_an_order_level_exclude_override_to_overrule_department_inclusion":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_builds_deterministic_automatic_flag_fingerprints_and_interactive_price_message_parts":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_builds_interactive_message_parts_for_order_and_wash_certificate_warnings":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_includes_order_item_preview_context_for_required_order_field_warnings":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_allows_tank_cleaning_products_for_only_tank_cleaning_customers":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_does_not_flag_interior_wash_variants_as_historical_primary_product_mismatches":0.001,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_does_not_report_duplicate_primary_vehicle_products_from_duplicated_detector_rows_for_the_same_order_item":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_uses_attached_wash_certificate_documents_instead_of_safety_seal_text_for_certificate_presence":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_loads_wash_certificate_attachment_presence_from_order_attachment_content":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_uses_the_highest_customer_specific_discount_in_expected_price_breakdowns":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_uses_a_preloaded_e_conomic_global_discount_in_expected_price_breakdowns":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_does_not_report_a_price_mismatch_when_a_product_specific_discount_makes_the_expected_price_zero":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_preloads_and_caches_missing_e_conomic_discounts_before_price_mismatch_detection":0.04,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_seeds_order_item_preview_cache_from_period_rows":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_sorts_manual_flags_before_automatic_warnings_and_preserves_legacy_circle_indicators_without_flags":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_scopes_invoice_period_flags_to_the_customer_card_that_can_render_them":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_keeps_order_item_preview_context_compact_for_the_period_response":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_formats_stored_manual_flags_with_the_creating_superuser_display_name":0.003,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_validates_supported_manual_flag_fields_by_target_type":0.136,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_wires_invoice_period_flag_routes_with_explicit_list_create_and_update_permissions":0.043,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_uses_the_users_display__name_column_in_detector_queries":0.115,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_aggregates_customer_price_overrides_by_customer_number_for_price_mismatch_detection":0.115,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_guards_optional_customer_vehicle_deleted__at_filtering_behind_a_column_check":0.097,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_limits_historical_primary_product_lookup_to_current_period_registrations":0.08,"P\\Tests\\Unit\\Invoicing\\InvoicingOrdersCalculationsHardeningTest::__pest_evaluable_it_provides_a_batched_plain_row_transaction_query_for_invoicing_period_responses":0.11,"P\\Tests\\Unit\\Invoicing\\InvoicingOrdersCalculationsHardeningTest::__pest_evaluable_it_adds_guarded_composite_indexes_for_invoicing_period_lookups":0.155,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodDraftOverlayTest::__pest_evaluable_it_blocks_invoicing_when_all_actionable_transactions_are_backed_by_valid_e_conomic_drafts":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodDraftOverlayTest::__pest_evaluable_it_keeps_invoicing_available_when_valid_drafts_only_cover_part_of_the_actionable_work":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodDraftOverlayTest::__pest_evaluable_it_excludes_errored__booked__deleted__and_missing_external_id_invoice_collections_at_query_time":0.027,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodDraftOverlayTest::__pest_evaluable_it_still_checks_valid_drafts_when_the_collection_table_has_no_deleted_marker_column":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodDraftOverlayTest::__pest_evaluable_it_blocks_fixed_pricing_and_subscription_customer_level_work_when_a_relevant_valid_draft_exists":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodDraftOverlayTest::__pest_evaluable_it_keeps_queue_blocking_ahead_of_the_draft_label_when_all_work_is_covered_by_queue_or_draft_state":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodPaginationTest::__pest_evaluable_it_detects_paginated_period_mode_only_when_pagination_parameters_are_present":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodPaginationTest::__pest_evaluable_it_normalizes_period_pagination_options_and_clamps_invalid_page_and_limit_values":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodPaginationTest::__pest_evaluable_it_slices_only_the_active_period_view_and_keeps_exact_full_result_type_counts":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodPaginationTest::__pest_evaluable_it_returns_the_entire_active_period_view_when_the_limit_is_all":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodPaginationTest::__pest_evaluable_it_searches_customer_fields_and_order_fields_at_the_customer_card_level":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodPaginationTest::__pest_evaluable_it_applies_requires_action_and_booked_visibility_filters_before_counting_and_slicing":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodQueueOverlayTest::__pest_evaluable_it_normalizes_targeted_customer_number_filters_from_comma_separated_or_repeated_values":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodQueueOverlayTest::__pest_evaluable_it_filters_period_customer_number_candidates_to_targeted_customers_only":0,"P\\Tests\\Unit\\MotorApi\\MotorApiCachedResultTest::__pest_evaluable_it_only_writes_cached_MotorAPI_metadata_when_a_response_object_exists":0,"P\\Tests\\Unit\\Orders\\OrderBookingsCompletionDedupTest::__pest_evaluable_it_attaches_and_emails_a_wash_certificate_when_a_booking_is_already_linked_to_a_pos_order_without_one":0,"P\\Tests\\Unit\\Orders\\OrderBookingsCompletionDedupTest::__pest_evaluable_it_does_not_create_or_email_a_duplicate_wash_certificate_when_a_linked_pos_order_already_has_one":0,"P\\Tests\\Unit\\Orders\\OrderBookingsCompletionDedupTest::__pest_evaluable_it_keeps_standalone_booking_completion_behavior_unchanged_for_wash_certificates":0,"P\\Tests\\Unit\\Orders\\OrdersAutoWashCertificateCompletionTest::__pest_evaluable_it_auto_attaches_a_wash_certificate_on_order_completion_when_a_wash_certificate_item_is_present":0.001,"P\\Tests\\Unit\\Orders\\OrdersAutoWashCertificateCompletionTest::__pest_evaluable_it_keeps_order_completion_idempotent_when_a_wash_certificate_is_already_attached":0,"P\\Tests\\Unit\\Orders\\OrdersAutoWashCertificateCompletionTest::__pest_evaluable_it_allows_blank_safety_seal_values_when_auto_attaching_a_wash_certificate_on_completion":0,"P\\Tests\\Unit\\Orders\\OrdersIncludeInInvoiceOverrideTest::__pest_evaluable_it_lets_the_order_level_override_include_an_otherwise_excluded_order":0,"P\\Tests\\Unit\\Orders\\OrdersIncludeInInvoiceOverrideTest::__pest_evaluable_it_lets_the_order_level_override_exclude_an_otherwise_included_order":0,"P\\Tests\\Unit\\Orders\\OrdersIncludeInInvoiceOverrideTest::__pest_evaluable_it_falls_back_to_the_department_invoicing_rule_when_the_override_is_null":0,"P\\Tests\\Unit\\Orders\\OrdersIncludeInInvoiceOverrideTest::__pest_evaluable_it_serializes_both_raw_and_effective_include__in__invoice_values":0,"P\\Tests\\Unit\\Orders\\OrdersInputNormalizerTest::__pest_evaluable_it_normalizes_sql_and_datetime_local_created__at_values":0,"P\\Tests\\Unit\\Orders\\OrdersInputNormalizerTest::__pest_evaluable_it_rejects_invalid_created__at_values":0,"P\\Tests\\Unit\\Orders\\OrdersInputNormalizerTest::__pest_evaluable_it_normalizes_include__in__invoice_tri_state_inputs":0,"P\\Tests\\Unit\\Orders\\OrdersInputNormalizerTest::__pest_evaluable_it_rejects_invalid_include__in__invoice_values":0,"P\\Tests\\Unit\\Orders\\OrdersRouteSettingsUpdateWiringTest::__pest_evaluable_it_wires_order_create_and_update_routes_through_the_settings_normalizers":0.035,"P\\Tests\\Unit\\Orders\\OrdersRouteSettingsUpdateWiringTest::__pest_evaluable_it_keeps_line_item_invoice_filtering_in_the_order_net_amount_calculation":0.004,"P\\Tests\\Unit\\Orders\\OrdersRouteStripePaymentIntentLifecycleWiringTest::__pest_evaluable_it_wires_mobile_stripe_payment_intent_routes_to_normalized_lifecycle_handling":0.008,"P\\Tests\\Unit\\Orders\\StripePaymentIntentsPersistenceWiringTest::__pest_evaluable_it_wires_stripe_payment_intent_persistence_to_prune_duplicates_and_clear_reader_state_safely":0.104,"P\\Tests\\Unit\\Redis\\RedisAtomicReservationTest::__pest_evaluable_it_does_not_send_empty_mget_commands_to_redis":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_generates_MinIO_replica_compose_templates_without_embedding_secrets":0.001,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_computes_MinIO_free_space_and_catch_up_math_safely":0.001,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_wires_MinIO_replication_through_routes_and_bootstrap_snapshots":0.07,"P\\Tests\\Unit\\Selfserve\\SelfserveConditionEvaluatorTest::__pest_evaluable_it_evaluates_nested_v2_ALL_and_ANY_expression_trees_with_trace_output":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConditionEvaluatorTest::__pest_evaluable_it_evaluates_v2_if__else_if__and_else_condition_branches_in_order":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConditionEvaluatorTest::__pest_evaluable_it_evaluates_v2_case_expressions_against_question_values":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConditionEvaluatorTest::__pest_evaluable_it_returns_false_and_traces_v2_condition_expression_cycles":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_fails_validation_when_nested_conditions_form_cycles":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_migrates_legacy_AND_and_OR_rules_into_grouped_v2_condition_expressions":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_repairs_legacy_defaulted_always_task_gates_during_v2_normalization":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_does_not_let_legacy_defaulted_always_task_gates_bypass_validation":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_rejects_unsupported_legacy_task_target_rules_after_migration":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_validates_v2_expressions_for_empty_used_conditions__missing_refs__invalid_operators__and_cycles":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_validates_nested_v2_branch_and_case_expressions":0,"P\\Tests\\Unit\\Selfserve\\SelfserveInProgressWashAccessTest::__pest_evaluable_it_keeps_own_in_progress_self_serve_wash_details_visible_to_the_customer":0,"P\\Tests\\Unit\\Selfserve\\SelfserveInProgressWashAccessTest::__pest_evaluable_it_redacts_another_customers_in_progress_wash_details_during_customer_lane_polling":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_adds_vehicle_type_product_on_STOP_when_the_physical_machine_ON_signal_was_recorded__then_turns_off_cleaner_and_machine_relays":0.776,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_skips_vehicle_type_product_add_when_no_physical_machine_ON_signal_was_recorded_and_only_disables_configured_relays":0.046,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_does_not_use_selector_relay_online_status_as_machine_wash_billing_evidence":0.038,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_continues_STOP_when_exit_relay_dispatch_times_out_ambiguously":0.038,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_still_fails_STOP_for_non_timeout_exit_relay_errors":0.041,"P\\Tests\\Unit\\Selfserve\\SelfserveMachineSignalTest::__pest_evaluable_it_normalizes_Shelly_input_toggle_ON_events_as_machine_start_signals":0.001,"P\\Tests\\Unit\\Selfserve\\SelfserveMachineSignalTest::__pest_evaluable_it_normalizes_Shelly_switch_ON_events_and_nested_status_payloads":0,"P\\Tests\\Unit\\Selfserve\\SelfserveMachineSignalTest::__pest_evaluable_it_recognizes_Shelly_OFF_events_but_does_not_treat_them_as_billable_machine_starts":0,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_local_edge_gateway_machine_ON_signal_monitor_endpoints":0.017,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_lane_level_self_serve_toggles_through_lane_APIs__guest_payloads__and_edge_workspace_readiness":0.015,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_returns_authoritative_allowed_service_state_from_self_serve_session_summaries":0.008,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_filters_machine_button_tasks_out_of_self_serve_snapshots_when_MACHINE_is_not_allowed":0.006,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_blocks_new_self_serve_eligibility_and_session_sync_for_disabled_lanes":0.01,"P\\Tests\\Unit\\Selfserve\\SelfserveSchemaBootstrapCompatibilityTest::__pest_evaluable_it_adds_lane_level_self_serve_enablement_for_existing_department_lanes":0.005,"P\\Tests\\Unit\\Selfserve\\SelfserveSchemaBootstrapCompatibilityTest::__pest_evaluable_it_creates_canvas_only_self_serve_studio_layout_storage":0.004,"P\\Tests\\Unit\\Selfserve\\SelfserveSchemaBootstrapCompatibilityTest::__pest_evaluable_it_uses_mysql_safe_identifiers_for_self_serve_studio_virtual_hardware_storage":0.004,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_serializes_configurable_studio_actions_with_event__gate__scope__and_ordering_edges":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_validates_action_configuration_and_keeps_warnings_non_blocking":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_serializes_v2_condition_expressions_without_standalone_rule_nodes":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_serializes_branch_and_case_condition_expression_dependencies":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_keeps_runtime_on_published_v2_configs_and_leaves_draft_JSON_as_the_studio_edit_surface":0.009,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_surfaces_task_attachments_in_studio_graph__simulator__and_flow_responses":0.016,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_exposes_dynamic_images_and_referenced_machine_types_as_studio_lookup_choices":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_keeps_lane_management_fields_on_lane_scope_nodes":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_routes_studio_lane_graph_operations_through_department__lanes":0.006,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_projects_visible_question_answer_paths_into_grouped_task_service_and_signal_outcomes":0.001,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_truncates_path_outcome_projection_when_the_state_cap_is_reached":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_returns_complete_terminal_path_results_for_wide_question_trees_and_reports_progress":0.118,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_generates_and_merges_virtual_hardware_as_studio_only_relay_coverage":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_renders_virtual_gateway_nodes_and_task_service_edges_in_the_studio_graph":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_inserts_configured_action_signals_into_the_simulator_timeline_in_runtime_order":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_simulates_lane_scoped_wash_start_actions_for_property_gates_and_lane_entrance_ports":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_adds_ordered_simulator_signal_timeline_rows_for_virtual_hardware_dry_runs":0,"P\\Tests\\Unit\\Selfserve\\SelfserveWashFlowMachineAllowedWiringTest::__pest_evaluable_it_infers_legacy_defaulted_always_task_gates_from_condition__id_at_runtime":0,"P\\Tests\\Unit\\Selfserve\\SelfserveWashSessionStateTest::__pest_evaluable_it_treats_terminal_self_serve_wash_session_statuses_as_closed":0,"P\\Tests\\Unit\\Selfserve\\SelfserveWashSessionStateTest::__pest_evaluable_it_freezes_elapsed_self_serve_wash_minutes_at_completion_time":0,"P\\Tests\\Unit\\Subusers\\SubusersRouteManagementContractTest::__pest_evaluable_it_exposes_chauffeur_management_endpoints_on_the_subusers_route":0.009,"P\\Tests\\Unit\\Subusers\\SubusersRouteManagementContractTest::__pest_evaluable_it_includes_grant_management_fields_in_the_subusers_payload_builder":0.006,"P\\Tests\\Unit\\Subusers\\SubusersRouteManagementContractTest::__pest_evaluable_it_links_grant_disable_operations_to_SUBUSERS__DELETE_for_own_customer_managers":0.006,"P\\Tests\\Unit\\Subusers\\SubusersRouteManagementContractTest::__pest_evaluable_it_prevents_own_customer_managers_from_editing_driver_owned_account_profiles":0.005,"P\\Tests\\Unit\\Subusers\\SubusersRouteManagementContractTest::__pest_evaluable_it_only_allows_invite_resend_while_setup_is_still_pending":0.009,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusOpenApiSpecTest::__pest_evaluable_it_documents_the_superuser_system_status_snapshot_endpoint_in_openapi":0.008,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusOpenApiSpecTest::__pest_evaluable_it_defines_the_reusable_system_status_schemas_and_enums":0.006,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusRouteWiringTest::__pest_evaluable_it_registers_the_aggregated_superuser_system_status_endpoint_and_permission":0.006,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusRouteWiringTest::__pest_evaluable_it_keeps_the_legacy_database_status_endpoint_wired_through_the_shared_snapshot_service":0.004,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_reduces_overall_status_using_down_and_degraded_precedence":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_classifies_runtime_usage_percentages_consistently":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_reuses_cached_module_probes_only_when_the_ttl_is_still_valid_and_force_is_false":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_classifies_authenticated_http_probe_responses_conservatively with data set \"dataset \"success\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_classifies_authenticated_http_probe_responses_conservatively with data set \"dataset \"unauthorized\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_classifies_authenticated_http_probe_responses_conservatively with data set \"dataset \"forbidden\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_classifies_authenticated_http_probe_responses_conservatively with data set \"dataset \"rate limited\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_classifies_authenticated_http_probe_responses_conservatively with data set \"dataset \"server error\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_classifies_authenticated_http_probe_responses_conservatively with data set \"dataset \"no response\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_classifies_transport_errors_as_down":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_normalizes_and_deduplicates_warning_entries_for_snapshots":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_interprets_recaptcha_probe_payloads_safely with data set \"dataset \"dummy token rejected but credentials valid\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_interprets_recaptcha_probe_payloads_safely with data set \"dataset \"invalid secret is down\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_interprets_recaptcha_probe_payloads_safely with data set \"dataset \"unexpected validation errors degrade\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_the_expected_http_probe_requests_for_newly_supported_modules with data set \"dataset \"recaptcha\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_the_expected_http_probe_requests_for_newly_supported_modules with data set \"dataset \"email\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_the_expected_http_probe_requests_for_newly_supported_modules with data set \"dataset \"motorapi\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_the_expected_http_probe_requests_for_newly_supported_modules with data set \"dataset \"fxratesapi\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_the_expected_http_probe_requests_for_newly_supported_modules with data set \"dataset \"weatherapi\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_the_expected_http_probe_requests_for_newly_supported_modules with data set \"dataset \"workfeed\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_the_expected_http_probe_requests_for_newly_supported_modules with data set \"dataset \"gatewayapi\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_the_expected_http_probe_requests_for_newly_supported_modules with data set \"dataset \"xlvask\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_the_expected_http_probe_requests_for_newly_supported_modules with data set \"dataset \"limble\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_the_expected_http_probe_requests_for_newly_supported_modules with data set \"dataset \"license plate recognizer\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_the_expected_http_probe_requests_for_newly_supported_modules with data set \"dataset \"bird\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_uses_runtime_economic_credentials_for_the_economic_probe":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_returns_down_without_attempting_economic_http_calls_when_runtime_credentials_are_missing":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_reports_backup_probe_failures_from_local_validation":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_returns_configured_for_shelly_when_no_known_device_id_is_available_for_probing":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_an_authenticated_shelly_status_probe_when_a_known_device_id_exists":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_validates_selfserve_schema_and_minute_product_configuration":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_reports_invalid_selfserve_minute_configuration_before_touching_the_schema":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_reports_missing_selfserve_minute_products":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_surfaces_selfserve_bootstrap_failures":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_adds_localization_metadata_for_disabled_and_missing_config_modules":40.262,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_marks_newly_supported_modules_as_probe_backed_and_leaves_only_truly_unsupported_modules_as_configuration_only":38.499,"P\\Tests\\Unit\\SystemStatus\\SystemSessionActivityTrackerTest::__pest_evaluable_it_detects_device_types_from_common_user_agents":0,"P\\Tests\\Unit\\SystemStatus\\SystemSessionActivityTrackerTest::__pest_evaluable_it_treats_recent_sessions_as_active_within_the_configured_activity_window":0,"P\\Tests\\Unit\\SystemStatus\\SystemSessionActivityTrackerTest::__pest_evaluable_it_converts_database_utc_datetimes_into_timezone_aware_iso_strings":0,"P\\Tests\\Unit\\SystemStatus\\SystemSessionActivityTrackerTest::__pest_evaluable_it_treats_timezone_aware_iso_timestamps_as_active_using_absolute_time":0,"P\\Tests\\Unit\\Tooling\\LegacyTestInventoryTest::__pest_evaluable_it_keeps_every_legacy_PHP_test_accounted_for_in_the_manifest":0.489,"P\\Tests\\Unit\\Tooling\\MySqlSchemaCompatibilityTest::__pest_evaluable_it_keeps_schema_bootstrap_SQL_compatible_with_the_MySQL_runner":6.55,"P\\Tests\\Unit\\Users\\UsersCustomerNamesCacheTest::__pest_evaluable_it_allows_callers_to_resolve_customer_names_without_e_conomic_fallback":0.003,"P\\Tests\\Unit\\Users\\UsersCustomerNamesCacheTest::__pest_evaluable_it_returns_an_empty_customer_name_map_without_touching_cache_for_empty_input":0,"P\\Tests\\Unit\\Users\\UsersCustomerNamesCacheTest::__pest_evaluable_it_returns_no_rows_for_empty_array_field_filters":0,"P\\Tests\\Unit\\Users\\UsersRedisNamespaceSafetyTest::__pest_evaluable_it_keeps_users_Redis_access_namespace_safe":0.005,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheRuntimeBehaviorTest::__pest_evaluable_it_builds_department_weather_preload_targets_in_cli_without_a_request_uri":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherPreloadCronWiringTest::__pest_evaluable_it_registers_and_implements_cron_warming_for_workfeed_employee_name_cache":0.007,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherStatusTargetsTest::__pest_evaluable_it_aggregates_multi_department_slot_statuses_using_worst_severity_when_any_department_is_unhealthy":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherStatusTargetsTest::__pest_evaluable_it_aggregates_all_unhealthy_multi_department_slot_statuses_as_unhealthy":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherStatusTargetsTest::__pest_evaluable_it_returns_unknown_when_aggregated_multi_department_slot_targets_are_missing":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherStatusTargetsTest::__pest_evaluable_it_returns_unknown_when_aggregated_multi_department_slot_has_no_evaluable_hours":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherStatusTargetsTest::__pest_evaluable_it_returns_unknown_when_aggregated_multi_department_slot_has_not_started_yet":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTargetsRouteWiringTest::__pest_evaluable_it_registers_department_weather_hour_details_route_with_weather_read_and_department_access_checks":0.007,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_calculates_weather_hour_contributions_grouped_per_employee_for_a_slot":0.001,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_calculates_weather_hour_contributions_for_canonical_nested_workfeed_employee_schema":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_extracts_weather_employee_identity_from_supported_shift_payload_shapes":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_prefers_canonical_workfeed_employee_schema_fields_over_generic_employee_names":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_does_not_use_workfeed_schema_name_fields_as_employee_ids":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_returns_a_null_employee_name_when_no_workfeed_employee_name_is_available":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_resolves_missing_workfeed_employee_names_from_the_employees_endpoint":0.042,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_filters_employee_hour_rows_that_cannot_be_resolved_to_a_workfeed_schema_name":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_resolves_employee_display_name_from_cache_when_shift_payload_lacks_a_name":0,"P\\Tests\\Unit\\Workfeed\\WorkfeedEmployeeNameFormatterTest::__pest_evaluable_it_formats_workfeed_employee_display_names_from_the_documented_firstname_lastname_schema":0,"P\\Tests\\Unit\\Workfeed\\WorkfeedEmployeeNameFormatterTest::__pest_evaluable_it_prefers_workfeed_schema_names_over_generic_display_name_fields":0,"P\\Tests\\Unit\\Workfeed\\WorkfeedEmployeeNameFormatterTest::__pest_evaluable_it_falls_back_to_legacy_display_name_fields_when_schema_names_are_absent":0,"P\\Tests\\Unit\\Workfeed\\WorkfeedEmployeeNameFormatterTest::__pest_evaluable_it_ignores_placeholder_workfeed_display_names":0,"P\\Tests\\Unit\\Workfeed\\WorkfeedEmployeeNameFormatterTest::__pest_evaluable_it_ignores_employee_id_placeholder_display_names_when_the_id_is_known":0,"P\\Tests\\Unit\\XLVask\\XLVaskAutomationServiceTest::__pest_evaluable_it_normalizes_registrations_for_XL_Vask_automation_signatures":0,"P\\Tests\\Unit\\XLVask\\XLVaskAutomationServiceTest::__pest_evaluable_it_builds_stable_XL_Vask_automation_item_signatures":0,"P\\Tests\\Unit\\XLVask\\XLVaskAutomationServiceTest::__pest_evaluable_it_normalizes_persisted_XL_Vask_usage_log_rows_before_helper_hydration":0,"P\\Tests\\Unit\\XLVask\\XLVaskAutomationServiceTest::__pest_evaluable_it_builds_stable_OpenAI_cache_keys_for_identical_automation_input":0,"P\\Tests\\Unit\\XLVask\\XLVaskAutomationServiceTest::__pest_evaluable_it_changes_OpenAI_cache_keys_when_automation_eligibility_input_changes":0,"P\\Tests\\Unit\\XLVask\\XLVaskAutomationServiceTest::__pest_evaluable_it_declares_a_persistent_OpenAI_cache_table_for_XL_Vask_automation":0.005,"P\\Tests\\Unit\\XLVask\\XLVaskAutomationServiceTest::__pest_evaluable_it_declares_cached_amount_summary_columns_for_XL_Vask_usage_logs":0.012,"P\\Tests\\Unit\\XLVask\\XLVaskAutomationServiceTest::__pest_evaluable_it_scores_same_day_orders_with_matching_XL_Vask_products_and_extra_add_ons_as_attach_suggestions":0.003,"P\\Tests\\Unit\\XLVask\\XLVaskAutomationServiceTest::__pest_evaluable_it_does_not_score_an_order_with_only_the_primary_product_as_a_matching_add_on_attachment":0,"P\\Tests\\Unit\\XLVask\\XLVaskUsageLogHelperTest::__pest_evaluable_it_accepts_persisted_ignore_metadata_from_xlvask_usage_log_rows":0.019,"P\\Tests\\Unit\\XLVask\\XLVaskUsageLogHelperTest::__pest_evaluable_it_calculates_XL_Vask_amount_summaries_without_hydrating_order_item_previews":0.006,"P\\Tests\\Unit\\XLVask\\XLVaskUsageRouteContractTest::__pest_evaluable_it_exposes_direct_linked_order_metadata_on_XL_Vask_usage_order_rows":0.003,"P\\Tests\\Unit\\XLVask\\XLVaskUsageRouteContractTest::__pest_evaluable_it_returns_cached_amount_summaries_on_XL_Vask_usage_order_rows_without_widening_the_usage_log_object_payload":0.003,"P\\Tests\\Integration\\DailyReports\\DepartmentDailyReportComplaintsIntegrationTest::__pest_evaluable_it_counts_complaint_rows_by_department_and_created__at_reporting_range":0.284,"P\\Tests\\Integration\\DailyReports\\DepartmentDailyReportComplaintsIntegrationTest::__pest_evaluable_it_updates_and_deletes_complaint_rows":0.005,"P\\Tests\\Integration\\DailyReports\\DepartmentDailyReportComplaintsIntegrationTest::__pest_evaluable_it_parses_created__by__name_from_the_users_table":0.005,"P\\Tests\\Integration\\DailyReports\\DepartmentOutsideHoursStatisticsServiceIntegrationTest::__pest_evaluable_it_integrates_orders__xlvask__and_self_serve_into_one_outside_hours_summary_with_missing_hours_diagnostics":0.016,"P\\Tests\\Integration\\Invoicing\\EconomicTransferQueueIntegrationTest::__pest_evaluable_it_processes_only_collected_invoice_jobs_and_respects_the_manual_batch_limit":0.014,"P\\Tests\\Integration\\SystemStatus\\SuperuserSystemStatusInfrastructureProbeTest::__pest_evaluable_it_can_probe_the_configured_database_in_integration_mode":0,"P\\Tests\\Integration\\SystemStatus\\SuperuserSystemStatusInfrastructureProbeTest::__pest_evaluable_it_can_probe_redis_in_integration_mode_when_configured":0,"P\\Tests\\Integration\\SystemStatus\\SuperuserSystemStatusInfrastructureProbeTest::__pest_evaluable_it_can_probe_minio_in_integration_mode_when_configured":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_redacts_sensitive_release_timeline_payload_fields_recursively":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_verifies_GitHub_sha256_webhook_signatures":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_normalizes_GitHub_repository_identifiers_for_private_repository_access_checks":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_defines_release_manager_schema__routes__permissions__and_system_status_integration_hooks":0.575,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_summarizes_failed_deployments_and_blocks_promotion_until_a_deployment_succeeds":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_uses_the_selected_Coolify_project_and_resolves_server_UUID_from_the_instance_default":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_supports_isolated_stack_mode_and_names_new_Coolify_services_explicitly":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_creates_Coolify_service_payloads_from_raw_compose_without_a_service_type":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_normalizes_Coolify_API_base_URLs_to_the_v1_API_root":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_parses_generated_env_files_for_Coolify_service_env_bulk_updates":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_prefers_public_Coolify_server_hosts_over_Docker_local_addresses":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_blocks_planned_downtime_operations_against_active_replication_primaries":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_allows_failed_Coolify_replica_targets_to_be_removed_after_the_service_disappears":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_retries_Coolify_maintenance_while_linked_replication_provisioning_is_still_incomplete":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_plans_Hetzner_load_balancer_target_and_service_drift_without_mutating_state":0.24,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_does_not_plan_removal_of_the_last_Hetzner_load_balancer_target":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_plans_removal_only_for_disabled_or_deleted_Hetzner_load_balancer_targets":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_defines_Coolify_schema__route_permissions__and_replication_integration_hooks":0.418,"P\\Tests\\Unit\\ErrorReports\\ErrorReportTest::__pest_evaluable_it_redacts_sensitive_error_report_payload_fields_recursively":0.001,"P\\Tests\\Unit\\ErrorReports\\ErrorReportTest::__pest_evaluable_it_validates_supported_screenshot_data_uris":0,"P\\Tests\\Unit\\ErrorReports\\ErrorReportTest::__pest_evaluable_it_defines_error_report_schema__routes__permissions__storage__and_OpenAPI_docs":0.04,"P\\Tests\\Unit\\Http\\ResponseRequestParametersTest::__pest_evaluable_it_reads_JSON_payloads_for_DELETE_request_parameter_arrays":0,"P\\Tests\\Unit\\Http\\ResponseRequestParametersTest::__pest_evaluable_it_keeps_DELETE_query_parameters_when_no_JSON_body_is_present":0,"P\\Tests\\Unit\\Infrastructure\\CorsReleaseHeadersTest::__pest_evaluable_it_allows_release_telemetry_headers_at_PHP_served_CORS_entry_points":0.424,"P\\Tests\\Unit\\Orders\\OrderBookingsCompletionDedupTest::__pest_evaluable_it_uses_the_linked_pos_order_wash_certificate_item_added_during_mobile_completion":0,"P\\Tests\\Unit\\Replication\\ReplicaFailoverManagerTest::__pest_evaluable_it_normalizes_failover_config_defaults_and_per_kind_enablement":0,"P\\Tests\\Unit\\Replication\\ReplicaFailoverManagerTest::__pest_evaluable_it_requires_strict_fresh_100_percent_replica_status_for_candidates":0,"P\\Tests\\Unit\\Replication\\ReplicaFailoverManagerTest::__pest_evaluable_it_selects_the_freshest_eligible_replica_for_failover":0,"P\\Tests\\Unit\\Replication\\ReplicaFailoverManagerTest::__pest_evaluable_it_promotes_enabled_startup_dependencies_from_snapshot_in_dependency_order":0.004,"P\\Tests\\Unit\\Replication\\ReplicaFailoverManagerTest::__pest_evaluable_it_does_not_promote_a_disabled_dependency_during_startup_failover":0.001,"P\\Tests\\Unit\\Replication\\ReplicaFailoverManagerTest::__pest_evaluable_it_wires_the_failover_module_config_endpoint_and_promotion_paths":0.312,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_can_embed_primary_admin_credentials_in_generated_MariaDB_replica_env_files":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_keeps_operational_and_derived_tables_schema_only_during_MariaDB_seeding_and_replication":0.021,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_supports_metadata_only_replication_host_renames":0.005,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_keeps_MinIO_backup_replicas_bounded_to_the_recent_backup_window":0.014,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_prefills_MinIO_replica_compose_primary_values_from_current_config_when_available":0.001,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_allows_the_MinIO_client_binary_to_be_configured_explicitly":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_supports_MinIO_client_runtime_fallback_configuration":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_extracts_host_specific_MariaDB_replication_account_denials":0.001,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_identifies_stopped_database_replication_threads_as_a_restartable_status":0,"P\\Tests\\Unit\\Scanner\\ModuleScannerRouteTest::__pest_evaluable_it_returns_no_plate_LPR_results_without_a_failed_HTTP_status":0.046,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_does_not_invent_GHCR_images_for_Coolify_service_payloads":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_keeps_release_branch_services_out_of_the_production_Coolify_environment_except_beta":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_creates_Coolify_GitHub_App_application_payloads_so_pulls_use_the_app_token":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_does_not_treat_an_existing_Coolify_service_as_an_application_just_because_a_GitHub_App_UUID_is_stored":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_can_use_the_Coolify_instance_default_GitHub_App_when_source_targets_do_not_store_it_yet":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_updates_existing_frontend_Coolify_applications_away_from_legacy_Nixpacks_detection":0,"P\\Tests\\Unit\\Auth\\EconomicCreateCustomerResponseTest::__pest_evaluable_it_adds_supported_CVR_company_fields_to_the_e_conomic_customer_payload":0.014,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_keeps_release_channel_runtime_availability_independent_from_channel_URLs":0.007,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_chooses_a_requested_runtime_channel_only_when_it_is_available_to_the_principal":0.199,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_normalizes_release_assignment_subject_suggestions_without_leaking_private_fields":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_keeps_GitHub_commit_timestamps_in_public_release_manager_commit_payloads":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_requires_non_default_release_channel_runtime_URLs_and_preserves_load_balancer_paths":0.105,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_exposes_release_version_git_commit_metadata_for_runtime_channel_cards":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_builds_gateway_API_auto_provision_context_for_connected_Coolify_servers":0.001,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_adds_explicit_Coolify_application_route_labels_for_gateway_API_domains":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_builds_explicit_Coolify_application_route_labels_for_release_API_targets":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_uses_the_self_contained_Coolify_API_Dockerfile_for_API_applications":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_isolates_and_restores_Hetzner_load_balancer_IP_targets_for_gateway_certificate_bootstrap":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_requires_gateway_ping_probes_to_return_the_API_ping_contract":0,"P\\Tests\\Unit\\Tooling\\ComposerEntrypointTest::__pest_evaluable_it_checks_PSR_HTTP_message_interfaces_before_trusting_a_Composer_vendor_tree":0,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_marks_a_channel_ready_when_all_release_services_are_healthy":0.001,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_reports_non_default_channels_missing_bundles__versions__and_URLs_as_blocking_missing_values":0.024,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_surfaces_failed_latest_deployments_as_critical_promotion_blockers":0,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_flags_isolated_stacks_that_are_missing_database_Redis_and_MinIO_services":0,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_maps_degraded_Coolify_targets_and_reconcile_failures_to_release_service_issues":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_plans_Hetzner_load_balancer_service_health_check_drift_updates":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_returns_structured_errors_for_failed_gateway_certificate_bootstrap_and_verification":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_captures_release_request_context_from_headers_and_runtime_query_parameters":0.004,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_normalizes_channel_prefixed_API_ingress_paths_before_route_dispatch":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_creates_frontend_Coolify_GitHub_App_application_payloads_with_the_release_Dockerfile":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_builds_gateway_frontend_auto_provision_context_with_the_release_Dockerfile":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_allows_explicit_runtime_selection_of_any_enabled_release_channel":0.289,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_chooses_requested_runtime_channels_from_available_channels_or_enabled_channel_slugs":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_normalizes_gateway_probe_paths_for_release_gateway_health_checks":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_resolves_release_deployment_endpoints_from_manual_overrides__URLs__health_checks__and_gateway_defaults":0.001,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_does_not_report_frontend_or_API_URLs_missing_when_target_auto_endpoints_are_resolvable":0,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_offers_a_release_bundle_action_when_exactly_one_deployed_bundle_is_eligible":0.008,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_offers_application_target_preparation_for_path_routed_Coolify_failures":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_maps_the_public_master_API_prefix_to_the_stable_release_channel":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_uses_master_as_the_public_route_slug_for_the_stable_release_channel":0,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_does_not_block_channels_on_unhealthy_data_targets_when_data_services_are_production_shared":0,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_ignores_missing_legacy_bundles_but_still_blocks_on_missing_versions_and_URLs":0.001,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_marks_a_branch_based_channel_ready_without_a_release_bundle_when_app_versions_and_URLs_exist":0,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_does_not_surface_legacy_release_bundle_actions_as_readiness_blockers":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_adds_exact_hidden_question__skipped_action__signal__and_button_decision_causes":0,"P\\Tests\\Api\\OrderBookingsCompletionApiTest::__pest_evaluable_it_rejects_standalone_order_booking_completion_outside_POS":5.621,"P\\Tests\\Api\\OrderBookingsCompletionApiTest::__pest_evaluable_it_allows_linked_POS_order_booking_completion_for_mobile_POS_compatibility":4.121,"P\\Tests\\Api\\OrderBookingsCompletionApiTest::__pest_evaluable_it_accepts_numeric_safety_seal_strings_when_completing_a_linked_POS_order_booking":4.366,"P\\Tests\\Api\\OrderBookingsCompletionApiTest::__pest_evaluable_it_disables_the_legacy_complete_wash_without_certificate_route":1.122,"P\\Tests\\Api\\OrderBookingsUpdateApiTest::__pest_evaluable_it_detaches_an_order_booking_and_clears_the_matching_order_link":5.559,"P\\Tests\\Api\\OrderBookingsUpdateApiTest::__pest_evaluable_it_keeps_the_linked_order_when_order__id_is_omitted_from_an_order_booking_update":5.22,"P\\Tests\\Unit\\DynamicImages\\DepartmentLaneDynamicImageRouteTest::__pest_evaluable_it_accepts_ordered_dynamic_image_button_tokens_including_program_picker_reset_start_and_zero":0.007,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_adds_program_picker_before_mapped_machine_buttons_in_simulator_debug_decisions":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_verifies_CI_release_gate_bearer_tokens_from_dedicated_release_credentials":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_only_chooses_requested_runtime_channels_from_channels_available_to_the_principal":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_ignores_explicit_runtime_selection_for_channels_outside_the_principal_channel_set":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_auto_prepares_path_routed_release_targets_for_Coolify_application_creation":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_offers_application_target_preparation_for_missing_Coolify_service_creation_failures":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_builds_API_Coolify_runtime_environment_from_allowed_process_variables":0.001,"P\\Tests\\Unit\\Infrastructure\\CorsPolicyTest::__pest_evaluable_it_normalizes_URL_like_CORS_entries_to_origins":0,"P\\Tests\\Unit\\Infrastructure\\CorsPolicyTest::__pest_evaluable_it_merges_required_release_and_existing_frontend_origins_into_configured_CORS":0,"P\\Tests\\Unit\\Infrastructure\\CorsPolicyTest::__pest_evaluable_it_builds_credential_safe_normal_CORS_response_headers_for_allowed_origins":0,"P\\Tests\\Unit\\Infrastructure\\CorsPolicyTest::__pest_evaluable_it_builds_preflight_CORS_response_headers_for_api_v2_release_URLs":0,"P\\Tests\\Unit\\Infrastructure\\CorsPolicyTest::__pest_evaluable_it_rejects_unknown_CORS_origins":0,"P\\Tests\\Unit\\Infrastructure\\CorsPolicyTest::__pest_evaluable_it_reflects_the_request_origin_for_wildcard_CORS_instead_of_sending_credentialed_wildcard_headers":0,"P\\Tests\\Unit\\Selfserve\\SelfserveCustomerLaneAccessTest::__pest_evaluable_it_allows_customers_with_own_self_serve_permission_to_use_enabled_self_serve_lanes":0,"P\\Tests\\Unit\\Selfserve\\SelfserveCustomerLaneAccessTest::__pest_evaluable_it_blocks_customer_lane_mutations_without_own_self_serve_permission":0,"P\\Tests\\Unit\\Selfserve\\SelfserveCustomerLaneAccessTest::__pest_evaluable_it_blocks_customer_lane_mutations_when_the_lane_is_not_operationally_enabled":0,"P\\Tests\\Unit\\Selfserve\\SelfserveCustomerLaneAccessTest::__pest_evaluable_it_allows_active_wash_operations_when_the_lane_runtime_belongs_to_the_customer":0,"P\\Tests\\Unit\\Selfserve\\SelfserveCustomerLaneAccessTest::__pest_evaluable_it_falls_back_to_active_department_sessions_for_customer_active_wash_operations":0,"P\\Tests\\Unit\\Selfserve\\SelfserveCustomerLaneAccessTest::__pest_evaluable_it_blocks_active_wash_operations_for_other_customers":0,"P\\Tests\\Unit\\Selfserve\\SelfservePropertyGatePermissionBypassTest::__pest_evaluable_it_does_not_bypass_property_gate_permissions_without_customer_self_serve_permission":0,"P\\Tests\\Unit\\Selfserve\\SelfserveCustomerLaneAccessTest::__pest_evaluable_it_keeps_active_wash_operations_available_if_a_lane_is_disabled_after_start":0,"P\\Tests\\Api\\SelfserveLaneWashInProgressApiTest::__pest_evaluable_it_requires_authentication_before_checking_in_progress_wash_permissions":0,"P\\Tests\\Api\\SelfserveLaneWashInProgressApiTest::__pest_evaluable_it_reports_both_elevated_and_customer_self_serve_permissions_when_lane_polling_is_not_allowed":0,"P\\Tests\\Api\\SelfserveLaneWashInProgressApiTest::__pest_evaluable_it_allows_customer_self_serve_permission_to_view_their_own_in_progress_wash_details":0,"P\\Tests\\Api\\SelfserveLaneWashInProgressApiTest::__pest_evaluable_it_redacts_another_customers_in_progress_wash_from_customer_self_serve_lane_polling":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_keeps_beta_API_runtime_environment_on_production_database_target":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_treats_attach_existing_service_sets_without_data_target_ids_as_production_shared_ready":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_rejects_beta_release_bundles_that_resolve_to_isolated_cloned_or_fresh_data_services":0.01,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_detects_explicit_data_target_ids_so_beta_service_sets_can_stay_data_only":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_resolves_backend_commit_sha_from_API_runtime_environment_in_priority_order":0.009,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_injects_selected_API_commit_into_Coolify_runtime_env_unless_explicitly_set":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_allows_beta_production_service_bundles_only_when_data_services_stay_production_shared":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_keeps_release_branch_services_out_of_the_production_Coolify_environment":0,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_marks_beta_ready_from_the_production_frontend_and_API_services":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_uses_program_picker_button_numbers_as_thumb_selectors_in_simulator_debug_decisions":0}} \ No newline at end of file +{"version":"pest_3.8.6","defects":{"P\\Tests\\Unit\\Selfserve\\SelfserveOpenApiSpecTest::__pest_evaluable_it_documents_self_serve_machine_type__eligibility__summary__and_webhook_endpoints":1,"P\\Tests\\Unit\\Selfserve\\SelfserveOpenApiSpecTest::__pest_evaluable_it_defines_reusable_self_serve_wash_and_machine_type_schemas":1,"P\\Tests\\Unit\\Invoicing\\EconomicV2BookedDepartment75DistributionTest::__pest_evaluable_it_redistributes_booked_department_75_net_amounts_using_fixed_pricing_and_wash_subscription_weights":7,"P\\Tests\\Unit\\Invoicing\\EconomicV2BookedDepartment75DistributionTest::__pest_evaluable_it_keeps_classified_booked_department_75_amounts_undistributed_when_no_monthly_basis_exists":8,"P\\Tests\\Unit\\Invoicing\\EconomicV2BookedDepartment75DistributionTest::__pest_evaluable_it_keeps_unclassified_booked_department_75_lines_undistributed_with_warnings":8,"P\\Tests\\Unit\\Invoicing\\EconomicV2OpenApiSpecTest::__pest_evaluable_it_documents_v2_historical_distribution_and_pricing_history_paths_in_openapi":1,"P\\Tests\\Unit\\Invoicing\\EconomicV2OpenApiSpecTest::__pest_evaluable_it_defines_new_reusable_v2_schemas_for_normalization_comparison_versioning_and_distribution":1,"P\\Tests\\Unit\\Invoicing\\EconomicV2BookedDepartment75DistributionTest::__pest_evaluable_it_supports_bulk_booked_invoice_line_payloads_with_top_level_department_numbers":7,"P\\Tests\\Unit\\Redis\\RedisAtomicReservationTest::__pest_evaluable_it_claims_a_slot_atomically_with_nx_and_expiration":8,"P\\Tests\\Unit\\Redis\\RedisAtomicReservationTest::__pest_evaluable_it_returns_false_when_the_slot_is_already_claimed_and_clamps_ttl_to_one_second":8,"P\\Tests\\Unit\\Invoicing\\EconomicV2OpenApiSpecTest::__pest_evaluable_it_documents_economic_v2_invoice_paths_in_openapi":1,"P\\Tests\\Unit\\Invoicing\\EconomicV2OpenApiSpecTest::__pest_evaluable_it_aligns_legacy_compare_schema_with_runtime_payload_by_removing_stale_required_order__ids":1,"P\\Tests\\Unit\\Search\\SystemSearchEntityTypeCoverageTest::__pest_evaluable_it_documents_every_supported_search_entity_type_in_openapi_enum":1,"P\\Tests\\Unit\\Search\\SystemSearchOpenApiSpecTest::__pest_evaluable_it_documents_system_wide_search_endpoints_in_openapi":1,"P\\Tests\\Unit\\Search\\SystemSearchOpenApiSpecTest::__pest_evaluable_it_documents_debug__intent_and_parser_metadata_schema_in_openapi":1,"P\\Tests\\Unit\\Search\\SystemSearchOpenApiSpecTest::__pest_evaluable_it_documents_e_conomic_indexed_customer_matching_and_synonym_behavior":1,"P\\Tests\\Integration\\Database\\DbConnectionTest::__pest_evaluable_it_can_connect_to_a_configured_MySQL_instance_in_integration_mode":1,"P\\Tests\\Integration\\Invoicing\\EconomicV2BackfillAndDistributionIntegrationTest::__pest_evaluable_it_runs_best_effort_backfill_repeatedly_without_introducing_duplicate_same_start_rows":1,"P\\Tests\\Integration\\Invoicing\\EconomicV2BackfillAndDistributionIntegrationTest::__pest_evaluable_it_resolves_version_aware_distribution_payload_shapes_over_a_real_date_range":1,"P\\Tests\\Integration\\Invoicing\\EconomicV2VersioningServiceIntegrationTest::__pest_evaluable_it_creates_closes_and_rotates_fixed_pricing_versions_without_overlap":1,"P\\Tests\\Integration\\Invoicing\\EconomicV2VersioningServiceIntegrationTest::__pest_evaluable_it_tracks_vehicle_and_discount_version_lifecycles_with_closure_semantics":1,"P\\Tests\\Integration\\Permissions\\LegacyPermissionRedisCacheScriptTest::__pest_evaluable_it_keeps_legacy_route_permission_redis_cache_script_green":1,"P\\Tests\\Unit\\Goals\\GoalsOpenApiSpecTest::__pest_evaluable_it_documents_advanced_goals_target_duration_fields_in_openapi":1,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTimelineSchemaConformanceTest::__pest_evaluable_it_documents_the_date_key_in_the_openapi_department_weather_timeline_schema":1,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherFallbackBehaviorTest::__pest_evaluable_it_builds_timeline_entries_with_mostly__clear_weather_when_forecast_payload_is_empty":8,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherFallbackBehaviorTest::__pest_evaluable_it_wires_departments_weather_route_through_the_forecast_fallback_path":7,"P\\Tests\\Unit\\Orders\\AttachmentsListManyTest::__pest_evaluable_it_groups_attachments_by_object_id_and_preserves_empty_object_groups":8,"P\\Tests\\Unit\\Orders\\AttachmentsListManyTest::__pest_evaluable_it_keeps_listMany_payload_parity_with_list_for_one_object_id":8,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTargetsOpenApiSpecTest::__pest_evaluable_it_documents_department_weather_target_endpoints_and_reusable_schemas_in_openapi":1,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTargetsOpenApiSpecTest::__pest_evaluable_it_documents_unknown_weather_status_behavior_when_targets_are_missing":1,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_respects_the_1_request_per_second_Shelly_gate_for_back_to_back_requests":8,"P\\Tests\\Unit\\Selfserve\\SelfserveOpenApiSpecTest::__pest_evaluable_it_documents_in_progress_self_serve_wash_start_and_machine_relay_fields":1,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_stores_config_json_with_apostrophes_without_violating_json_constraints":8,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_adds_vehicle_type_product_on_STOP_when_program_selector_is_on__then_turns_off_cleaner_machine_and_selector_relays":7,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_skips_vehicle_type_product_add_when_program_selector_is_off_and_only_disables_configured_relays":7,"P\\Tests\\Unit\\Selfserve\\SelfserveOpenApiSpecTest::__pest_evaluable_it_documents_self_serve_machine_wash_included_minutes_in_config_schemas":1,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_fails_fast_when_workspace_id_is_missing_for_gate_calls":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_fails_fast_when_channel_id_is_missing_for_gate_calls":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_fails_with_terminal_status_details_when_call_never_reaches_accepted_state":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_hangs_up_when_call_reaches_accepted_state":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_hangs_up_immediately_when_status_transitions_to_accepted":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_maps_legacy_timeout_option_to_documented_ringTimeout_payload_field":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_clamps_derived_ringTimeout_to_Bird_documented_max_when_gate_timeout_is_high":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_passes_documented_hangup_cause_when_provided":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_drops_unsupported_hangup_cause_values_from_request_payload":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_fails_fast_when_workspace_id_is_missing_for_gate_flash_calls":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_creates_gate_flash_call_with_documented_ringTimeout_payload":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_polls_flash_call_and_succeeds_once_accepted":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_fails_flash_gate_flow_when_terminal_failure_status_is_returned":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_does_not_fallback_to_regular_gate_call_when_flash_succeeds":8,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_falls_back_to_regular_gate_call_when_flash_fails":8,"P\\Tests\\Unit\\Selfserve\\SelfserveOpenApiSpecTest::__pest_evaluable_it_documents_property_gate_lane_commands_and_sanitized_gate_failure_responses":1,"P\\Tests\\Unit\\Bird\\BirdModuleClientMappingTest::__pest_evaluable_it_returns_raw_payload_for_malformed_JSON_responses_and_null_for_empty_responses":8,"P\\Tests\\Unit\\Bird\\BirdRouteWiringTest::__pest_evaluable_it_keeps_Bird_number_and_webhook_routes_intact":7,"P\\Tests\\Unit\\Bird\\BirdModuleClientMappingTest::__pest_evaluable_it_handles_malformed_and_empty_response_bodies_without_throwing_transport_errors":8,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherStatusTargetsTest::__pest_evaluable_it_aggregates_multi_department_slot_statuses_using_worst_severity_and_unknown_fallback_rules":7,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_adds_vehicle_type_product_on_STOP_when_program_selector_relay_is_online__then_turns_off_cleaner_and_machine_relays":7,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_bills_primary_product_when_selector_relay_is_online_even_if_relay_output_is_off":7,"P\\Tests\\Unit\\Bird\\BirdOpenApiSpecTest::__pest_evaluable_it_documents_all_Bird_voice_call_parity_endpoints_including_gather_recordings_insights_and_log":1,"P\\Tests\\Unit\\Bird\\BirdOpenApiSpecTest::__pest_evaluable_it_documents_flash_hangup_endpoint_and_marks_end_alias_as_deprecated":1,"P\\Tests\\Unit\\Bird\\BirdOpenApiSpecTest::__pest_evaluable_it_defines_request_and_response_schemas_for_Bird_call_command_recording_insight_log_and_flash_payloads":1,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueRouteRegistrationTest::__pest_evaluable_it_registers_collected_invoice_queue_endpoints_in_orderInvoicesRoute":7,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_uses_a_consistent_unavailable_service_contract_for_missing_queue_dependencies":7,"P\\Tests\\Unit\\Invoicing\\EconomicTransferOrderItemSkipTest::__pest_evaluable_it_wires_zero_cost_and_zero_quantity_skip_guard_into_transfer_line_builder":7,"P\\Tests\\Integration\\Invoicing\\EconomicTransferQueueIntegrationTest::__pest_evaluable_it_processes_queued_transfer_jobs_to_completion":1,"P\\Tests\\Integration\\Invoicing\\EconomicTransferQueueIntegrationTest::__pest_evaluable_it_deduplicates_active_jobs_per_transfer_target":1,"P\\Tests\\Integration\\Invoicing\\EconomicTransferQueueIntegrationTest::__pest_evaluable_it_rejects_invalid_payloads_without_inserting_queue_rows":1,"P\\Tests\\Integration\\Invoicing\\EconomicTransferQueueIntegrationTest::__pest_evaluable_it_supports_fail_retry_and_reprocess_lifecycle_transitions":1,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_supports_synchronous_fallback_branches_before_queue_enqueue_on_economic_invoice_export_routes":7,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_keeps_queue_status_endpoints_guarded_while_collected_invoice_export_routes_support_synchronous_fallback":7,"P\\Tests\\Unit\\Invoicing\\UserCollectedInvoiceUpdateRouteValidationTest::__pest_evaluable_it_supports_independent_po__number_and_closed__at_updates_for_PUT__collected_invoices_in_user_route":7,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueRouteHardeningTest::__pest_evaluable_it_returns_pagination_metadata_and_strict_status_handling_for_collected_invoice_queue_list":7,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueRouteHardeningTest::__pest_evaluable_it_enforces_retry_constraints_for_collected_invoice_queue_jobs_before_retry_execution":7,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueOpenApiSpecTest::__pest_evaluable_it_documents_collected_queue_list_metadata_and_strict_status_filter_enum_in_openapi":7,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueDetailsSummaryBuilderTest::__pest_evaluable_it_builds_a_completed_collected_invoice_queue_summary_from_payload_and_result":8,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueDetailsSummaryBuilderTest::__pest_evaluable_it_prefers_queue_error_messages_for_failed_jobs_and_keeps_null_safe_outcome_fields":8,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueDetailsSummaryBuilderTest::__pest_evaluable_it_uses_deterministic_status_message_fallback_when_no_explicit_message_exists":8,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueDetailsSummaryBuilderTest::__pest_evaluable_it_handles_object_payload_result_values_and_malformed_fields_without_throwing":8,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueWorkerTickRouteTest::__pest_evaluable_it_ticks_collected_invoice_transfer_queue_from_queue_list_and_status_routes":7,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueWorkerTickRouteTest::__pest_evaluable_it_ticks_order_transfer_queue_from_draft_and_invoice_status_routes":7,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayUpdateLifecycleTest::__pest_evaluable_it_builds_the_installer_around_the_PHP_agent_artifacts_and_management_polling_config":8,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayUpdateLifecycleTest::__pest_evaluable_it_exposes_update_payload__credential_rotation__and_operation_endpoints_without_shell_transport_wiring":8,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerHeartbeatStatusTest::__pest_evaluable_it_derives_relay_fallback_and_transport_health_details_without_shell_or_update_runtime_state":7,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_resolves_edge_agent_artifacts_from_the_source_tree_layout":7,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_prioritizes_mounted_and_baked_in_artifact_directories_before_repo_fallbacks":7,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_prioritizes_router_resources_before_mounted_and_baked_in_artifact_directories":7,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_lists_orders_for_an_admin_scoped_user_and_limits_the_results_to_the_permitted_departments":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_lists_only_the_targeted_customer_orders_for_subuser_sessions":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_returns_the_current_auth_and_permission_failures_when_order_listing_is_not_allowed":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_creates_orders_through_the_real_endpoint":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_rejects_invalid_order_creation_requests":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_updates_orders_through_the_primary_endpoint":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_reassigns_invoice_collections_when_changing_an_order_across_the_draft_customer_boundary":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_supports_legacy_field_value_metadata_updates_through_the_primary_endpoint":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_rejects_invalid_updates_through_the_primary_order_endpoint":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_updates_orders_through_the_legacy_alias_endpoint":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_supports_legacy_field_value_metadata_updates_through_the_alias_endpoint":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_rejects_invalid_updates_through_the_legacy_alias_endpoint":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_rejects_unsupported_legacy_field_value_updates_on_both_update_endpoints":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_deletes_orders_through_the_real_endpoint":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_rejects_invalid_order_delete_requests":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_regenerates_attached_wash_certificates_when_certificate_metadata_changes_through_the_primary_endpoint":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_regenerates_attached_wash_certificates_for_legacy_field_value_updates_through_the_alias_endpoint":8,"P\\Tests\\Api\\ApiCoverageManifestTest::__pest_evaluable_it_keeps_every_selected_API_operation_covered_by_happy_path_and_failure_tests":8,"P\\Tests\\Api\\ApiCoverageManifestTest::__pest_evaluable_it_keeps_the_OpenAPI_manifest_entries_aligned_with_the_API_spec":8,"P\\Tests\\Api\\ApiFixturesCleanupTest::__pest_evaluable_it_removes_generated_customer_traces_during_fixture_cleanup":8,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_logs_in_with_valid_customer_credentials":8,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_rejects_invalid_login_payloads_and_credentials":8,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_returns_the_cached_auth_session_payload_for_a_valid_token":8,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_includes_economic_runtime_config_for_uncached_auth_sessions":8,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_rejects_invalid_auth_session_tokens":8,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_logs_out_and_invalidates_the_token_for_future_session_calls":8,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_logs_out_and_invalidates_cached_subuser_sessions":8,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_rejects_invalid_logout_tokens":8,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_returns_the_raw_202_gather_webhook_contract_over_HTTP":8,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_still_prompts_for_department_selection_when_only_one_department_is_eligible":8,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_accepts_the_legacy_initial_webhook_body_with_top_level_call_identifiers":8,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_returns_native_flow_gather_data_after_a_top_level_department_selection_when_distinct_gate_choices_exist":8,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_opens_the_gate_immediately_after_a_top_level_department_selection_when_entrance_and_exit_share_the_same_gate":8,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_uses_a_multi_digit_gather_contract_when_10_departments_are_eligible":8,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_returns_a_raw_400_transport_error_for_malformed_webhook_payloads":8,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_lists_only_visible_departments_and_can_return_a_single_department_with_the_slack_webhook":8,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_rejects_department_listing_when_the_permission_is_missing":8,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_creates_departments_through_the_real_endpoint":8,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_rejects_invalid_department_create_requests":8,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_updates_departments_through_the_real_endpoint":8,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_rejects_invalid_department_update_requests":8,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_lists_department_categories_for_a_department":8,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_rejects_invalid_department_category_requests":8,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_lists_the_draft_customer_config_entry_in_economic_config_responses":8,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_round_trips_the_draft_customer_config_value_through_economic_config_updates":8,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_rejects_order_draft_exports_for_the_configured_draft_customer":8,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_rejects_booked_invoice_exports_for_the_configured_draft_customer":8,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_rejects_collected_invoice_exports_for_the_configured_draft_customer":8,"P\\Tests\\Api\\PingApiTest::__pest_evaluable_it_returns_the_ping_contract":8,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_returns_a_setup_required_error_when_department_terminal_readers_are_requested_without_terminal_setup":8,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_sends_a_Stripe_invoice_by_email_and_persists_the_hosted_invoice_association":8,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_returns_a_conflict_when_a_Stripe_hosted_invoice_is_already_active_for_the_order":8,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_allows_sending_a_new_Stripe_hosted_invoice_when_the_existing_association_is_already_terminal":8,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_voids_an_unpaid_Stripe_hosted_invoice_and_clears_the_local_order_association":8,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_refuses_to_cancel_a_paid_Stripe_hosted_invoice":8,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_returns_a_setup_required_error_when_creating_a_payment_intent_for_a_department_without_terminal_setup":8,"P\\Tests\\Api\\VehiclesApiTest::__pest_evaluable_it_returns_the_newest_vehicle_last__order__id_that_still_has_order_items":8,"P\\Tests\\Api\\VehiclesApiTest::__pest_evaluable_it_returns_a_null_vehicle_last__order__id_when_no_order_with_items_exists":8,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayViewCacheTest::__pest_evaluable_it_syncs_gateway_snapshots_into_cached_list_payloads_and_refreshes_fleet_usage":7,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayModuleRouteWiringTest::__pest_evaluable_it_keeps_only_the_module_facade_in_the_global_classes_directory_and_conditionally_loads_module_routes":7,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_builds_install_script_urls_with_the_compose_edge_gateway_artifacts_and_forwarded_https_scheme":8,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayUpdateLifecycleTest::__pest_evaluable_it_builds_the_installer_around_the_compose_stack_artifacts_and_management_polling_config":7,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayUpdateLifecycleTest::__pest_evaluable_it_exposes_update_payload__credential_rotation__cancel_endpoints__and_operation_endpoints_without_shell_transport_wiring":7,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayRouteWiringTest::__pest_evaluable_it_registers_the_v2_operator_facing_edge_gateway_routes":7,"P\\Tests\\Unit\\Selfserve\\EdgeGatewaySchemaBootstrapTest::__pest_evaluable_it_defines_the_v2_edge_gateway_schema_bootstrap_tables":7,"P\\Tests\\Unit\\Selfserve\\EdgeGatewaySchemaBootstrapTest::__pest_evaluable_it_stores_operation_metadata_and_event_timelines_for_management_workflows":7,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_prefers_EDGE__PUBLIC__API__URL_when_explicitly_configured":8,"P\\Tests\\Api\\PlateScannersApiTest::__pest_evaluable_it_returns_the_updated_lane_id_after_editing_a_scanner_whose_null_lane_was_already_cached":8,"P\\Tests\\Api\\EdgeGatewayAgentApiTest::__pest_evaluable_it_serves_installer_artifacts_and_recovers_gateway_runtime_status_after_fresh_heartbeats":8,"P\\Tests\\Api\\EdgeGatewayAgentApiTest::__pest_evaluable_it_polls_operations_and_commands__submits_results__and_records_broker_presence_for_task_pages":8,"P\\Tests\\Api\\EdgeGatewayBrokerApiTest::__pest_evaluable_it_builds_broker_backlog_and_completes_gateway_operations_through_broker_endpoints":8,"P\\Tests\\Api\\EdgeGatewayOperatorApiTest::__pest_evaluable_it_creates_install_tokens__tracks_installer_status__and_exposes_claimed_gateway_detail_to_authorized_operators":8,"P\\Tests\\Api\\EdgeGatewayOperatorApiTest::__pest_evaluable_it_manages_edge_gateway_metadata__bindings__operations__sessions__rotation__cutover__and_deletion":8,"P\\Tests\\Integration\\EdgeGateway\\EdgeGatewayBackendIntegrationTest::__pest_evaluable_it_assembles_tasks__logs__statistics__operations__commands__and_shell_lifecycle_state_from_persisted_records":1,"P\\Tests\\Api\\EdgeGatewayBrokerApiTest::__pest_evaluable_it_rejects_invalid_edge_broker_shared_secrets":8,"P\\Tests\\Api\\EdgeGatewayOperatorApiTest::__pest_evaluable_it_rejects_operator_edge_routes_when_module_permission_or_department_access_is_missing":8,"P\\Tests\\Api\\EdgeGatewayAgentApiTest::__pest_evaluable_it_rejects_missing_and_invalid_edge_agent_tokens":8,"P\\Tests\\Integration\\EdgeGateway\\EdgeGatewayBackendIntegrationTest::__pest_evaluable_it_persists_gateway_cutover_relay_bindings_used_by_self_serve_Shelly_dispatch":1,"P\\Tests\\Api\\EdgeGatewayBrokerApiTest::__pest_evaluable_it_validates_broker_sessions_and_ingests_presence__telemetry__logs__and_shell_lifecycle_data":8,"P\\Tests\\Api\\EdgeGatewayBrokerApiTest::__pest_evaluable_it_rejects_shell_session_creation_while_broker_presence_is_unavailable":8,"P\\Tests\\Api\\EdgeGatewayOperatorApiTest::__pest_evaluable_it_ignores_and_soft_deletes_edge_gateways_whose_department_no_longer_exists":8,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_appends_forwarded_ports_when_the_forwarded_host_omits_them":8,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_builds_websocket_broker_urls_on_the_traefik_broker_path":8,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_builds_localhost_websocket_broker_urls_on_the_local_traefik_api_prefix":8,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_keeps_root_host_api_urls_unprefixed_when_the_request_is_not_under_the_local_api_alias":8,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_resolves_simulator_gateway_service_bindings_from_lane_relay_slots":7,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_counts_overtime_minutes_when_a_saved_shift_end_extends_past_the_approved_original_end":7,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_counts_unapproved_overtime_from_a_bounded_shift_updateTime_fallback":7,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_caps_current_slot_hours_to_elapsed_minutes_and_zeroes_future_slots":7,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_round_trips_the_default_distribution_department_config_value_through_economic_config_updates":8,"P\\Tests\\Unit\\Replication\\ReplicationSecretBoxTest::__pest_evaluable_it_encrypts_replication_secrets_without_storing_plaintext":8,"P\\Tests\\Unit\\Replication\\ReplicationSecretBoxTest::__pest_evaluable_it_builds_active_database_and_redis_config_from_encrypted_bootstrap_snapshots":8,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_does_not_require_replica_SQL_threads_before_database_provisioning_configures_them":7,"P\\Tests\\Unit\\Invoicing\\EconomicDraftCustomerOpenApiSpecTest::__pest_evaluable_it_documents_transaction_draft_customer_config_and_auth_runtime_fields_in_all_tracked_openapi_copies":1,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_computes_MinIO_free_space_and_catch_up_math_safely":7,"P\\Tests\\Integration\\DailyReports\\DepartmentDailyReportComplaintsIntegrationTest::__pest_evaluable_it_counts_complaint_rows_by_department_and_created__at_reporting_range":1,"P\\Tests\\Integration\\DailyReports\\DepartmentDailyReportComplaintsIntegrationTest::__pest_evaluable_it_updates_and_deletes_complaint_rows":1,"P\\Tests\\Integration\\DailyReports\\DepartmentDailyReportComplaintsIntegrationTest::__pest_evaluable_it_parses_created__by__name_from_the_users_table":1,"P\\Tests\\Integration\\DailyReports\\DepartmentOutsideHoursStatisticsServiceIntegrationTest::__pest_evaluable_it_integrates_orders__xlvask__and_self_serve_into_one_outside_hours_summary_with_missing_hours_diagnostics":1,"P\\Tests\\Integration\\EdgeGateway\\EdgeGatewayBackendIntegrationTest::__pest_evaluable_it_persists_install_session_updates_and_derives_gateway_runtime_status_from_heartbeats":1,"P\\Tests\\Integration\\Invoicing\\EconomicTransferQueueIntegrationTest::__pest_evaluable_it_processes_only_collected_invoice_jobs_and_respects_the_manual_batch_limit":1,"P\\Tests\\Integration\\SystemStatus\\SuperuserSystemStatusInfrastructureProbeTest::__pest_evaluable_it_can_probe_the_configured_database_in_integration_mode":1,"P\\Tests\\Integration\\SystemStatus\\SuperuserSystemStatusInfrastructureProbeTest::__pest_evaluable_it_can_probe_redis_in_integration_mode_when_configured":1,"P\\Tests\\Integration\\SystemStatus\\SuperuserSystemStatusInfrastructureProbeTest::__pest_evaluable_it_can_probe_minio_in_integration_mode_when_configured":1,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_creates_Coolify_service_payloads_from_raw_compose_without_a_service_type":7,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_uses_the_selected_Coolify_project_and_resolves_server_UUID_from_the_instance_default":8,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_creates_Coolify_GitHub_App_application_payloads_so_pulls_use_the_app_token":7,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_uses_the_self_contained_Coolify_API_Dockerfile_for_API_applications":7,"P\\Tests\\Unit\\Tooling\\ComposerEntrypointTest::__pest_evaluable_it_checks_PSR_HTTP_message_interfaces_before_trusting_a_Composer_vendor_tree":7,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_defines_release_manager_schema__routes__permissions__and_system_status_integration_hooks":7,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_requires_non_default_release_channel_runtime_URLs_and_preserves_load_balancer_paths":7,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_wires_MinIO_replication_through_routes_and_bootstrap_snapshots":7,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_defines_Coolify_schema__route_permissions__and_replication_integration_hooks":7,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_chooses_a_requested_runtime_channel_only_when_it_is_available_to_the_principal":8,"P\\Tests\\Api\\OrderBookingsCompletionApiTest::__pest_evaluable_it_rejects_standalone_order_booking_completion_outside_POS":8,"P\\Tests\\Api\\OrderBookingsCompletionApiTest::__pest_evaluable_it_allows_linked_POS_order_booking_completion_for_mobile_POS_compatibility":8,"P\\Tests\\Api\\OrderBookingsCompletionApiTest::__pest_evaluable_it_accepts_numeric_safety_seal_strings_when_completing_a_linked_POS_order_booking":8,"P\\Tests\\Api\\OrderBookingsCompletionApiTest::__pest_evaluable_it_disables_the_legacy_complete_wash_without_certificate_route":8,"P\\Tests\\Api\\OrderBookingsUpdateApiTest::__pest_evaluable_it_detaches_an_order_booking_and_clears_the_matching_order_link":8,"P\\Tests\\Api\\OrderBookingsUpdateApiTest::__pest_evaluable_it_keeps_the_linked_order_when_order__id_is_omitted_from_an_order_booking_update":8,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_allows_explicit_runtime_selection_of_any_enabled_release_channel":7,"P\\Tests\\Api\\SelfserveLaneWashInProgressApiTest::__pest_evaluable_it_requires_authentication_before_checking_in_progress_wash_permissions":8,"P\\Tests\\Api\\SelfserveLaneWashInProgressApiTest::__pest_evaluable_it_reports_both_elevated_and_customer_self_serve_permissions_when_lane_polling_is_not_allowed":8,"P\\Tests\\Api\\SelfserveLaneWashInProgressApiTest::__pest_evaluable_it_allows_customer_self_serve_permission_to_view_their_own_in_progress_wash_details":8,"P\\Tests\\Api\\SelfserveLaneWashInProgressApiTest::__pest_evaluable_it_redacts_another_customers_in_progress_wash_from_customer_self_serve_lane_polling":8,"P\\Tests\\Api\\SelfserveFixtureApiTest::__pest_evaluable_it_creates_a_comprehensive_self_serve_API_scenario_with_demo_relays":8,"P\\Tests\\Api\\SelfserveZZZShellyGuardApiTest::__pest_evaluable_it_did_not_record_any_real_Shelly_request_attempts_during_self_serve_API_tests":8,"P\\Tests\\Api\\ApiFixturesCleanupTest::__pest_evaluable_it_restores_preserved_module_config_rows_during_fixture_cleanup":8,"P\\Tests\\Api\\BrandingApiTest::__pest_evaluable_it_creates_lists_and_updates_complete_branding_values":8,"P\\Tests\\Api\\BrandingApiTest::__pest_evaluable_it_rejects_branding_requests_without_permissions_or_valid_input":8,"P\\Tests\\Api\\BrandingApiTest::__pest_evaluable_it_assigns_and_clears_department_branding_for_superusers":8,"P\\Tests\\Api\\BrandingApiTest::__pest_evaluable_it_rejects_invalid_department_branding_assignments":8,"P\\Tests\\Api\\CollectedInvoiceMonthlySplitApiTest::__pest_evaluable_it_previews_monthly_split_changes_without_moving_orders_or_creating_collections":8,"P\\Tests\\Api\\CollectedInvoiceMonthlySplitApiTest::__pest_evaluable_it_splits_a_selected_March_and_April_collected_invoice_into_monthly_collections":8,"P\\Tests\\Api\\CollectedInvoiceMonthlySplitApiTest::__pest_evaluable_it_sets_closed__at_to_month_end_when_split_month_has_ended":8,"P\\Tests\\Api\\CollectedInvoiceMonthlySplitApiTest::__pest_evaluable_it_splits_the_whole_affected_collection_even_when_only_one_month_is_selected":8,"P\\Tests\\Api\\CollectedInvoiceMonthlySplitApiTest::__pest_evaluable_it_does_not_affect_booked_collected_invoices":8,"P\\Tests\\Api\\CollectedInvoiceMonthlySplitApiTest::__pest_evaluable_it_skips_draft_linked__Stripe__and_single_month_collections":8,"P\\Tests\\Api\\CollectedInvoiceMonthlySplitApiTest::__pest_evaluable_it_rejects_invalid_monthly_split_date_ranges":8,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_allows_superusers_to_filter_archived_departments":8,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_does_not_allow_regular_department_listings_to_reveal_archived_departments_through_filters":8,"P\\Tests\\Api\\EdgeGatewayConfigApiTest::__pest_evaluable_it_stores_broker_settings_in_edge_gateway_module_config_and_uses_them_for_shell_sessions":8,"P\\Tests\\Api\\EdgeGatewayConfigApiTest::__pest_evaluable_it_returns_broker_diagnostics_for_the_current_edge_gateway_module_config_values":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_defaults_order_PO_from_a_linked_booking_when_creating_without_an_order_PO":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_keeps_an_explicit_order_PO_when_creating_a_linked_order":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_defaults_blank_order_PO_from_a_linked_booking_on_order_updates":8,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_requires_explicit_confirmation_before_deleting_protected_orders":8,"P\\Tests\\Api\\PlateScannersApiTest::__pest_evaluable_it_rejects_plate_scanner_edits_when_the_permission_is_missing":8,"P\\Tests\\Api\\ReferenceSuggestionsApiTest::__pest_evaluable_it_returns_ranked_POS_reference_suggestions_from_bookings__orders__and_customer_vehicles":8,"P\\Tests\\Api\\ReferenceSuggestionsApiTest::__pest_evaluable_it_orders_reference_suggestions_by_match_relevance_before_context_and_frequency":8,"P\\Tests\\Api\\ReferenceSuggestionsApiTest::__pest_evaluable_it_enforces_authentication__list_permission__and_department_access_for_reference_suggestions":8},"times":{"P\\Tests\\Unit\\Auth\\CreateTokenTest::__pest_evaluable_it_creates_a_64_char_auth_token_for_an_existing_user":0.11,"P\\Tests\\Unit\\Auth\\CreateTokenTest::__pest_evaluable_it_throws_a_clear_exception_when_customer_user_is_missing":0.017,"P\\Tests\\Unit\\Auth\\LegacyAuthScriptParityTest::__pest_evaluable_it_keeps_passkey_challenge_legacy_script_green_during_migration":0.032,"P\\Tests\\Unit\\Auth\\LegacyAuthScriptParityTest::__pest_evaluable_it_keeps_register_CVR_legacy_script_green_during_migration":0.035,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteIvrTest::__pest_evaluable_it_builds_deterministic_department_digit_map_and_caps_to_9_options":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteIvrTest::__pest_evaluable_it_resolves_department_ids_by_selected_digit":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteIvrTest::__pest_evaluable_it_resolves_gate_type_digit_to_entrance_or_exit":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteIvrTest::__pest_evaluable_it_stores__loads_and_clears_ivr_state_with_ttl":0.001,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteIvrTest::__pest_evaluable_it_validates_state_caller_fingerprint_matching":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteIvrTest::__pest_evaluable_it_builds_department_and_gate_prompts":0,"P\\Tests\\Unit\\Permissions\\PermissionNodeDefinitionTest::__pest_evaluable_it_creates_permission_nodes_linked_to_subuser_permission_keys":0,"P\\Tests\\Unit\\Permissions\\PermissionNodeDefinitionTest::__pest_evaluable_it_rejects_empty_permission_definitions":0,"P\\Tests\\Unit\\Selfserve\\NormalizationTest::__pest_evaluable_it_normalizes_button_arrays__json_and_csv_inputs":0,"P\\Tests\\Unit\\Selfserve\\NormalizationTest::__pest_evaluable_it_rejects_invalid_button_inputs":0,"P\\Tests\\Unit\\Selfserve\\NormalizationTest::__pest_evaluable_it_normalizes_vehicle_type_values_and_null_semantics":0,"P\\Tests\\Unit\\Selfserve\\NormalizationTest::__pest_evaluable_it_rejects_invalid_vehicle_type_values":0,"P\\Tests\\Unit\\Selfserve\\NormalizationTest::__pest_evaluable_it_rejects_non_numeric_vehicle_type_strings":0,"P\\Tests\\Unit\\Selfserve\\NormalizationTest::__pest_evaluable_it_keeps_lane_service_enum_contract_for_MACHINE":0,"P\\Tests\\Unit\\Subusers\\SubuserGrantInitializationTest::__pest_evaluable_it_initializes_booking_node_grants_without_DB_dependency":0,"P\\Tests\\Unit\\Subusers\\SubuserGrantInitializationTest::__pest_evaluable_it_initializes_selfserve_node_grants_without_DB_dependency":0,"P\\Tests\\Unit\\Subusers\\SubusersRoutePermissionLinkTest::__pest_evaluable_it_keeps_subusers_route_list_permission_linked_to_SUBUSERS__LIST_node":0.009,"P\\Tests\\Unit\\Search\\SystemSearchEntityTypeCoverageTest::__pest_evaluable_it_keeps_route_and_service_entity_type_registries_in_sync_with_expanded_coverage":0,"P\\Tests\\Unit\\Search\\SystemSearchEntityTypeCoverageTest::__pest_evaluable_it_documents_every_supported_search_entity_type_in_openapi_enum":0.047,"P\\Tests\\Unit\\Search\\SystemSearchEconomicCustomerIndexWiringTest::__pest_evaluable_it_wires_local_e_conomic_customer_index_into_customer_related_search_entities":0.016,"P\\Tests\\Unit\\Search\\SystemSearchEconomicCustomerIndexWiringTest::__pest_evaluable_it_registers_cron_tasks_that_keep_the_e_conomic_search_index_refreshed":0.018,"P\\Tests\\Unit\\Search\\SystemSearchInvalidationHooksTest::__pest_evaluable_it_marks_system_search_cache_dirty_from_generic_db_object_mutation_flows":0.052,"P\\Tests\\Unit\\Search\\SystemSearchInvalidationHooksTest::__pest_evaluable_it_marks_system_search_cache_dirty_from_object_property_mutations":0.01,"P\\Tests\\Unit\\Search\\SystemSearchInvalidationHooksTest::__pest_evaluable_it_marks_system_search_cache_dirty_when_module_config_values_change":0.008,"P\\Tests\\Unit\\Search\\SystemSearchInvalidationHooksTest::__pest_evaluable_it_registers_cron_maintenance_task_for_system_search_cache":0.075,"P\\Tests\\Unit\\Search\\SystemSearchOpenAiIntentParserTest::__pest_evaluable_it_redacts_obvious_sensitive_fragments_before_sending_query_to_intent_parser":0.001,"P\\Tests\\Unit\\Search\\SystemSearchOpenAiIntentParserTest::__pest_evaluable_it_builds_payload_with_redacted_query_and_parses_strict_JSON_output":0.001,"P\\Tests\\Unit\\Search\\SystemSearchOpenAiIntentParserTest::__pest_evaluable_it_falls_back_safely_when_OpenAI_is_disabled":0,"P\\Tests\\Unit\\Search\\SystemSearchOpenAiIntentParserTest::__pest_evaluable_it_handles_malformed_OpenAI_response_payloads_without_throwing":0,"P\\Tests\\Unit\\Search\\SystemSearchOpenAiIntentParserTest::__pest_evaluable_it_uses_parser_cache_for_identical_query_and_allowed_type_combinations":0,"P\\Tests\\Unit\\Search\\SystemSearchOpenAiIntentParserTest::__pest_evaluable_it_caps_alias_and_hint_payloads_from_OpenAI_and_filters_hints_to_allowed_types":0,"P\\Tests\\Unit\\Search\\SystemSearchOpenApiSpecTest::__pest_evaluable_it_documents_system_wide_search_endpoints_in_openapi":0.106,"P\\Tests\\Unit\\Search\\SystemSearchOpenApiSpecTest::__pest_evaluable_it_documents_debug__intent_and_parser_metadata_schema_in_openapi":0.035,"P\\Tests\\Unit\\Search\\SystemSearchOpenApiSpecTest::__pest_evaluable_it_documents_e_conomic_indexed_customer_matching_and_synonym_behavior":0.022,"P\\Tests\\Unit\\Search\\SystemSearchRouteBehaviorTest::__pest_evaluable_it_normalizes_type_lists_from_csv_json_and_arrays":0,"P\\Tests\\Unit\\Search\\SystemSearchRouteBehaviorTest::__pest_evaluable_it_parses_booleans_and_clamps_integers_using_route_defaults":0,"P\\Tests\\Unit\\Search\\SystemSearchRouteBehaviorTest::__pest_evaluable_it_exposes_expected_searchable_entity_types":0,"P\\Tests\\Unit\\Search\\SystemSearchRouteWiringTest::__pest_evaluable_it_registers_system_wide_search_GET_and_POST_endpoints_with_intent_debug_support":0.028,"P\\Tests\\Unit\\Search\\SystemSearchRouteWiringTest::__pest_evaluable_it_registers_superuser_cache_clear_and_rebuild_endpoints_for_system_search":0.031,"P\\Tests\\Unit\\Search\\SystemSearchRouteWiringTest::__pest_evaluable_it_passes_permission_and_own_scope_context_into_system_search_service":0.008,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_does_not_invoke_intent_parser_when_lexical_confidence_is_already_high":0.001,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_invokes_parser_on_low_confidence_lexical_results_and_applies_hints_only_boosts":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_never_lets_parser_entity_hints_override_explicit_include_filters":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_returns_fallback_parser_metadata_when_parser_fails_gracefully":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_scopes_query_cache_by_permission_context_to_avoid_cross_user_cache_leakage":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_caps_AI_driven_expanded_terms_to_prevent_query_amplification":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_expands_danish_discount_wording_into_lexical_discount_synonyms":0.003,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_invokes_parser_for_intent_driven_natural_language_queries_even_when_lexical_score_is_high":0.003,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_uses_association_hints_to_pull_related_customer_records_from_non_customer_matches":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_prefers_newer_records_when_relevance_scores_are_comparable":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_keeps_explicit_identifier_matches_ahead_of_newer_but_weaker_records":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_promotes_invoices_orders_order_bookings_and_customers_in_ranking":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_never_prioritizes_cancelled_bookings_over_active_bookings":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_heavily_demotes_configured_low_priority_entity_types_in_ranking":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_tokenizes_unicode_names_without_stripping_non_ascii_letters":0.001,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_does_not_treat_explicit_identifier_queries_as_intent_driven":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_requires_broader_term_coverage_for_multi_word_scoring":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_enriches_object_attachment_results_with_associated_customer_context":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_includes_the_economic_customer_index_in_cache_dependencies_for_customer_scoped_results":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_falls_back_to_invoice_date_ranges_when_invoice_names_are_missing":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_derives_xlvask_customer_numbers_only_from_digits_only_extern_ids":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_replaces_unnamed_user_titles_with_the_customer_context_name":0,"P\\Tests\\Unit\\Search\\SystemSearchServiceIntentFlowTest::__pest_evaluable_it_uses_the_goal_criteria_label_for_department_goal_titles":0,"P\\Tests\\Integration\\Search\\SystemSearchCacheIntegrationTest::__pest_evaluable_it_reuses_parser_cache_entries_for_repeated_natural_language_intent_requests":0.129,"P\\Tests\\Integration\\Search\\SystemSearchCacheIntegrationTest::__pest_evaluable_it_clears_parser_cache_namespace_via_clearAll_to_force_a_fresh_parse":0,"P\\Tests\\Integration\\Search\\SystemSearchCacheIntegrationTest::__pest_evaluable_it_bumps_per_table_cache_versions_when_a_dirty_table_marker_is_registered":0.05,"P\\Tests\\Unit\\Invoicing\\EconomicV2DistributionServiceFallbackTest::__pest_evaluable_it_falls_back_to_system_orders_for_fixed_pricing_when_regular_orders_yield_no_customers":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2DistributionServiceFallbackTest::__pest_evaluable_it_falls_back_to_system_orders_for_wash_subscriptions_when_regular_orders_yield_no_customers":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2CliBackfillCommandTest::__pest_evaluable_it_registers_economic_v2_backfill_command_in_cli_dispatcher":0.005,"P\\Tests\\Unit\\Invoicing\\EconomicV2CliBackfillCommandTest::__pest_evaluable_it_provides_a_backfill_cron_script_entrypoint":0.007,"P\\Tests\\Unit\\Invoicing\\EconomicV2CompareEngineTest::__pest_evaluable_it_returns_exact__match_when_totals_lines_and_departments_are_identical":0.001,"P\\Tests\\Unit\\Invoicing\\EconomicV2CompareEngineTest::__pest_evaluable_it_returns_total__mismatch_when_only_totals_differ":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2CompareEngineTest::__pest_evaluable_it_detects_line_level_mismatches_for_quantity_and_price":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2CompareEngineTest::__pest_evaluable_it_detects_departmental_distribution_mismatches":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2CompareEngineTest::__pest_evaluable_it_returns_missing__target_when_draft_or_booked_target_is_unavailable":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2LineNormalizerTest::__pest_evaluable_it_normalizes_draft_invoice_lines_including_departmental_distributions":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2LineNormalizerTest::__pest_evaluable_it_marks_text_only_zero_value_lines_as_non_billable_and_keeps_deterministic_key":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2LineNormalizerTest::__pest_evaluable_it_normalizes_booked_invoices_and_computes_net_total_delta_from_lines":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2LineNormalizerTest::__pest_evaluable_it_contains_internal_normalization_path_with_departmental_metadata_support":0.005,"P\\Tests\\Unit\\Invoicing\\EconomicV2OpenApiSpecTest::__pest_evaluable_it_documents_economic_v2_invoice_paths_in_openapi":0.016,"P\\Tests\\Unit\\Invoicing\\EconomicV2OpenApiSpecTest::__pest_evaluable_it_documents_v2_historical_distribution_and_pricing_history_paths_in_openapi":0.011,"P\\Tests\\Unit\\Invoicing\\EconomicV2OpenApiSpecTest::__pest_evaluable_it_aligns_legacy_compare_schema_with_runtime_payload_by_removing_stale_required_order__ids":0.012,"P\\Tests\\Unit\\Invoicing\\EconomicV2OpenApiSpecTest::__pest_evaluable_it_defines_new_reusable_v2_schemas_for_normalization_comparison_versioning_and_distribution":0.01,"P\\Tests\\Unit\\Invoicing\\EconomicV2RevenueAndBarredSupportTest::__pest_evaluable_it_supports_barred_filtering_when_listing_e_conomic_customers":0.08,"P\\Tests\\Unit\\Invoicing\\EconomicV2RevenueAndBarredSupportTest::__pest_evaluable_it_implements_a_dedicated_v2_e_conomic_revenue_statistics_service_and_route":0.014,"P\\Tests\\Unit\\Invoicing\\EconomicV2RouteAndVersioningHooksTest::__pest_evaluable_it_registers_all_collected_invoice_economic_v2_routes_with_explicit_permissions":0.006,"P\\Tests\\Unit\\Invoicing\\EconomicV2RouteAndVersioningHooksTest::__pest_evaluable_it_registers_version_aware_distribution_and_pricing_history_v2_routes":0.008,"P\\Tests\\Unit\\Invoicing\\EconomicV2RouteAndVersioningHooksTest::__pest_evaluable_it_caches_v2_distribution_responses_with_a_configurable_redis_ttl":0.004,"P\\Tests\\Unit\\Invoicing\\EconomicV2RouteAndVersioningHooksTest::__pest_evaluable_it_writes_fixed_pricing_versions_from_create_and_delete_flows":0.005,"P\\Tests\\Unit\\Invoicing\\EconomicV2RouteAndVersioningHooksTest::__pest_evaluable_it_writes_vehicle_subscription_versions_for_create_update_delete_flows":0.003,"P\\Tests\\Unit\\Invoicing\\EconomicV2RouteAndVersioningHooksTest::__pest_evaluable_it_writes_discount_override_versions_from_superuser_discounts_route":0.007,"P\\Tests\\Unit\\Invoicing\\EconomicV2RouteAndVersioningHooksTest::__pest_evaluable_it_keeps_legacy_compare_endpoint_path_for_backward_compatibility":0.002,"P\\Tests\\Unit\\Invoicing\\EconomicV2VersioningServiceStructureTest::__pest_evaluable_it_implements_effective_range_lifecycle_methods_for_all_versioned_entities":0.036,"P\\Tests\\Unit\\Invoicing\\EconomicV2VersioningServiceStructureTest::__pest_evaluable_it_closes_previous_active_interval_before_inserting_a_new_version":0.021,"P\\Tests\\Unit\\Invoicing\\EconomicV2VersioningServiceStructureTest::__pest_evaluable_it_includes_best_effort_backfill_with_provenance_and_confidence_metadata":0.005,"P\\Tests\\Unit\\Invoicing\\EconomicV2VersioningServiceStructureTest::__pest_evaluable_it_anchors_historical_resolution_on_order_created__at_timestamps_in_distribution_service":0.013,"P\\Tests\\Unit\\Invoicing\\InvoicingOrdersCalculationsHardeningTest::__pest_evaluable_it_guards_against_empty_order_ids_in_net_amount_calculation":0.081,"P\\Tests\\Unit\\Invoicing\\InvoicingOrdersCalculationsHardeningTest::__pest_evaluable_it_guards_against_empty_customer_arrays_in_date_range_transaction_fetches":0.074,"P\\Tests\\Unit\\Invoicing\\InvoicingOrdersCalculationsHardeningTest::__pest_evaluable_it_uses_centralized_duplicate_filtering_for_possible_duplicate_detection":0.081,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodRouteCacheHelpersTest::__pest_evaluable_it_uses_sane_ttl_defaults_and_clamps_negative_ttl_to_zero":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodRouteCacheHelpersTest::__pest_evaluable_it_builds_deterministic_cache_keys_per_scope_and_date_range":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodRouteCacheHelpersTest::__pest_evaluable_it_falls_back_to_resolver_directly_when_cache_ttl_is_disabled":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodRouteGuardsTest::__pest_evaluable_it_requires_superuser_permission_for_invoicing_period_distribution_all_endpoint":0.05,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodRouteGuardsTest::__pest_evaluable_it_uses_shared_date_range_normalization_across_invoicing_period_endpoints":0.705,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodUtilsTest::__pest_evaluable_it_normalizes_a_valid_invoicing_date_range_to_full_day_timestamps":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodUtilsTest::__pest_evaluable_it_rejects_invalid_date_formats":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodUtilsTest::__pest_evaluable_it_rejects_descending_date_ranges":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodUtilsTest::__pest_evaluable_it_finds_duplicate_orders_regardless_of_original_input_order":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2DistributionServiceFallbackTest::__pest_evaluable_it_runs_best_effort_backfill_when_fixed_pricing_version_history_is_empty":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConditionEvaluatorTest::__pest_evaluable_it_evaluates_self_serve_conditions_with_combined_AND_and_OR_semantics":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConditionEvaluatorTest::__pest_evaluable_it_prefers_condition_results_over_question_answers_when_evaluating_task_gates":0,"P\\Tests\\Unit\\Selfserve\\SelfserveOpenApiSpecTest::__pest_evaluable_it_documents_self_serve_machine_type__eligibility__summary__and_webhook_endpoints":0.008,"P\\Tests\\Unit\\Selfserve\\SelfserveOpenApiSpecTest::__pest_evaluable_it_defines_reusable_self_serve_wash_and_machine_type_schemas":0.007,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_self_serve_machine_types__eligibility__summaries__and_machine_start_webhook_routes":0.012,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_keeps_machine_type_support_wired_into_lanes__tasks__and_conditions_routes":0.014,"P\\Tests\\Unit\\N8n\\N8nRouteHelpersTest::__pest_evaluable_it_normalizes_webhook_methods_and_falls_back_to_POST_for_unsupported_verbs":0,"P\\Tests\\Unit\\N8n\\N8nRouteHelpersTest::__pest_evaluable_it_filters_request_parameters_down_to_the_allowed_n8n_query_keys":0,"P\\Tests\\Unit\\N8n\\N8nRouteWiringTest::__pest_evaluable_it_registers_workflow_lifecycle_endpoints_for_the_n8n_module":0.182,"P\\Tests\\Unit\\N8n\\N8nRouteWiringTest::__pest_evaluable_it_registers_execution_and_webhook_trigger_endpoints_for_the_n8n_module":0.115,"P\\Tests\\Unit\\Invoicing\\EconomicV2BookedDepartment75DistributionTest::__pest_evaluable_it_redistributes_booked_department_75_net_amounts_using_fixed_pricing_and_wash_subscription_weights":0.001,"P\\Tests\\Unit\\Invoicing\\EconomicV2BookedDepartment75DistributionTest::__pest_evaluable_it_keeps_classified_booked_department_75_amounts_undistributed_when_no_monthly_basis_exists":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2BookedDepartment75DistributionTest::__pest_evaluable_it_keeps_unclassified_booked_department_75_lines_undistributed_with_warnings":0,"P\\Tests\\Unit\\Invoicing\\EconomicEndpointUrlEncodingTest::__pest_evaluable_it_encodes_raw_filter_query_values_that_include_timestamps":0,"P\\Tests\\Unit\\Invoicing\\EconomicEndpointUrlEncodingTest::__pest_evaluable_it_avoids_double_encoding_query_values_that_are_already_escaped":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2BookedDepartment75DistributionTest::__pest_evaluable_it_supports_bulk_booked_invoice_line_payloads_with_top_level_department_numbers":0,"P\\Tests\\Unit\\Redis\\RedisAtomicReservationTest::__pest_evaluable_it_claims_a_slot_atomically_with_nx_and_expiration":0,"P\\Tests\\Unit\\Redis\\RedisAtomicReservationTest::__pest_evaluable_it_returns_false_when_the_slot_is_already_claimed_and_clamps_ttl_to_one_second":0,"P\\Tests\\Unit\\Bookings\\OrderBookingRouteIdempotencyGuardTest::__pest_evaluable_it_guards_order_booking_creation_with_redis_backed_idempotency":0.101,"P\\Tests\\Unit\\DynamicImages\\DynamicImagePreRenderCronWiringTest::__pest_evaluable_it_registers_dynamic_image_pre_render_cron_task_and_related_helpers":0.01,"P\\Tests\\Integration\\Database\\DbConnectionTest::__pest_evaluable_it_can_connect_to_a_configured_MySQL_instance_in_integration_mode":0.016,"P\\Tests\\Integration\\Invoicing\\EconomicV2BackfillAndDistributionIntegrationTest::__pest_evaluable_it_runs_best_effort_backfill_repeatedly_without_introducing_duplicate_same_start_rows":0.013,"P\\Tests\\Integration\\Invoicing\\EconomicV2BackfillAndDistributionIntegrationTest::__pest_evaluable_it_resolves_version_aware_distribution_payload_shapes_over_a_real_date_range":0.016,"P\\Tests\\Integration\\Invoicing\\EconomicV2VersioningServiceIntegrationTest::__pest_evaluable_it_creates_closes_and_rotates_fixed_pricing_versions_without_overlap":0.015,"P\\Tests\\Integration\\Invoicing\\EconomicV2VersioningServiceIntegrationTest::__pest_evaluable_it_tracks_vehicle_and_discount_version_lifecycles_with_closure_semantics":0.014,"P\\Tests\\Integration\\Permissions\\LegacyPermissionRedisCacheScriptTest::__pest_evaluable_it_keeps_legacy_route_permission_redis_cache_script_green":0.01,"P\\Tests\\Unit\\Permissions\\AllowOwnOrDepartmentAccessForbiddenTest::__pest_evaluable_it_returns_both_own_and_elevated_permissions_when_both_are_missing":0,"P\\Tests\\Unit\\Permissions\\AllowOwnOrDepartmentAccessForbiddenTest::__pest_evaluable_it_returns_only_elevated_permission_when_own_permission_exists_but_own_context_fails":0,"P\\Tests\\Unit\\Permissions\\AllowOwnOrDepartmentAccessForbiddenTest::__pest_evaluable_it_allows_elevated_permission_path_without_forbidden_and_validates_department_access":0,"P\\Tests\\Unit\\Permissions\\ForbiddenResponseWiringTest::__pest_evaluable_it_routes_and_trait_use_forbidden_responses_for_permission_and_ownership_denials":0.19,"P\\Tests\\Unit\\Permissions\\GroupPermissionSessionInvalidationWiringTest::__pest_evaluable_it_invalidates_related_user_permission_and_auth_session_caches_when_group_permissions_change":0.064,"P\\Tests\\Unit\\Goals\\GoalsCriteriaTargetDurationTest::__pest_evaluable_it_parses_advanced_target_duration_from_snake__case_fields":0.36,"P\\Tests\\Unit\\Goals\\GoalsCriteriaTargetDurationTest::__pest_evaluable_it_parses_advanced_target_duration_from_camelCase_aliases":0,"P\\Tests\\Unit\\Goals\\GoalsCriteriaTargetDurationTest::__pest_evaluable_it_normalizes_ENTIRE__DURATION_to_ignore_target__duration__every":0,"P\\Tests\\Unit\\Goals\\GoalsCriteriaTargetDurationTest::__pest_evaluable_it_defaults_recurring_target__duration__every_to_1_when_omitted":0,"P\\Tests\\Unit\\Goals\\GoalsCriteriaTargetDurationTest::__pest_evaluable_it_keeps_strict_legacy_mode_when_target__duration_is_invalid":0,"P\\Tests\\Unit\\Goals\\GoalsCriteriaTargetMathTest::__pest_evaluable_it_computes_weekly_target_using_touched_ISO_weeks_for_March_2026":0,"P\\Tests\\Unit\\Goals\\GoalsCriteriaTargetMathTest::__pest_evaluable_it_applies_target__duration__every_for_weekly_cadence":0,"P\\Tests\\Unit\\Goals\\GoalsCriteriaTargetMathTest::__pest_evaluable_it_prorates_ENTIRE__DURATION_target_by_overlap_days":0,"P\\Tests\\Unit\\Goals\\GoalsCriteriaTargetMathTest::__pest_evaluable_it_splits_advanced_target_by_override_weights_per_department":0,"P\\Tests\\Unit\\Goals\\GoalsCriteriaTargetMathTest::__pest_evaluable_it_preserves_legacy_target_behavior_when_target__duration_is_missing":0,"P\\Tests\\Unit\\Goals\\GoalsLegacyRendererScriptsTest::__pest_evaluable_it_keeps_legacy_monthly_renderer_script_green":0.466,"P\\Tests\\Unit\\Goals\\GoalsLegacyRendererScriptsTest::__pest_evaluable_it_keeps_legacy_department_daily_renderer_script_green":0.879,"P\\Tests\\Unit\\Goals\\GoalsOpenApiSpecTest::__pest_evaluable_it_documents_advanced_goals_target_duration_fields_in_openapi":0.07,"P\\Tests\\Unit\\Workfeed\\WorkfeedClientConformanceTest::__pest_evaluable_it_uses_company_scoped_workfeed_endpoints_and_raw_Authorization_header":0.006,"P\\Tests\\Unit\\Workfeed\\WorkfeedClientConformanceTest::__pest_evaluable_it_normalizes_documented_shift_query_parameters":0.005,"P\\Tests\\Unit\\Workfeed\\WorkfeedConfigRouteWiringTest::__pest_evaluable_it_registers_module_config_endpoints_for_workfeed":0.007,"P\\Tests\\Unit\\Workfeed\\WorkfeedRouteHelpersTest::__pest_evaluable_it_filters_request_parameters_down_to_the_allowed_workfeed_query_keys":0.001,"P\\Tests\\Unit\\Workfeed\\WorkfeedRouteWiringTest::__pest_evaluable_it_registers_employee_and_department_endpoints_for_the_workfeed_module":0.008,"P\\Tests\\Unit\\Workfeed\\WorkfeedRouteWiringTest::__pest_evaluable_it_registers_shift_endpoints_for_the_workfeed_module":0.008,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_calculates_workfeed_employee_hours_for_the_hour_slot_based_on_overlap":0.001,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_extracts_department_id_from_supported_workfeed_shift_shapes":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_normalizes_wrapped_workfeed_collections_from_common_response_keys":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTimelineSchemaConformanceTest::__pest_evaluable_it_includes_a_date_key_in_department_weather_timeline_entries":0.006,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTimelineSchemaConformanceTest::__pest_evaluable_it_documents_the_date_key_in_the_openapi_department_weather_timeline_schema":0.034,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTimelineRangeTest::__pest_evaluable_it_builds_a_timeline_range_from_start_of_yesterday_to_end_of_today":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTimelineRangeTest::__pest_evaluable_it_builds_a_timeline_range_relative_to_an_explicit_selected_date_override":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_calculates_workfeed_employee_hours_across_multiple_departments_for_one_hour_slot":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_normalizes_department_id_input_from_scalar_csv_and_nested_array_values":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTimelineRangeTest::__pest_evaluable_it_builds_a_timeline_range_relative_to_explicit_date__from_and_date__to_override":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTimelineRangeTest::__pest_evaluable_it_resolves_forecast_day_count_for_a_given_timeline_range_with_sane_limits":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherFallbackBehaviorTest::__pest_evaluable_it_resolves_weather_coordinates_from_valid_coordinates_only":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherFallbackBehaviorTest::__pest_evaluable_it_returns_null_weather_coordinates_when_all_department_locations_are_invalid":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherFallbackBehaviorTest::__pest_evaluable_it_classifies_weatherapi_no_matching_location_errors_as_location_lookup_failures":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherFallbackBehaviorTest::__pest_evaluable_it_does_not_classify_non_location_weatherapi_errors_as_location_lookup_failures":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherFallbackBehaviorTest::__pest_evaluable_it_returns_an_empty_forecast_fallback_when_coordinates_are_unavailable":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherFallbackBehaviorTest::__pest_evaluable_it_builds_timeline_entries_with_mostly__clear_weather_when_forecast_payload_is_empty":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherFallbackBehaviorTest::__pest_evaluable_it_wires_departments_weather_route_through_the_forecast_fallback_path":0.007,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheHelpersTest::__pest_evaluable_it_uses_sane_ttl_defaults_and_clamps_negative_ttl_to_zero":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheHelpersTest::__pest_evaluable_it_builds_deterministic_cache_keys_for_department_sets_and_timeline_ranges":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheHelpersTest::__pest_evaluable_it_builds_order_insensitive_cache_keys_for_equivalent_department_id_sets":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheHelpersTest::__pest_evaluable_it_falls_back_to_resolver_directly_when_cache_ttl_is_disabled":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTimelineRangeTest::__pest_evaluable_it_marks_non_started_slots_as_unknown_regardless_of_wash_hour_ratio":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherPreloadCronWiringTest::__pest_evaluable_it_registers_and_implements_cron_preloading_for_department_weather_cache":0.012,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheHelpersTest::__pest_evaluable_it_uses_sane_stale_ttl_defaults_and_clamps_stale_ttl_below_fresh_ttl":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheHelpersTest::__pest_evaluable_it_uses_sane_hot_activity_ttl_defaults_and_clamps_to_a_positive_value":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheRuntimeBehaviorTest::__pest_evaluable_it_serves_fresh_cached_payloads_without_invoking_the_resolver":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheRuntimeBehaviorTest::__pest_evaluable_it_serves_stale_cached_payloads_and_enqueues_a_refresh_signal":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheRuntimeBehaviorTest::__pest_evaluable_it_recomputes_and_rewrites_cache_payloads_when_stale_window_is_exceeded":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheRuntimeBehaviorTest::__pest_evaluable_it_records_hot_keys_order_insensitively_and_applies_preload_target_caps":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_normalizes_batched_wash_count_rows_into_hourly_slot_totals":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_wires_department_weather_route_to_use_batched_wash_aggregation":0.015,"P\\Tests\\Unit\\Orders\\AttachmentsListManyTest::__pest_evaluable_it_groups_attachments_by_object_id_and_preserves_empty_object_groups":0,"P\\Tests\\Unit\\Orders\\AttachmentsListManyTest::__pest_evaluable_it_keeps_listMany_payload_parity_with_list_for_one_object_id":0,"P\\Tests\\Unit\\Orders\\EconomicModuleOrdersBatchHelpersTest::__pest_evaluable_it_ensures_economic_module_rows_in_one_sanitized_batch":0,"P\\Tests\\Unit\\Orders\\EconomicModuleOrdersBatchHelpersTest::__pest_evaluable_it_returns_id_keyed_economic_module_payload_with_null_defaults":0,"P\\Tests\\Unit\\Orders\\OrdersRouteListBatchingWiringTest::__pest_evaluable_it_wires_GET__orders_through_batched_enrichment_and_stripe_snapshot_caching":0.116,"P\\Tests\\Unit\\Orders\\UsersCashierNamesBatchTest::__pest_evaluable_it_returns_cashier_names_from_cache_and_fetches_missing_ones_in_batch":0,"P\\Tests\\Unit\\Orders\\UsersCashierNamesBatchTest::__pest_evaluable_it_returns_deterministic_map_for_duplicate_and_unsorted_cashier_ids":0,"P\\Tests\\Unit\\Orders\\UsersCashierNamesBatchWiringTest::__pest_evaluable_it_implements_batched_cashier_name_lookup_with_cache_first_fallback_behavior":0.141,"P\\Tests\\Unit\\Orders\\UsersCashierNamesBatchWiringTest::__pest_evaluable_it_sanitizes_and_deduplicates_cashier_ids_before_batch_lookup":0.064,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_counts_overtime_minutes_when_a_shift_carries_an_extended_approval_end_timestamp":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_counts_unapproved_overtime_from_a_bounded_shift_updateTime_fallback":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_does_not_treat_late_unapproved_administrative_edits_as_overtime":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheHelpersTest::__pest_evaluable_it_changes_weather_timeline_cache_key_when_department_weather_targets_change":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherStatusTargetsTest::__pest_evaluable_it_evaluates_healthy_degraded_and_unhealthy_statuses_from_configured_department_targets":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherStatusTargetsTest::__pest_evaluable_it_returns_unknown_when_configured_targets_are_missing_for_department_status_evaluation":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherStatusTargetsTest::__pest_evaluable_it_aggregates_multi_department_slot_statuses_using_worst_severity_and_unknown_fallback_rules":0.046,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTargetsOpenApiSpecTest::__pest_evaluable_it_documents_department_weather_target_endpoints_and_reusable_schemas_in_openapi":0.008,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTargetsOpenApiSpecTest::__pest_evaluable_it_documents_unknown_weather_status_behavior_when_targets_are_missing":0.01,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTargetsRouteWiringTest::__pest_evaluable_it_registers_department_weather_target_routes_with_explicit_read_and_manage_permissions":0.006,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTargetsRouteWiringTest::__pest_evaluable_it_persists_department_weather_targets_using_canonical_department_variable_keys":0.005,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_machine_relay_status_get_and_set_endpoints":0.006,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_batches_sequential_machine_relay_status_requests_into_a_single_Shelly_get_call":0.001,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_respects_the_1_request_per_second_Shelly_gate_for_back_to_back_requests":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_retries_missing_Shelly_status_payloads_until_relay_status_becomes_ready":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_times_out_with_a_clear_Shelly_readiness_error_when_payload_remains_missing":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_uses_direct_set_switch_and_seeds_cache_so_immediate_status_read_does_not_call_Shelly_get":0,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_self_serve_lane_gate_open_endpoint":0.004,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_in_progress_self_serve_wash_details_endpoint":0.003,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_adds_vehicle_type_product_on_STOP_when_program_selector_is_on__then_turns_off_cleaner_machine_and_selector_relays":0.132,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_skips_vehicle_type_product_add_when_program_selector_is_off_and_only_disables_configured_relays":0.001,"P\\Tests\\Unit\\Selfserve\\DepartmentSelfServeEnabledRelaySyncWiringTest::__pest_evaluable_it_syncs_lane_relay_states_when_department_self_serve_enabled_flag_changes":0.034,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_supports_hard_relay_set_even_when_lane_status_is_CLOSED":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStartCleanerRelayWiringTest::__pest_evaluable_it_enables_cleaner_relay_on_wash_start_command_and_webhook_flow":0.016,"P\\Tests\\Unit\\Selfserve\\SelfserveWashCompletionRelayWiringTest::__pest_evaluable_it_forces_machine_relay_off_when_a_self_serve_wash_session_is_completed":0.003,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePortControllerTest::__pest_evaluable_it_opens_exit_port_by_switching_relay__in__id_on":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePortControllerTest::__pest_evaluable_it_opens_entrance_port_by_switching_relay__out__id_on":0,"P\\Tests\\Unit\\Selfserve\\SelfserveOpenApiSpecTest::__pest_evaluable_it_documents_in_progress_self_serve_wash_start_and_machine_relay_fields":0.006,"P\\Tests\\Unit\\Selfserve\\SelfserveConditionEvaluatorTest::__pest_evaluable_it_evaluates_typed_task_gates_with_strict_semantics":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_validates_typed_task_gates_for_known_references":0.001,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_fails_validation_when_typed_task_gates_reference_unknown_entities":0,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_self_serve_config_draft_publish_rollback_lifecycle_endpoints":0.004,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_keeps_legacy_self_serve_CRUD_routes_syncing_canonical_drafts":0.012,"P\\Tests\\Unit\\Selfserve\\SelfserveStartCleanerRelayWiringTest::__pest_evaluable_it_keeps_cleaner_relay_enable_wired_into_machine_relay_start_paths":0.01,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_stores_config_json_with_apostrophes_without_violating_json_constraints":0.277,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_encodes_config_json_payloads_with_apostrophes_before_persistence":0,"P\\Tests\\Unit\\Selfserve\\SelfserveWashCompletionRelayWiringTest::__pest_evaluable_it_forces_machine_and_cleaner_relays_off_when_a_self_serve_wash_session_is_completed":0.007,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_vehicle_type_override_into_self_serve_preview_and_synchronization_routes":0.007,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_uses_local_demo_responses_and_skips_Shelly_cloud_calls_for_demo_relay_ids":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_returns_default_OFF_status_for_demo_relay_ids_without_Shelly_lookups":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_excludes_demo_relay_ids_from_Shelly_status_batch_payloads":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePortControllerTest::__pest_evaluable_it_keeps_demo_relay_gate_open_queued_but_skips_Shelly_switch_calls":0,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_allowed_services_route_through_machine_relay_visibility_sync":0.004,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_enables_MACHINE_relay_when_MACHINE_is_visible_in_allowed_services":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_turns_MACHINE_relay_off_immediately_when_MACHINE_is_not_visible":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_does_not_enable_MACHINE_relay_when_allowEnable_is_false_even_if_MACHINE_is_visible":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_is_a_safe_no_op_when_MACHINE_relay_is_not_configured":0,"P\\Tests\\Unit\\Selfserve\\SelfserveRelayVisibilitySyncWiringTest::__pest_evaluable_it_synchronizes_machine_relay_from_visible_services_during_session_synchronization":0.011,"P\\Tests\\Unit\\Selfserve\\SelfserveRelayVisibilitySyncWiringTest::__pest_evaluable_it_adds_explicit_relay_disable_session_helper_for_visibility_driven_OFF_transitions":0.006,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_self_serve_property_gate_command_permissions":0.007,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneCommandEnumTest::__pest_evaluable_it_parses_property_gate_lane_commands":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePropertyGateCommandTest::__pest_evaluable_it_opens_entrance_gate_for_OPEN__PROPERTY__ACCESS__GATE_command":0.196,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePropertyGateCommandTest::__pest_evaluable_it_opens_exit_gate_for_OPEN__PROPERTY__EXIT__GATE_command":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePropertyGateCommandTest::__pest_evaluable_it_blocks_property_gate_commands_when_department_self_serve_is_disabled":0.033,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePropertyGateCommandTest::__pest_evaluable_it_throws_a_clear_error_when_entrance_gate_is_missing_for_property_access_command":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePropertyGateCommandTest::__pest_evaluable_it_wraps_low_level_gate_errors_for_property_access_command_failures":0.003,"P\\Tests\\Unit\\Selfserve\\SelfserveWashFlowMachineAllowedWiringTest::__pest_evaluable_it_reads_machine_allowed_state_from_session_summary_payload_safely":0.007,"P\\Tests\\Unit\\Selfserve\\DbObjectPaginationLegacyColumnCompatibilityTest::__pest_evaluable_it_guards_pagination_against_searchable_fields_missing_from_legacy_schemas":0.05,"P\\Tests\\Unit\\Selfserve\\SelfserveSchemaBootstrapCompatibilityTest::__pest_evaluable_it_adds_dynamic__images__vehicle__type_column_for_legacy_selfserve_wash_session_task_schemas":0.003,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneInvoiceIncludedMinutesTest::__pest_evaluable_it_computes_billable_minutes_when_elapsed_minutes_exceed_included_minutes":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneInvoiceIncludedMinutesTest::__pest_evaluable_it_computes_zero_billable_minutes_when_elapsed_minutes_equal_included_minutes":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneInvoiceIncludedMinutesTest::__pest_evaluable_it_computes_zero_billable_minutes_when_included_minutes_exceed_elapsed_minutes":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneInvoiceIncludedMinutesTest::__pest_evaluable_it_handles_zero_and_low_elapsed_wash_time_edge_cases":0,"P\\Tests\\Unit\\Selfserve\\SelfserveOpenApiSpecTest::__pest_evaluable_it_documents_self_serve_machine_wash_included_minutes_in_config_schemas":0.006,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_machine_wash_included_minutes_into_self_serve_module_config":0.004,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_blocks_explicit_relay_writes_when_department_self_serve_is_disabled":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_returns_disabled_no_op_from_machine_relay_visibility_sync_when_department_self_serve_is_disabled":0,"P\\Tests\\Unit\\Selfserve\\SelfserveOpenApiSpecTest::__pest_evaluable_it_documents_property_gate_lane_commands_and_sanitized_gate_failure_responses":0.005,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_fails_fast_when_workspace_id_is_missing_for_gate_calls":0.022,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_fails_fast_when_channel_id_is_missing_for_gate_calls":0,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_fails_with_terminal_status_details_when_call_never_reaches_accepted_state":0.067,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_hangs_up_when_call_reaches_accepted_state":0.001,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_hangs_up_immediately_when_status_transitions_to_accepted":0,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_maps_legacy_timeout_option_to_documented_ringTimeout_payload_field":0,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_clamps_derived_ringTimeout_to_Bird_documented_max_when_gate_timeout_is_high":0,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_passes_documented_hangup_cause_when_provided":0,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_drops_unsupported_hangup_cause_values_from_request_payload":0,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_fails_fast_when_workspace_id_is_missing_for_gate_flash_calls":0,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_creates_gate_flash_call_with_documented_ringTimeout_payload":0,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_polls_flash_call_and_succeeds_once_accepted":0,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_fails_flash_gate_flow_when_terminal_failure_status_is_returned":0,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_does_not_fallback_to_regular_gate_call_when_flash_succeeds":0,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_falls_back_to_regular_gate_call_when_flash_fails":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePropertyGateCommandTest::__pest_evaluable_it_wraps_low_level_gate_errors_for_property_exit_command_failures":0.002,"P\\Tests\\Unit\\Bird\\BirdGateCallFlowTest::__pest_evaluable_it_falls_back_to_regular_gate_call_when_flash_caller_id_is_not_confirmed":0,"P\\Tests\\Unit\\Bird\\BirdModuleClientMappingTest::__pest_evaluable_it_maps_voice_call_facade_methods_to_documented_endpoints_and_methods":0.024,"P\\Tests\\Unit\\Bird\\BirdModuleClientMappingTest::__pest_evaluable_it_maps_recordings_insights_log_and_flash_methods_to_documented_resources":0.001,"P\\Tests\\Unit\\Bird\\BirdModuleClientMappingTest::__pest_evaluable_it_encodes_path_segments_before_building_outbound_endpoints":0,"P\\Tests\\Unit\\Bird\\BirdModuleClientMappingTest::__pest_evaluable_it_serializes_query_parameters_for_GET_transport_requests":0,"P\\Tests\\Unit\\Bird\\BirdModuleClientMappingTest::__pest_evaluable_it_maps_4xx_and_5xx_transport_failures_into_informative_exceptions":0,"P\\Tests\\Unit\\Bird\\BirdModuleClientMappingTest::__pest_evaluable_it_returns_raw_payload_for_malformed_JSON_responses_and_null_for_empty_responses":0.007,"P\\Tests\\Unit\\Bird\\BirdOpenApiSpecTest::__pest_evaluable_it_documents_all_Bird_voice_call_parity_endpoints_including_gather_recordings_insights_and_log":0.008,"P\\Tests\\Unit\\Bird\\BirdOpenApiSpecTest::__pest_evaluable_it_documents_flash_hangup_endpoint_and_marks_end_alias_as_deprecated":0.006,"P\\Tests\\Unit\\Bird\\BirdOpenApiSpecTest::__pest_evaluable_it_defines_request_and_response_schemas_for_Bird_call_command_recording_insight_log_and_flash_payloads":0.009,"P\\Tests\\Unit\\Bird\\BirdRequestValidationTest::__pest_evaluable_it_accepts_valid_payloads_for_create_and_nested_call_flow_commands":0.002,"P\\Tests\\Unit\\Bird\\BirdRequestValidationTest::__pest_evaluable_it_rejects_unknown_fields_and_invalid_enum_values_in_strict_schemas":0.051,"P\\Tests\\Unit\\Bird\\BirdRequestValidationTest::__pest_evaluable_it_supports_CSV_normalization_in_schema_validation_for_log_filters":0,"P\\Tests\\Unit\\Bird\\BirdRequestValidationTest::__pest_evaluable_it_validates_flash_hangup_payloads_for_both_supported_request_shapes":0,"P\\Tests\\Unit\\Bird\\BirdRequestValidationTest::__pest_evaluable_it_fails_before_forward_step_when_strict_validation_fails_and_forwards_when_valid":0,"P\\Tests\\Unit\\Bird\\BirdRouteWiringTest::__pest_evaluable_it_registers_full_Bird_voice_call_route_surface_with_strict_validation_and_permissions":0.04,"P\\Tests\\Unit\\Bird\\BirdRouteWiringTest::__pest_evaluable_it_registers_flash_hangup_endpoint_and_keeps_end_alias_wired_as_compatibility_path":0.033,"P\\Tests\\Unit\\Bird\\BirdRouteWiringTest::__pest_evaluable_it_keeps_Bird_number_and_webhook_routes_intact":0.063,"P\\Tests\\Unit\\Bird\\BirdModuleClientMappingTest::__pest_evaluable_it_handles_malformed_and_empty_response_bodies_without_throwing_transport_errors":0.005,"P\\Tests\\Unit\\Selfserve\\DepartmentGatesRelaysRouteWiringTest::__pest_evaluable_it_validates_department_gate_config_on_both_create_and_update_routes":0.059,"P\\Tests\\Unit\\Selfserve\\SelfserveSchemaBootstrapCompatibilityTest::__pest_evaluable_it_adds_wash__started__at_column_for_legacy_selfserve_wash_session_schemas":0.002,"P\\Tests\\Unit\\Selfserve\\SelfserveWashStartedAtWiringTest::__pest_evaluable_it_stores_wash__started__at_in_self_serve_wash_sessions_when_machine_start_is_triggered":0.004,"P\\Tests\\Unit\\Selfserve\\SelfserveWashStartedAtWiringTest::__pest_evaluable_it_passes_lane_wash_start_time_into_the_session_machine_start_marker":0.01,"P\\Tests\\Unit\\Selfserve\\SelfserveWashStartedAtWiringTest::__pest_evaluable_it_resolves_in_progress_wash__started__at_from_session_with_compatibility_fallbacks":0.004,"P\\Tests\\Unit\\Bird\\BirdPayloadClassesTest::__pest_evaluable_it_normalizes_say_payload_and_applies_hangup_default":0.596,"P\\Tests\\Unit\\Bird\\BirdPayloadClassesTest::__pest_evaluable_it_normalizes_log_query_csv_and_integer_fields":0,"P\\Tests\\Unit\\Bird\\BirdPayloadClassesTest::__pest_evaluable_it_normalizes_nested_create_call_payload_sections_and_drops_unknown_keys":0,"P\\Tests\\Unit\\Bird\\BirdPayloadClassesTest::__pest_evaluable_it_keeps_gather_nested_say_payload_unchanged_when_hangup_is_omitted":0,"P\\Tests\\Unit\\Bird\\BirdPayloadClassesTest::__pest_evaluable_it_supports_no_body_and_flash_hangup_payload_normalization":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_respects_the_2_second_Shelly_gate_for_back_to_back_requests":0.023,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_enforces_a_2_second_gap_between_sequential_switch_requests_used_by_wash_start_and_stop_flows":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_keeps_back_to_back_get_switch_requests_ordered_through_the_relay_controller":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_executes_sequential_switch_requests_used_by_wash_start_and_stop_flows":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePortControllerTest::__pest_evaluable_it_does_not_print_Shelly_switch_responses_to_output":0,"P\\Tests\\Unit\\Selfserve\\ShellyGlobalRateLimitWiringTest::__pest_evaluable_it_enforces_a_global_2_second_Shelly_gate_in_sendPostRequest":0.006,"P\\Tests\\Unit\\Selfserve\\ShellyGlobalRateLimitWiringTest::__pest_evaluable_it_uses_Redis_NX_PX_semantics_for_cross_request_Shelly_rate_limiting":0.006,"P\\Tests\\Unit\\Selfserve\\ShellyGlobalRateLimitBehaviorTest::__pest_evaluable_it_enforces_the_2_second_Shelly_gate_across_separate_request_contexts":0,"P\\Tests\\Unit\\Selfserve\\ShellyGlobalRateLimitBehaviorTest::__pest_evaluable_it_does_not_delay_when_the_Shelly_gate_is_already_expired":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_adds_vehicle_type_product_on_STOP_when_program_selector_relay_is_online__then_turns_off_cleaner_and_machine_relays":0.62,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_skips_vehicle_type_product_add_when_program_selector_relay_is_offline_and_only_disables_configured_relays":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_bills_primary_product_when_selector_relay_is_online_even_if_relay_output_is_off":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneInvoiceModeBillingTest::__pest_evaluable_it_bills_manual_self_serve_stop_using_full_elapsed_minutes_without_included_minute_reduction":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneInvoiceModeBillingTest::__pest_evaluable_it_keeps_included_minute_reduction_for_automatic_mode":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_sends_Slack_on_first_dtmf_input_captured_within_the_300_second_window":0.005,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_does_not_send_Slack_when_dtmf_input_repeats_without_change":0.008,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_sends_Slack_again_when_dtmf_input_changes_within_the_window":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_keeps_gathering_and_does_not_hang_up_before_300_seconds_have_elapsed":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_announces_timeout_waits_10_seconds_and_sends_hangup_once_at_or_after_300_seconds":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_keeps_polling_until_terminal_status_and_only_then_finalizes":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_finalizes_immediately_when_webhook_payload_is_already_terminal_before_timeout_logic":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_does_not_duplicate_timeout_or_hangup_actions_across_retries_and_lock_contention":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_keeps_state_when_polling_fails_so_completion_is_not_falsely_reported":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_sends_Slack_when_dtmf_input_repeats_without_change":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_answers_immediately_once_and_does_not_re_answer_on_subsequent_webhook_retries":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_configures_gather_with_retry_loop_semantics_until_input_is_entered":0.004,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_sends_Slack_when_gather_result_provides_keys_field_instead_of_dtmf":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_sends_Slack_when_gather_conditions_variable_keys_carries_the_entered_value":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_configures_gather_to_check_every_2_seconds_with_retry_loop_semantics_until_input_is_entered":0,"P\\Tests\\Unit\\Users\\UsersAutomaticGetTargetUserFromRequestTest::__pest_evaluable_it_ignores_non_numeric_customer__number_values_from_request":0.042,"P\\Tests\\Unit\\Users\\UsersAutomaticGetTargetUserFromRequestTest::__pest_evaluable_it_casts_numeric_customer__number_strings_to_int_before_lookup":0,"P\\Tests\\Unit\\Users\\UsersAutomaticGetTargetUserFromRequestTest::__pest_evaluable_it_prefers_user__id_when_both_user__id_and_customer__number_are_valid":0,"P\\Tests\\Unit\\Users\\UsersAutomaticGetTargetUserFromRequestTest::__pest_evaluable_it_falls_back_to_customer__number_when_user__id_is_invalid":0,"P\\Tests\\Unit\\Users\\UsersAutomaticGetTargetUserFromRequestTest::__pest_evaluable_it_normalizes_request_identifiers_before_user_lookups":0.005,"P\\Tests\\Unit\\Users\\UsersAutomaticGetTargetUserFromRequestTest::__pest_evaluable_it_rejects_non_positive_and_non_digit_request_values":0.003,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRoutePaginationFallbackTest::__pest_evaluable_it_uses_pagination_results_when_present":0.006,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRoutePaginationFallbackTest::__pest_evaluable_it_falls_back_to_collection_count_when_pagination_metadata_is_missing":0,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRoutePaginationFallbackTest::__pest_evaluable_it_returns_zero_when_neither_pagination_nor_collection_is_available":0,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRoutePaginationFallbackTest::__pest_evaluable_it_counts_object_based_collections_when_pagination_metadata_is_missing":0,"P\\Tests\\Unit\\Invoicing\\EconomicPaymentTermsRouteCollectionExtractionTest::__pest_evaluable_it_uses_collection_when_present":0,"P\\Tests\\Unit\\Invoicing\\EconomicPaymentTermsRouteCollectionExtractionTest::__pest_evaluable_it_falls_back_to_paymentTerms_when_collection_is_missing":0,"P\\Tests\\Unit\\Invoicing\\EconomicPaymentTermsRouteCollectionExtractionTest::__pest_evaluable_it_supports_top_level_array_payloads":0,"P\\Tests\\Unit\\Invoicing\\EconomicPaymentTermsRouteCollectionExtractionTest::__pest_evaluable_it_returns_an_empty_array_when_no_known_collection_shape_exists":0,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_uses_grant__2_in_economic__endpoint__t_when_explicitly_requested_and_configured":0,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_falls_back_to_grant__1_in_economic__endpoint__t_when_grant__2_is_missing":0.003,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_throws_for_missing_required_primary_grant_in_economic__endpoint__t":0.002,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_throws_for_missing_app_secret_in_economic__endpoint__t":0,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_uses_grant__2_in_legacy_economic__m_when_available":0,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_falls_back_to_grant__1_in_legacy_economic__m_when_grant__2_is_missing":0.002,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_throws_for_missing_required_primary_grant_in_legacy_economic__m":0.002,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_throws_for_missing_app_secret_in_legacy_economic__m":0,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRoutePaginationFallbackTest::__pest_evaluable_it_uses_unfiltered_total_when_no_customer_filters_are_active":0.004,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRoutePaginationFallbackTest::__pest_evaluable_it_uses_filtered_total_when_search_is_active":0,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRoutePaginationFallbackTest::__pest_evaluable_it_uses_filtered_total_when_barred_filter_is_active":0,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRoutePaginationFallbackTest::__pest_evaluable_it_treats__null__search_and_barred_values_as_no_filter":0,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRoutePaginationFallbackTest::__pest_evaluable_it_falls_back_to_filtered_total_when_unfiltered_total_is_missing":0,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRouteEconomicFailureHandlingTest::__pest_evaluable_it_maps_e_conomic_integration_failures_in_customer_listing_to_explicit_502_responses":0.007,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRouteEconomicFailureHandlingTest::__pest_evaluable_it_logs_LIST__CUSTOMERS_success_only_after_pagination_and_customer_mapping_are_completed":0.005,"P\\Tests\\Unit\\Invoicing\\CustomerSearchRouteEconomicFailureHandlingTest::__pest_evaluable_it_guards_against_malformed_customer_list_payloads_before_calling_paginate":0.006,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_throws_deterministic_upstream_exceptions_for_non_2xx_endpoint_trait_responses":0,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_throws_deterministic_upstream_exceptions_for_non_2xx_legacy_economic__m_responses":0,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_returns_raw_payload_unchanged_on_successful_HTTP_statuses":0,"P\\Tests\\Unit\\Invoicing\\EconomicCustomersListResponseValidationTest::__pest_evaluable_it_accepts_valid_list_payloads_that_include_collection_and_pagination_results":0,"P\\Tests\\Unit\\Invoicing\\EconomicCustomersListResponseValidationTest::__pest_evaluable_it_throws_when_pagination_is_missing_from_the_response_payload":0,"P\\Tests\\Unit\\Invoicing\\EconomicCustomersListResponseValidationTest::__pest_evaluable_it_throws_when_upstream_responds_with_an_error_shaped_payload":0,"P\\Tests\\Unit\\Router\\RouterThrowableHandlingTest::__pest_evaluable_it_catches_throwables_during_auto_route_loading_and_maps_them_to_internal_server_errors":0.039,"P\\Tests\\Unit\\Users\\EconomicCustomerZeroHandlingTest::__pest_evaluable_it_does_not_request_e_conomic_customer_data_when_customer_number_is_zero":0.004,"P\\Tests\\Unit\\Users\\EconomicCustomerZeroHandlingTest::__pest_evaluable_it_short_circuits_e_conomic_customer_lookup_for_non_positive_customer_numbers":0.003,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueRouteRegistrationTest::__pest_evaluable_it_registers_queued_economic_invoice_endpoints_in_economicInvoiceRoute":0.013,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueRouteRegistrationTest::__pest_evaluable_it_registers_collected_invoice_queue_endpoints_in_orderInvoicesRoute":0.011,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueSchemaBootstrapTest::__pest_evaluable_it_defines_economic_transfer_queue_jobs_schema_bootstrap_table_and_tracking_columns":0.011,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueSchemaBootstrapTest::__pest_evaluable_it_provides_queue_processor_class_constants_and_processing_entrypoint":0.004,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueCronIntegrationTest::__pest_evaluable_it_registers_economic_transfer_queue_cron_task_and_handler":0.007,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueOpenApiSpecTest::__pest_evaluable_it_documents_economic_transfer_queue_paths_in_openapi":0.013,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueOpenApiSpecTest::__pest_evaluable_it_documents_economic_transfer_queue_schemas_in_openapi":0.01,"P\\Tests\\Unit\\Invoicing\\EconomicTransferOrderItemSkipTest::__pest_evaluable_it_skips_order_items_with_zero_quantity_for_e_conomic_export":0,"P\\Tests\\Unit\\Invoicing\\EconomicTransferOrderItemSkipTest::__pest_evaluable_it_skips_order_items_with_zero_price_for_e_conomic_export":0.006,"P\\Tests\\Unit\\Invoicing\\EconomicTransferOrderItemSkipTest::__pest_evaluable_it_keeps_positive_quantity_and_price_items_billable_for_e_conomic_export":0,"P\\Tests\\Unit\\Invoicing\\EconomicTransferOrderItemSkipTest::__pest_evaluable_it_wires_zero_cost_and_zero_quantity_skip_guard_into_transfer_line_builder":0.048,"P\\Tests\\Unit\\Invoicing\\EconomicInvoiceDraftZeroItemSkipWiringTest::__pest_evaluable_it_skips_zero_cost_and_zero_quantity_items_in_legacy_economic_draft_helper":0.023,"P\\Tests\\Unit\\Invoicing\\EconomicTransferOrderItemSkipTest::__pest_evaluable_it_skips_malformed_order_item_payloads_for_e_conomic_export_safety":0,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueHardeningTest::__pest_evaluable_it_hardens_transfer_queue_with_type_validation_retry_caps_and_stale_lock_recovery":0.043,"P\\Tests\\Unit\\Router\\AutoloadRedisCacheValidationTest::__pest_evaluable_it_validates_cached_autoload_paths_before_returning_and_clears_stale_cache_entries":0.008,"P\\Tests\\Unit\\Orders\\OrdersRegistrationDateRangeQueryTest::__pest_evaluable_it_applies_created__at_bounds_directly_in_SQL_when_filtering_orders_by_registration_number":0.001,"P\\Tests\\Unit\\Orders\\OrdersRegistrationDateRangeQueryTest::__pest_evaluable_it_rejects_an_inverted_date_range_for_registration_lookups":0,"P\\Tests\\Unit\\Orders\\OrdersRegistrationDateRangeQueryTest::__pest_evaluable_it_returns_early_when_registration_number_is_blank":0.004,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueCronIntegrationTest::__pest_evaluable_it_wires_queue_worker_class_loading_for_CLI_queue_action":0.006,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_guards_all_economic_invoice_queue_endpoints_before_constructing_queue_service":0.012,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_guards_all_collected_invoice_queue_endpoints_before_constructing_queue_service":0.011,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_uses_a_consistent_unavailable_service_contract_for_missing_queue_dependencies":0.009,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_gracefully_handles_unavailable_queue_dependencies_on_collected_invoice_queue_endpoints":0.005,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceEconomicQueueResponseContractTest::__pest_evaluable_it_returns_the_queue_job_id_in_POST__collected_invoices_economic_enqueue_response":0.204,"P\\Tests\\Unit\\Invoicing\\UserCollectedInvoiceUpdateRouteValidationTest::__pest_evaluable_it_requires_id_and_at_least_one_mutable_field_for_PUT__collected_invoices_in_user_route":0.019,"P\\Tests\\Unit\\Invoicing\\UserCollectedInvoiceUpdateRouteValidationTest::__pest_evaluable_it_supports_independent_po__number_and_closed__at_updates_for_PUT__collected_invoices_in_user_route":0.008,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceEconomicQueueResponseContractTest::__pest_evaluable_it_returns_queued_contract_for_POST__collected_invoices_stripe_book":0.002,"P\\Tests\\Unit\\Invoicing\\EconomicDraftQueueOnlyRouteBehaviorTest::__pest_evaluable_it_keeps_order_draft_export_route_queue_only":0.006,"P\\Tests\\Unit\\Invoicing\\EconomicDraftQueueOnlyRouteBehaviorTest::__pest_evaluable_it_keeps_collected_invoice_draft_producing_routes_queue_only_in_orderInvoicesRoute":0.004,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_guards_collected_invoice_and_stripe_draft_producing_endpoints_before_constructing_queue_service":0.004,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueOpenApiSpecTest::__pest_evaluable_it_documents_unavailable_queue_dependency_responses_for_async_economic_transfer_endpoints":0.007,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueuePayloadValidationTest::__pest_evaluable_it_normalizes_order_payloads_to_strict_positive_integer_ids":0,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueuePayloadValidationTest::__pest_evaluable_it_normalizes_collected_invoice_payload_booleans_to_strict_bool_values":0,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueuePayloadValidationTest::__pest_evaluable_it_rejects_invalid_transfer_payloads_before_enqueue_write_attempts":0,"P\\Tests\\Integration\\Invoicing\\EconomicTransferQueueIntegrationTest::__pest_evaluable_it_processes_queued_transfer_jobs_to_completion":0.016,"P\\Tests\\Integration\\Invoicing\\EconomicTransferQueueIntegrationTest::__pest_evaluable_it_deduplicates_active_jobs_per_transfer_target":0.016,"P\\Tests\\Integration\\Invoicing\\EconomicTransferQueueIntegrationTest::__pest_evaluable_it_rejects_invalid_payloads_without_inserting_queue_rows":0.013,"P\\Tests\\Integration\\Invoicing\\EconomicTransferQueueIntegrationTest::__pest_evaluable_it_supports_fail_retry_and_reprocess_lifecycle_transitions":0.014,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_keeps_queue_guards_on_economic_invoice_queue_status_and_retry_routes":0.01,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_supports_synchronous_fallback_branches_before_queue_enqueue_on_economic_invoice_export_routes":0.005,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_keeps_queue_status_endpoints_guarded_while_collected_invoice_export_routes_support_synchronous_fallback":0.01,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueAvailabilityGuardTest::__pest_evaluable_it_uses_a_consistent_unavailable_service_contract_for_queue_status_lifecycle_endpoints":0.057,"P\\Tests\\Unit\\Invoicing\\EconomicDraftQueueOnlyRouteBehaviorTest::__pest_evaluable_it_supports_synchronous_fallback_and_queued_processing_for_order_draft_export_route":0.006,"P\\Tests\\Unit\\Invoicing\\EconomicDraftQueueOnlyRouteBehaviorTest::__pest_evaluable_it_supports_synchronous_fallback_and_queued_processing_for_collected_invoice_draft_producing_routes":0.006,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceEconomicQueueResponseContractTest::__pest_evaluable_it_documents_both_synchronous_fallback_and_queued_response_contracts_for_POST__collected_invoices_economic":0.165,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceEconomicQueueResponseContractTest::__pest_evaluable_it_documents_both_synchronous_fallback_and_queued_response_contracts_for_POST__collected_invoices_stripe_book":0.018,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueOpenApiSpecTest::__pest_evaluable_it_documents_200_fallback_plus_202_queue_contracts_for_export_endpoints_and_keeps_503_on_queue_lifecycle_endpoints":0.009,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueRouteHardeningTest::__pest_evaluable_it_returns_pagination_metadata_and_strict_status_handling_for_collected_invoice_queue_list":0.006,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueRouteHardeningTest::__pest_evaluable_it_enforces_retry_constraints_for_collected_invoice_queue_jobs_before_retry_execution":0.008,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueOpenApiSpecTest::__pest_evaluable_it_documents_collected_queue_list_metadata_and_strict_status_filter_enum_in_openapi":0,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueDetailsSummaryBuilderTest::__pest_evaluable_it_builds_a_completed_collected_invoice_queue_summary_from_payload_and_result":0.029,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueDetailsSummaryBuilderTest::__pest_evaluable_it_prefers_queue_error_messages_for_failed_jobs_and_keeps_null_safe_outcome_fields":0,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueDetailsSummaryBuilderTest::__pest_evaluable_it_uses_deterministic_status_message_fallback_when_no_explicit_message_exists":0,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueDetailsSummaryBuilderTest::__pest_evaluable_it_handles_object_payload_result_values_and_malformed_fields_without_throwing":0,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueWorkerTickRouteTest::__pest_evaluable_it_ticks_collected_invoice_transfer_queue_from_queue_list_and_status_routes":0.008,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueWorkerTickRouteTest::__pest_evaluable_it_ticks_order_transfer_queue_from_draft_and_invoice_status_routes":0.009,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodQueueOverlayTest::__pest_evaluable_it_marks_queued_transactions_and_clears_requires__action_when_all_actionable_work_is_already_queued":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodQueueOverlayTest::__pest_evaluable_it_keeps_requires__action_true_when_a_customer_still_has_unqueued_actionable_transactions":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodQueueOverlayTest::__pest_evaluable_it_blocks_fixed_pricing_or_subscription_customers_with_no_transactions_when_a_relevant_queue_job_exists":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerCommandQueueTest::__pest_evaluable_it_queues_admin_commands__exposes_agent_poll_result_handlers__and_keeps_heartbeats_from_mutating_discovery_state":0.003,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerCommandQueueTest::__pest_evaluable_it_defines_the_dispatchable_gateway_guard_on_the_loaded_manager_class":0.009,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerHeartbeatStatusTest::__pest_evaluable_it_derives_effective_gateway_status_from_heartbeat_freshness with data set \"dataset \"recent heartbeat stays online\"\"":0.001,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerHeartbeatStatusTest::__pest_evaluable_it_derives_effective_gateway_status_from_heartbeat_freshness with data set \"dataset \"late heartbeat degrades after one minute\"\"":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerHeartbeatStatusTest::__pest_evaluable_it_derives_effective_gateway_status_from_heartbeat_freshness with data set \"dataset \"stale heartbeat goes offline after five minutes\"\"":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerHeartbeatStatusTest::__pest_evaluable_it_derives_effective_gateway_status_from_heartbeat_freshness with data set \"dataset \"explicit offline reports stay offline even when heartbeat is fresh\"\"":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerHeartbeatStatusTest::__pest_evaluable_it_derives_effective_gateway_status_from_heartbeat_freshness with data set \"dataset \"missing heartbeat is treated as offline\"\"":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerHeartbeatStatusTest::__pest_evaluable_it_marks_ready_discovery_as_stale_when_the_gateway_heartbeat_has_expired":0.727,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayRouteWiringTest::__pest_evaluable_it_registers_the_edge_gateway_management_REST_endpoints":0.021,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayRouteWiringTest::__pest_evaluable_it_registers_public_installer__claim__heartbeat__command_polling__and_internal_broker_auth_endpoints":0.004,"P\\Tests\\Unit\\Selfserve\\EdgeBrokerClientConfigTest::__pest_evaluable_it_uses_the_same_default_broker_url_and_shared_secret_fallback_as_the_docker_stack":0.267,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_builds_install_script_urls_with_forwarded_https_scheme_when_proxied":0.336,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_appends_forwarded_ports_when_the_forwarded_host_omits_them":0.28,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_infers_https_for_the_staging_api_host_when_only_the_https_port_is_present":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_prefers_EDGE__PUBLIC__API__URL_when_explicitly_configured":1.003,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_normalizes_public_broker_overrides_to_https_and_browser_shell_urls_to_wss":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_keeps_localhost_broker_overrides_on_plain_http_and_ws_for_local_development":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_includes_node_pty_build_prerequisites_in_the_generated_install_script":0.007,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_prefers_EDGE__PUBLIC__API__URL_when_explicitly_configured_and_derives_the_broker_from_the_api_origin":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_normalizes_public_broker_overrides_to_https__strips_paths__and_browser_shell_urls_to_wss":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerHeartbeatStatusTest::__pest_evaluable_it_merges_incoming_heartbeat_metadata_with_existing_gateway_metadata":0.006,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayRouteWiringTest::__pest_evaluable_it_registers_the_v2_operator_facing_edge_gateway_routes":0.008,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayRouteWiringTest::__pest_evaluable_it_registers_PHP_edge_agent_routes_for_operations_and_legacy_relay_command_polling":0.027,"P\\Tests\\Unit\\Selfserve\\EdgeGatewaySchemaBootstrapTest::__pest_evaluable_it_defines_the_v2_edge_gateway_schema_bootstrap_tables":0.006,"P\\Tests\\Unit\\Selfserve\\EdgeGatewaySchemaBootstrapTest::__pest_evaluable_it_stores_operation_metadata_and_event_timelines_for_management_workflows":0.005,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayUpdateLifecycleTest::__pest_evaluable_it_builds_the_installer_around_the_PHP_agent_artifacts_and_management_polling_config":0.011,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayUpdateLifecycleTest::__pest_evaluable_it_exposes_update_payload__credential_rotation__and_operation_endpoints_without_shell_transport_wiring":0.013,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerCommandQueueTest::__pest_evaluable_it_keeps_relay_dispatch_and_discovery_queueing_on_the_edge_gateway_manager":0.02,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerCommandQueueTest::__pest_evaluable_it_loads_relay_command_helpers_on_the_manager_and_gateway_operations_on_the_dedicated_service":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerHeartbeatStatusTest::__pest_evaluable_it_derives_relay_fallback_and_transport_health_details_without_shell_or_update_runtime_state":0.837,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_resolves_edge_agent_artifacts_from_the_source_tree_layout":0.445,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_includes_the_container_mounted_artifact_directory_as_a_candidate":0.021,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_reads_install_artifacts_through_the_shared_locator":0.019,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_builds_update_payloads_with_checksums_from_resolved_artifact_paths":2.276,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_resolves_edge_agent_artifacts_from_a_supported_runtime_layout":0.273,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_builds_install_script_urls_with_the_PHP_agent_artifacts_and_forwarded_https_scheme":0.001,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_explains_the_legacy_dist_mount_mismatch_when_php_artifacts_are_unavailable":0.005,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_prioritizes_mounted_and_baked_in_artifact_directories_before_repo_fallbacks":0.022,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_falls_back_to_baked_in_artifacts_when_the_mount_path_is_absent":0.013,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayArtifactLocatorTest::__pest_evaluable_it_prioritizes_router_resources_before_mounted_and_baked_in_artifact_directories":0,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_lists_orders_for_an_admin_scoped_user_and_limits_the_results_to_the_permitted_departments":1.109,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_lists_only_the_targeted_customer_orders_for_subuser_sessions":2.935,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_returns_the_current_auth_and_permission_failures_when_order_listing_is_not_allowed":1.375,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_creates_orders_through_the_real_endpoint":0.982,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_rejects_invalid_order_creation_requests":3.423,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_updates_orders_through_the_primary_endpoint":1.13,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_reassigns_invoice_collections_when_changing_an_order_across_the_draft_customer_boundary":1.615,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_supports_legacy_field_value_metadata_updates_through_the_primary_endpoint":5.592,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_rejects_invalid_updates_through_the_primary_order_endpoint":1.29,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_updates_orders_through_the_legacy_alias_endpoint":1.517,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_supports_legacy_field_value_metadata_updates_through_the_alias_endpoint":4.136,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_rejects_invalid_updates_through_the_legacy_alias_endpoint":0.512,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_rejects_unsupported_legacy_field_value_updates_on_both_update_endpoints":0.965,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_deletes_orders_through_the_real_endpoint":1.045,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_rejects_invalid_order_delete_requests":1.64,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_regenerates_attached_wash_certificates_when_certificate_metadata_changes_through_the_primary_endpoint":3.683,"P\\Tests\\Api\\OrdersApiTest::__pest_evaluable_it_regenerates_attached_wash_certificates_for_legacy_field_value_updates_through_the_alias_endpoint":3.194,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayOperationLegacySchemaCompatibilityTest::__pest_evaluable_it_keeps_the_legacy_operation__type_column_compatible_with_v2_operation_queueing":0.022,"P\\Tests\\Unit\\Bookings\\OrderBookingsListCacheTest::__pest_evaluable_it_uses_sane_ttl_defaults_and_clamps_negative_ttl_to_zero":0,"P\\Tests\\Unit\\Bookings\\OrderBookingsListCacheTest::__pest_evaluable_it_builds_deterministic_keys_for_equivalent_contexts":0,"P\\Tests\\Unit\\Bookings\\OrderBookingsListCacheTest::__pest_evaluable_it_stores_and_retrieves_full_order_bookings_payloads":0.001,"P\\Tests\\Unit\\Bookings\\OrderBookingsListCacheTest::__pest_evaluable_it_ignores_malformed_cached_payloads_and_clears_order_bookings_list_caches":0.001,"P\\Tests\\Unit\\Bookings\\OrderBookingsRouteCacheWiringTest::__pest_evaluable_it_caches_the_paginated_order_bookings_list_response_and_invalidates_it_on_booking_changes":0.051,"P\\Tests\\Unit\\Bookings\\VehicleSearchBookedMetadataRouteContractTest::__pest_evaluable_it_keeps_booked_vehicle_search_metadata_aligned_with_filtered_pending_order_bookings":0.052,"P\\Tests\\Unit\\Bookings\\OrderBookingsCountsCacheTest::__pest_evaluable_it_uses_sane_ttl_defaults_and_clamps_negative_ttl_to_zero":0.001,"P\\Tests\\Unit\\Bookings\\OrderBookingsCountsCacheTest::__pest_evaluable_it_builds_deterministic_keys_for_equivalent_count_contexts":0.039,"P\\Tests\\Unit\\Bookings\\OrderBookingsCountsCacheTest::__pest_evaluable_it_stores_and_retrieves_normalized_booking_counts":0,"P\\Tests\\Unit\\Bookings\\OrderBookingsCountsCacheTest::__pest_evaluable_it_ignores_malformed_payloads_and_clears_order_bookings_count_caches":0,"P\\Tests\\Unit\\Bookings\\OrderBookingsCountsRouteWiringTest::__pest_evaluable_it_adds_a_cached_order_bookings_counts_endpoint_and_invalidates_it_on_booking_changes":0.04,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayFleetUsageStatisticsTest::__pest_evaluable_it_summarizes_fleet_usage_statistics_for_the_dashboard_landing_view":0,"P\\Tests\\Api\\ApiCoverageManifestTest::__pest_evaluable_it_keeps_every_selected_API_operation_covered_by_happy_path_and_failure_tests":0.271,"P\\Tests\\Api\\ApiCoverageManifestTest::__pest_evaluable_it_keeps_the_OpenAPI_manifest_entries_aligned_with_the_API_spec":0.097,"P\\Tests\\Api\\ApiFixturesCleanupTest::__pest_evaluable_it_removes_generated_customer_traces_during_fixture_cleanup":8.099,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_logs_in_with_valid_customer_credentials":0,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_rejects_invalid_login_payloads_and_credentials":0,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_returns_the_cached_auth_session_payload_for_a_valid_token":0,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_includes_economic_runtime_config_for_uncached_auth_sessions":0,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_rejects_invalid_auth_session_tokens":0,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_logs_out_and_invalidates_the_token_for_future_session_calls":0,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_logs_out_and_invalidates_cached_subuser_sessions":0,"P\\Tests\\Api\\AuthApiTest::__pest_evaluable_it_rejects_invalid_logout_tokens":0,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_returns_the_raw_202_gather_webhook_contract_over_HTTP":0.788,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_still_prompts_for_department_selection_when_only_one_department_is_eligible":0.732,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_accepts_the_legacy_initial_webhook_body_with_top_level_call_identifiers":0.692,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_returns_native_flow_gather_data_after_a_top_level_department_selection_when_distinct_gate_choices_exist":1.515,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_opens_the_gate_immediately_after_a_top_level_department_selection_when_entrance_and_exit_share_the_same_gate":1.719,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_uses_a_multi_digit_gather_contract_when_10_departments_are_eligible":0.587,"P\\Tests\\Api\\BirdVoiceWebhookApiTest::__pest_evaluable_it_returns_a_raw_400_transport_error_for_malformed_webhook_payloads":0.419,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_lists_only_visible_departments_and_can_return_a_single_department_with_the_slack_webhook":1.048,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_rejects_department_listing_when_the_permission_is_missing":0.378,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_creates_departments_through_the_real_endpoint":0.59,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_rejects_invalid_department_create_requests":1.554,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_updates_departments_through_the_real_endpoint":0.788,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_rejects_invalid_department_update_requests":1.552,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_lists_department_categories_for_a_department":1.006,"P\\Tests\\Api\\DepartmentsApiTest::__pest_evaluable_it_rejects_invalid_department_category_requests":1.191,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_lists_the_draft_customer_config_entry_in_economic_config_responses":0,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_round_trips_the_draft_customer_config_value_through_economic_config_updates":0,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_rejects_order_draft_exports_for_the_configured_draft_customer":0,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_rejects_booked_invoice_exports_for_the_configured_draft_customer":0,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_rejects_collected_invoice_exports_for_the_configured_draft_customer":0,"P\\Tests\\Api\\PingApiTest::__pest_evaluable_it_returns_the_ping_contract":0.877,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_returns_a_setup_required_error_when_department_terminal_readers_are_requested_without_terminal_setup":1.281,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_sends_a_Stripe_invoice_by_email_and_persists_the_hosted_invoice_association":5.434,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_returns_a_conflict_when_a_Stripe_hosted_invoice_is_already_active_for_the_order":4.756,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_allows_sending_a_new_Stripe_hosted_invoice_when_the_existing_association_is_already_terminal":3.943,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_voids_an_unpaid_Stripe_hosted_invoice_and_clears_the_local_order_association":3.746,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_refuses_to_cancel_a_paid_Stripe_hosted_invoice":4.131,"P\\Tests\\Api\\StripeApiTest::__pest_evaluable_it_returns_a_setup_required_error_when_creating_a_payment_intent_for_a_department_without_terminal_setup":0.726,"P\\Tests\\Api\\VehiclesApiTest::__pest_evaluable_it_returns_the_newest_vehicle_last__order__id_that_still_has_order_items":1.326,"P\\Tests\\Api\\VehiclesApiTest::__pest_evaluable_it_returns_a_null_vehicle_last__order__id_when_no_order_with_items_exists":1.159,"P\\Tests\\Unit\\Users\\EconomicCustomerModelParsingTest::__pest_evaluable_it_parses_cached_economic_customer_payloads_that_use_snake__case_customer__number":0,"P\\Tests\\Unit\\Users\\EconomicCustomerModelParsingTest::__pest_evaluable_it_leaves_the_economic_customer_model_empty_when_no_valid_customer_number_is_present":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayFleetUsageStatisticsTest::__pest_evaluable_it_derives_fleet_usage_directly_from_cached_gateway_row_summaries":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_builds_install_script_urls_with_the_compose_edge_gateway_artifacts_and_forwarded_https_scheme":1.031,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayMetadataUpdateContractTest::__pest_evaluable_it_adds_a_gateway_metadata_update_endpoint_with_label_and_primary_assignment_fields":0.009,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayMetadataUpdateContractTest::__pest_evaluable_it_reassigns_department_primary_gateways_through_dedicated_manager_helpers":0.006,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayShellPollingTransportTest::__pest_evaluable_it_removes_shell_access_from_the_edge_gateway_HTTP_contracts":0.007,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayUpdateLifecycleTest::__pest_evaluable_it_builds_the_installer_around_the_compose_stack_artifacts_and_management_polling_config":0.06,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayViewCacheTest::__pest_evaluable_it_uses_sane_ttl_defaults_and_deterministic_cache_keys":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayViewCacheTest::__pest_evaluable_it_stores_and_retrieves_cached_list_and_detail_payloads":0.001,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayViewCacheTest::__pest_evaluable_it_syncs_gateway_snapshots_into_cached_list_payloads_and_refreshes_fleet_usage":0.001,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayViewCacheTest::__pest_evaluable_it_removes_deleted_gateways_from_cached_list_and_detail_payloads":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayUpdateLifecycleTest::__pest_evaluable_it_exposes_update_payload__credential_rotation__cancel_endpoints__and_operation_endpoints_without_shell_transport_wiring":0.02,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayModuleRouteWiringTest::__pest_evaluable_it_registers_module_scoped_edge_gateway_operator_routes":0.008,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayModuleRouteWiringTest::__pest_evaluable_it_registers_edge_gateway_module_config_endpoints":0.006,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayModuleRouteWiringTest::__pest_evaluable_it_registers_edge_gateway_config_endpoints_from_the_module_route_directory":0.015,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayModuleRouteWiringTest::__pest_evaluable_it_keeps_only_the_module_facade_in_the_global_classes_directory_and_conditionally_loads_module_routes":0.007,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayInstallSessionLifecycleTest::__pest_evaluable_it_caps_install_session_diagnostics_and_events_while_preserving_the_first_start_timestamp":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayInstallSessionLifecycleTest::__pest_evaluable_it_clears_terminal_failure_details_after_a_successful_claim_update":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayInstallSessionLifecycleTest::__pest_evaluable_it_marks_expired_non_terminal_install_sessions_as_terminal_when_read_back":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_builds_websocket_broker_urls_on_the_traefik_broker_path":0.965,"P\\Tests\\Unit\\Selfserve\\DepartmentGateConfigRelayTest::__pest_evaluable_it_validates_relay_gate_configs_and_keeps_relay_specific_fields_in_the_payload":0,"P\\Tests\\Unit\\Selfserve\\DepartmentGateConfigRelayTest::__pest_evaluable_it_rejects_relay_gate_configs_without_a_logical_relay_id":0,"P\\Tests\\Unit\\Bird\\DepartmentGatesRelayOpenTest::__pest_evaluable_it_dispatches_relay_backed_gates_through_the_edge_gateway_relay_manager":0,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayDepartmentWorkspaceContractTest::__pest_evaluable_it_defines_the_department_hardware_workspace_service_payload_surface":0.033,"P\\Tests\\Unit\\Selfserve\\PlateScannerWorkspaceContractTest::__pest_evaluable_it_adds_lane_aware_scanner_management_and_a_dedicated_rotate_key_action":0.01,"P\\Tests\\Unit\\Selfserve\\PlateScannerWorkspaceContractTest::__pest_evaluable_it_uses_the_scanner_default_lane_before_requiring_an_explicit_lane__id_in_machine_button_webhooks":0.004,"P\\Tests\\Unit\\Selfserve\\GatewayShellyTransportTest::__pest_evaluable_it_maps_gateway_relay_status_responses_into_the_Shelly_cloud_payload_shape":0,"P\\Tests\\Unit\\Selfserve\\GatewayShellyTransportTest::__pest_evaluable_it_maps_gateway_relay_switch_responses_into_the_Shelly_cloud_payload_shape":0,"P\\Tests\\Unit\\Selfserve\\GatewayShellyTransportTest::__pest_evaluable_it_requires_a_valid_department_id_for_gateway_transport_requests":0,"P\\Tests\\Unit\\Selfserve\\GatewayShellyTransportTest::__pest_evaluable_it_rejects_unsupported_gateway_transport_endpoints":0,"P\\Tests\\Unit\\Selfserve\\GatewayShellyTransportTest::__pest_evaluable_it_surfaces_binding_lookup_failures_while_resolving_relay_state_through_the_gateway_transport":0,"P\\Tests\\Unit\\Selfserve\\GatewayShellyTransportTest::__pest_evaluable_it_surfaces_offline_gateway_failures_while_dispatching_relay_switch_commands":0,"P\\Tests\\Api\\PlateScannersApiTest::__pest_evaluable_it_returns_the_updated_lane_id_after_editing_a_scanner_whose_null_lane_was_already_cached":21.835,"P\\Tests\\Api\\PlateScannersApiTest::__pest_evaluable_it_rejects_plate_scanner_edits_when_the_permission_is_missing":7.837,"P\\Tests\\Unit\\Selfserve\\ShellyRelayInventoryTest::__pest_evaluable_it_normalizes_owned_Shelly_devices_into_relay_select_options":0,"P\\Tests\\Unit\\Selfserve\\ShellyRelayInventoryTest::__pest_evaluable_it_fails_fast_when_Shelly_inventory_does_not_include_owned_devices_status":0,"P\\Tests\\Unit\\Selfserve\\DepartmentLaneRelayOptionsRouteWiringTest::__pest_evaluable_it_registers_a_department_lane_relay_options_endpoint_backed_by_Shelly_inventory":0.032,"P\\Tests\\Unit\\Selfserve\\DepartmentLaneRelayNullificationRouteWiringTest::__pest_evaluable_it_nullifies_department_lane_relay_fields_when_blank_select_values_are_submitted":0.008,"P\\Tests\\Api\\EdgeGatewayAgentApiTest::__pest_evaluable_it_serves_installer_artifacts_and_recovers_gateway_runtime_status_after_fresh_heartbeats":109.487,"P\\Tests\\Api\\EdgeGatewayAgentApiTest::__pest_evaluable_it_polls_operations_and_commands__submits_results__and_records_broker_presence_for_task_pages":229.768,"P\\Tests\\Api\\EdgeGatewayAgentApiTest::__pest_evaluable_it_rejects_missing_and_invalid_edge_agent_tokens":12.815,"P\\Tests\\Api\\EdgeGatewayBrokerApiTest::__pest_evaluable_it_validates_broker_sessions_and_ingests_presence__telemetry__logs__and_shell_lifecycle_data":180.867,"P\\Tests\\Api\\EdgeGatewayBrokerApiTest::__pest_evaluable_it_builds_broker_backlog_and_completes_gateway_operations_through_broker_endpoints":147.749,"P\\Tests\\Api\\EdgeGatewayBrokerApiTest::__pest_evaluable_it_rejects_invalid_edge_broker_shared_secrets":6.832,"P\\Tests\\Api\\EdgeGatewayOperatorApiTest::__pest_evaluable_it_creates_install_tokens__tracks_installer_status__and_exposes_claimed_gateway_detail_to_authorized_operators":134.744,"P\\Tests\\Api\\EdgeGatewayOperatorApiTest::__pest_evaluable_it_manages_edge_gateway_metadata__bindings__operations__sessions__rotation__cutover__and_deletion":272.219,"P\\Tests\\Api\\EdgeGatewayOperatorApiTest::__pest_evaluable_it_rejects_operator_edge_routes_when_module_permission_or_department_access_is_missing":46.681,"P\\Tests\\Integration\\EdgeGateway\\EdgeGatewayBackendIntegrationTest::__pest_evaluable_it_persists_install_session_updates_and_derives_gateway_runtime_status_from_heartbeats":0.015,"P\\Tests\\Integration\\EdgeGateway\\EdgeGatewayBackendIntegrationTest::__pest_evaluable_it_assembles_tasks__logs__statistics__operations__commands__and_shell_lifecycle_state_from_persisted_records":0.019,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_builds_localhost_websocket_broker_urls_on_the_local_traefik_api_prefix":1.312,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerUrlTest::__pest_evaluable_it_keeps_root_host_api_urls_unprefixed_when_the_request_is_not_under_the_local_api_alias":0.603,"P\\Tests\\Unit\\Customers\\CustomerMassImportServiceTest::__pest_evaluable_it_imports_a_matching_e_conomic_customer_into_the_local_system_when_no_local_record_exists":0.001,"P\\Tests\\Unit\\Customers\\CustomerMassImportServiceTest::__pest_evaluable_it_reports_when_the_local_customer_already_has_a_login_account":0,"P\\Tests\\Unit\\Customers\\CustomerMassImportServiceTest::__pest_evaluable_it_creates_a_new_e_conomic_customer_and_returns_a_created_result_for_new_rows":0,"P\\Tests\\Unit\\Customers\\CustomerMassImportServiceTest::__pest_evaluable_it_creates_the_economic_record_for_an_existing_local_account_when_no_matching_upstream_customer_exists":0,"P\\Tests\\Unit\\Customers\\CustomerMassImportServiceTest::__pest_evaluable_it_rejects_CVR_conflicts_when_the_upstream_customer_number_does_not_match_the_submitted_phone_number":0,"P\\Tests\\Unit\\Customers\\CustomerMassImportServiceTest::__pest_evaluable_it_registers_the_customer_import_route_and_wires_it_through_the_mass_import_service":0.009,"P\\Tests\\Unit\\Users\\UsersCustomerNamesCacheTest::__pest_evaluable_it_builds_customer_name_cache_payloads_from_economic_data_or_display_name_fallbacks":0,"P\\Tests\\Unit\\Users\\UsersCustomerNamesCacheTest::__pest_evaluable_it_guards_bulk_customer_name_cache_writes_behind_a_resolved_payload_check":0.003,"P\\Tests\\Api\\EdgeGatewayOperatorApiTest::__pest_evaluable_it_ignores_and_soft_deletes_edge_gateways_whose_department_no_longer_exists":35.946,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerHeartbeatStatusTest::__pest_evaluable_it_only_trusts_broker_presence_while_the_broker_heartbeat_is_fresh":1.458,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayManagerHeartbeatStatusTest::__pest_evaluable_it_refreshes_broker_presence_from_broker_telemetry_heartbeats":0.006,"P\\Tests\\Unit\\Selfserve\\ShellyTransportResolverTest::__pest_evaluable_it_resolves_the_injected_gateway_transport_when_a_department_is_in_gateway_mode":0,"P\\Tests\\Unit\\Selfserve\\ShellyTransportResolverTest::__pest_evaluable_it_resolves_the_injected_cloud_transport_when_a_department_is_in_cloud_mode":0,"P\\Tests\\Unit\\Selfserve\\ShellyTransportResolverTest::__pest_evaluable_it_lets_relay_tests_override_the_department_transport_without_changing_department_mode":0,"P\\Tests\\Unit\\Selfserve\\ShellyRelayInventoryTest::__pest_evaluable_it_falls_back_to_local_device_and_control_names_when_Shelly_cloud_list_metadata_is_unavailable":0,"P\\Tests\\Unit\\Selfserve\\GatewayShellyTransportTest::__pest_evaluable_it_uses_local_only_gateway_dispatch_for_explicit_local_transport_overrides":0,"P\\Tests\\Unit\\Selfserve\\ShellyTransportResolverTest::__pest_evaluable_it_marks_non_injected_local_overrides_as_local_only_gateway_transport":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePortControllerTest::__pest_evaluable_it_opens_exit_port_by_switching_relay__out__id_on":0.001,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePortControllerTest::__pest_evaluable_it_opens_entrance_port_by_switching_relay__in__id_on":0,"P\\Tests\\Unit\\Selfserve\\GatewayShellyTransportTest::__pest_evaluable_it_forwards_Shelly_toggle__after_timers_to_gateway_relay_switches":0,"P\\Tests\\Unit\\Selfserve\\ShellyTransportResolverTest::__pest_evaluable_it_marks_non_injected_local_and_gateway_overrides_as_local_only_gateway_transport":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_preserves_local_gateway_diagnostic_metadata_on_relay_status_snapshots":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_includes_positive_relay_timers_in_Shelly_switch_payloads":0,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_applies_Shelly_transport_overrides_across_self_serve_relay_side_effect_routes":0.029,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayLegacyRouteShimTest::__pest_evaluable_it_keeps_guarded_legacy_root_shims_for_moved_edge_gateway_routes":0.025,"P\\Tests\\Integration\\EdgeGateway\\EdgeGatewayBackendIntegrationTest::__pest_evaluable_it_persists_gateway_cutover_relay_bindings_used_by_self_serve_Shelly_dispatch":0.015,"P\\Tests\\Unit\\Selfserve\\SelfserveLanePortControllerTest::__pest_evaluable_it_passes_explicit_timer_values_when_opening_lane_gates":0,"P\\Tests\\Unit\\Selfserve\\ShellyRelayInventoryTest::__pest_evaluable_it_keeps_Shelly_1_Mini_Gen3_type__model__and_generation_aligned_with_Shelly_metadata":0,"P\\Tests\\Api\\EdgeGatewayBrokerApiTest::__pest_evaluable_it_rejects_shell_session_creation_while_broker_presence_is_unavailable":23.503,"P\\Tests\\Unit\\Selfserve\\EdgeGatewayModuleRouteWiringTest::__pest_evaluable_it_registers_broker_settings_as_editable_edge_gateway_module_config":0.007,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_self_serve_session_management_endpoints_and_OpenAPI_coverage":0.011,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_keeps_self_serve_force_stop_distinct_from_normal_STOP_relay_and_gate_behavior":0.015,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_keeps_read_only_self_serve_preview_and_summary_refreshes_from_touching_relay_hardware":0.003,"P\\Tests\\Unit\\Selfserve\\SelfserveWashFlowMachineAllowedWiringTest::__pest_evaluable_it_separates_session_synchronization_from_relay_hardware_synchronization":0.016,"P\\Tests\\Unit\\Selfserve\\ShellyRealRequestGuardTest::__pest_evaluable_it_blocks_and_records_test_mode_Shelly_POST_requests_before_cURL_can_run":0.001,"P\\Tests\\Unit\\Selfserve\\ShellyRealRequestGuardTest::__pest_evaluable_it_blocks_and_records_test_mode_Shelly_GET_requests_before_cURL_can_run":0,"P\\Tests\\Unit\\Selfserve\\ZZZShellyGuardSafetyMetaTest::__pest_evaluable_it_did_not_record_any_real_Shelly_request_attempts_during_self_serve_tests":0,"P\\Tests\\Api\\SelfserveFixtureApiTest::__pest_evaluable_it_creates_a_comprehensive_self_serve_API_scenario_with_demo_relays":0,"P\\Tests\\Api\\SelfserveZZZShellyGuardApiTest::__pest_evaluable_it_did_not_record_any_real_Shelly_request_attempts_during_self_serve_API_tests":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_serializes_questions__conditions__tasks__scopes__and_gateways_into_one_graph":0.239,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_derives_studio_vehicle_type_lookup_rows_from_selectable_wash_products":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_applies_saved_layout_without_changing_graph_semantics":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_keeps_layout_loading_compatible_with_native_PDO_named_placeholders":0.013,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_builds_guided_simulator_debug_payload_with_blockers_and_canvas_annotations":0.028,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_resolves_simulator_gateway_service_bindings_from_lane_relay_slots":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneRelayShellyBatchingTest::__pest_evaluable_it_persists_allowed_services_without_relay_writes_for_pre_start_wash_setup":0,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_the_all_in_one_self_serve_studio_replacement_endpoints":0.009,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStartEntranceTimeoutTest::__pest_evaluable_it_continues_start_when_entrance_relay_dispatch_times_out_ambiguously":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStartEntranceTimeoutTest::__pest_evaluable_it_still_fails_start_for_non_timeout_entrance_relay_errors":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStartEntranceTimeoutTest::__pest_evaluable_it_parses_deferred_relay_side_effects_on_start_command_arguments":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStartEntranceTimeoutTest::__pest_evaluable_it_skips_cleaner_and_machine_relay_side_effects_when_start_asks_to_defer_them":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStartEntranceTimeoutTest::__pest_evaluable_it_keeps_cleaner_and_machine_relay_side_effects_for_normal_start_commands":0,"P\\Tests\\Unit\\Selfserve\\SelfservePropertyGatePermissionBypassTest::__pest_evaluable_it_allows_property_gate_commands_for_customers_with_an_active_wash_in_the_target_department":0,"P\\Tests\\Unit\\Selfserve\\SelfservePropertyGatePermissionBypassTest::__pest_evaluable_it_does_not_bypass_property_gate_permissions_without_a_positive_customer_number":0,"P\\Tests\\Unit\\Selfserve\\SelfservePropertyGatePermissionBypassTest::__pest_evaluable_it_does_not_bypass_property_gate_permissions_when_the_customer_has_no_active_wash_in_the_target_department":0,"P\\Tests\\Unit\\Selfserve\\SelfserveOpenApiSpecTest::__pest_evaluable_it_documents_the_all_in_one_self_serve_studio_replacement_API":0.007,"P\\Tests\\Unit\\Selfserve\\SelfserveNonOwnedVehicleWashAccessTest::__pest_evaluable_it_allows_own_permission_customers_to_preview_borrowed_registration_plates_without_ownership_checks":0.005,"P\\Tests\\Unit\\Selfserve\\SelfserveNonOwnedVehicleWashAccessTest::__pest_evaluable_it_allows_customer_scoped_answers_to_be_stored_for_borrowed_registration_plates":0.003,"P\\Tests\\Unit\\Selfserve\\SelfserveNonOwnedVehicleWashAccessTest::__pest_evaluable_it_does_not_apply_saved_answers_from_another_customer_for_the_same_registration_plate":0.027,"P\\Tests\\Unit\\Selfserve\\SelfserveNonOwnedVehicleWashAccessTest::__pest_evaluable_it_scopes_saved_self_serve_answers_by_customer_number_and_registration_plate":0.004,"P\\Tests\\Unit\\Selfserve\\SelfserveNonOwnedVehicleWashAccessTest::__pest_evaluable_it_loads_saved_answers_from_the_authenticated_customer_context_instead_of_the_plate_owner":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_does_not_count_shifts_without_punches_when_checkIn_checkOut_are_null":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_counts_overtime_minutes_when_a_saved_shift_end_extends_past_the_approved_original_end":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_does_not_count_removed_approved_time_when_a_saved_shift_end_is_shortened":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_caps_current_slot_hours_to_elapsed_minutes_and_zeroes_future_slots":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_counts_checked_in_shifts_without_checkOut_up_to_occurredUntil":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodRouteGuardsTest::__pest_evaluable_it_keeps_the_main_period_response_local_only_for_booked_state_and_customer_names":0.024,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodRouteGuardsTest::__pest_evaluable_it_streams_the_main_period_response_instead_of_encoding_the_full_payload_at_once":0.033,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodRouteGuardsTest::__pest_evaluable_it_maps_batched_period_transaction_rows_to_the_legacy_transaction_response_shape":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodRouteGuardsTest::__pest_evaluable_it_uses_batched_period_transactions_and_keyed_customer_maps_in_the_main_period_route":0.033,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodRouteGuardsTest::__pest_evaluable_it_falls_back_to_configured_e_conomic_default_department_for_missing_customer_default_department_in_distributions":0.021,"P\\Tests\\Api\\EconomicDraftCustomerApiTest::__pest_evaluable_it_round_trips_the_default_distribution_department_config_value_through_economic_config_updates":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_computes_MySQL_GTID_interval_counts_and_coverage_percentages":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_reports_empty_source_GTID_sets_as_caught_up":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_computes_Redis_offset_percentages_safely":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_computes_MariaDB_GTID_coverage_by_domain_sequence":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_normalizes_public_replication_kind_aliases":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_supports_MariaDB_prerequisites_without_requiring_Oracle_MySQL_variables":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_reports_MariaDB_specific_blockers_when_GTID_or_binary_logging_prerequisites_are_missing":0,"P\\Tests\\Unit\\Replication\\ReplicationSecretBoxTest::__pest_evaluable_it_encrypts_replication_secrets_without_storing_plaintext":0.002,"P\\Tests\\Unit\\Replication\\ReplicationSecretBoxTest::__pest_evaluable_it_builds_active_database_and_redis_config_from_encrypted_bootstrap_snapshots":0,"P\\Tests\\Unit\\Replication\\SuperuserReplicationRouteWiringTest::__pest_evaluable_it_registers_superuser_replication_endpoints_and_permissions":0.019,"P\\Tests\\Unit\\Replication\\SuperuserReplicationRouteWiringTest::__pest_evaluable_it_documents_replication_management_in_openapi":0.016,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_generates_replication_ready_MariaDB_compose_templates_without_embedding_secrets":0.001,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_generates_Redis_replica_compose_templates_with_primary_connection_placeholders":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_does_not_require_replica_SQL_threads_before_database_provisioning_configures_them":0.006,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_creates_the_generated_replication_user_on_the_primary_during_provisioning":0.007,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_detects_missing_database_tables_before_provisioning_a_preseeded_replica":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_allows_failed_replicas_to_be_removed_without_allowing_primary_or_healthy_replica_removal":0.033,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_seeds_MariaDB_replicas_in_place_instead_of_requiring_container_recreation":0.024,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_keeps_replication_operation_progress_schema_idempotent_for_existing_installs":0.039,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_limits_MariaDB_log_table_seeding_to_the_last_month":0.002,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_skips_log_table_data_during_MariaDB_seeding_and_replication":0.003,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_keeps_operational_log_tables_schema_only_during_MariaDB_seeding_and_replication":0.005,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_provisions_Redis_replicas_after_a_connectivity_only_preflight_and_reports_sync_progress":0.015,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_keeps_Redis_promotion_caught_up__durable__and_metadata_safe":0.007,"P\\Tests\\Unit\\Auth\\CreateTokenTest::__pest_evaluable_it_creates_auth_tokens_and_reports_missing_customer_users_clearly":0.271,"P\\Tests\\Unit\\Auth\\EconomicCreateCustomerResponseTest::__pest_evaluable_it_returns_the_raw_upstream_create_response_and_preserves_the_requested_payload":0,"P\\Tests\\Unit\\Auth\\RegisterCvrLegacyScriptTest::__pest_evaluable_it_keeps_the_legacy_register_cvr_route_harness_passing":0.043,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_returns_a_raw_202_gather_response_for_initial_department_selection":0.205,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_accepts_legacy_initial_webhook_payloads_with_top_level_call_identifiers":0.005,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_returns_a_flow_data_gather_payload_after_department_selection_in_native_flow_mode_when_distinct_gate_choices_exist":0.002,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_opens_the_gate_immediately_after_department_selection_when_entrance_and_exit_resolve_to_the_same_gate_in_native_flow_mode":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_returns_a_flow_data_completion_payload_after_gate_confirmation_in_native_flow_mode":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_returns_a_second_stage_raw_202_gather_response_after_department_selection_when_distinct_gate_choices_exist":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_opens_the_shared_gate_immediately_after_department_selection_in_raw_command_mode":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_opens_the_selected_gate_and_clears_redis_state_on_final_selection":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_reprompts_with_invalid_selection_while_keeping_webhook_state":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_uses_fallback_dtmf_extraction_when_event_gather_keys_are_missing":0.001,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_prompts_for_department_selection_even_when_only_one_eligible_department_exists":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_prompts_for_a_single_available_gate_type_and_opens_only_after_explicit_confirmation":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_supports_multi_digit_department_selections_before_gate_confirmation":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_returns_a_direct_raw_200_completion_when_no_departments_are_eligible":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_continues_with_the_first_gather_prompt_when_backend_call_acceptance_fails":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteCallLifecycleTest::__pest_evaluable_it_returns_a_business_failure_raw_200_response_when_gate_opening_fails":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteIvrTest::__pest_evaluable_it_builds_deterministic_department_digit_map_without_capping_options":0.009,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteIvrTest::__pest_evaluable_it_builds_compact_gate_option_maps_and_resolves_selected_gate_type_by_digit":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteIvrTest::__pest_evaluable_it_builds_department_prompts_with_multi_digit_guidance_and_compact_gate_prompts":0,"P\\Tests\\Unit\\Bird\\BirdVoiceWebhooksRouteIvrTest::__pest_evaluable_it_normalizes_menu_digit_input_from_Bird_dtmf_payload_values":0,"P\\Tests\\Unit\\Bird\\DepartmentGatesPhoneCallOpenTest::__pest_evaluable_it_forwards_phone_number_and_call_duration_threshold_to_the_Bird_gate_helper":0.002,"P\\Tests\\Unit\\Bird\\DepartmentGatesPhoneCallOpenTest::__pest_evaluable_it_wraps_Bird_helper_failures_and_reports_them_to_Slack":0,"P\\Tests\\Unit\\Bookings\\NonPosBookingCompletionRemovalTest::__pest_evaluable_it_unregisters_legacy_booking_completion_forms":0.13,"P\\Tests\\Unit\\Bookings\\NonPosBookingCompletionRemovalTest::__pest_evaluable_it_keeps_legacy_wash_certificate_downloads_but_disables_generation_and_completion":0.166,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsComplaintsOpenApiSpecTest::__pest_evaluable_it_documents_the_daily_report_complaints_CRUD_and_customer_lookup_endpoints_in_openapi":0.011,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsComplaintsRouteContractTest::__pest_evaluable_it_wires_complaint_create__lookup__list__edit__and_delete_routes_with_validation_and_parsing":0.01,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsOutsideHoursOpenApiSpecTest::__pest_evaluable_it_documents_outside_hours_summary_and_trend_schemas_in_openapi":0.016,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsOutsideHoursRouteContractTest::__pest_evaluable_it_wires_outside_hours_summary_and_trend_endpoints_through_the_dedicated_statistics_service":0.007,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsOutsideHoursRouteContractTest::__pest_evaluable_it_initializes_the_outside_hours_statistics_service_before_building_the_transaction_count_summary_payload":0.006,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsOverviewOpenApiSpecTest::__pest_evaluable_it_documents_the_daily_report_overview_endpoint_and_reusable_schemas_in_openapi":0.013,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsOverviewRouteTest::__pest_evaluable_it_builds_the_overview_payload_from_batched_repository_data_with_deterministic_tile_states":0.013,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsOverviewRouteTest::__pest_evaluable_it_marks_overtime_unavailable_when_not_every_selected_department_can_be_mapped_to_workfeed":0,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsOverviewRouteTest::__pest_evaluable_it_normalizes_department_id_input_from_csv_strings_and_nested_values":0,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsOverviewRouteTest::__pest_evaluable_it_limits_overtime_counting_to_the_selected_reporting_range":0,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsOverviewRouteTest::__pest_evaluable_it_does_not_count_negative_approved_overtime_when_a_saved_end_shortens_the_shift":0,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsOverviewRouteTest::__pest_evaluable_it_ignores_late_unapproved_administrative_edits_when_calculating_overtime":0,"P\\Tests\\Unit\\DailyReports\\DepartmentDailyReportsOverviewRouteTest::__pest_evaluable_it_wires_the_overview_route_to_batched_repository_methods_and_overview_path":0.013,"P\\Tests\\Unit\\DailyReports\\DepartmentOutsideHoursStatisticsServiceTest::__pest_evaluable_it_counts_only_outside_hours_washes_and_flags_missing_opening_hours_without_counting_them_as_closed":0.002,"P\\Tests\\Unit\\DailyReports\\DepartmentOutsideHoursStatisticsServiceTest::__pest_evaluable_it_deduplicates_linked_washes_with_self_serve_first__then_xlvask__then_orders":0,"P\\Tests\\Unit\\DailyReports\\DepartmentOutsideHoursStatisticsServiceTest::__pest_evaluable_it_builds_daily_trend_points_with_per_day_missing_hours_diagnostics":0.001,"P\\Tests\\Unit\\Database\\DbObjectRedisNamespaceSafetyTest::__pest_evaluable_it_keeps_db_object_Redis_access_namespace_safe":0.008,"P\\Tests\\Unit\\DynamicImages\\DepartmentLaneDynamicImageRouteTest::__pest_evaluable_it_allows_studio_lane_dynamic_image_previews_to_override_the_saved_image_id":0.012,"P\\Tests\\Unit\\DynamicImages\\DepartmentLaneDynamicImageRouteTest::__pest_evaluable_it_accepts_ordered_dynamic_image_button_tokens_including_reset_start_and_zero":0.003,"P\\Tests\\Unit\\DynamicImages\\DepartmentLaneDynamicImageRouteTest::__pest_evaluable_it_renders_machine_one_dynamic_image_steps_from_the_ordered_button_payload":0.014,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueDetailsSummaryBuilderTest::__pest_evaluable_it_uses_queued_job_payload_customer_context_before_result_data_exists":0,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueRouteHardeningTest::__pest_evaluable_it_exposes_collected_invoice_queue_monitor_and_per_user_terminal_clear_routes":0.008,"P\\Tests\\Unit\\Invoicing\\CollectedInvoiceQueueRouteHardeningTest::__pest_evaluable_it_runs_collected_invoice_queue_batches_through_an_explicit_manual_endpoint":0.026,"P\\Tests\\Unit\\Invoicing\\EconomicAuthTokenFallbackTest::__pest_evaluable_it_bounds_e_conomic_curl_calls_below_the_PHP_request_timeout":0.01,"P\\Tests\\Unit\\Invoicing\\EconomicCustomersDiscountFallbackTest::__pest_evaluable_it_falls_back_to_a_later_customer_template_product_when_earlier_probes_fail_on_missing_currency_prices":0,"P\\Tests\\Unit\\Invoicing\\EconomicCustomersDiscountFallbackTest::__pest_evaluable_it_returns_zero_when_every_customer_template_lookup_fails_due_to_missing_currency_prices":0,"P\\Tests\\Unit\\Invoicing\\EconomicCustomersDiscountFallbackTest::__pest_evaluable_it_rethrows_unrelated_discount_lookup_failures":0,"P\\Tests\\Unit\\Invoicing\\EconomicDraftCustomerOpenApiSpecTest::__pest_evaluable_it_documents_transaction_draft_customer_config_and_auth_runtime_fields_in_all_tracked_openapi_copies":0.306,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueCronEntrypointWiringTest::__pest_evaluable_it_wires_root_cron_entrypoint_to_the_full_cron_scheduler_with_queue_worker_tasks":0.009,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueOpenApiSpecTest::__pest_evaluable_it_documents_additive_collected_invoice_queue_pagination_metadata_and_retry_conflict_semantics":0.009,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueWorkerTickRouteTest::__pest_evaluable_it_exposes_an_explicit_collected_invoice_transfer_queue_run_route_instead_of_ticking_read_endpoints":0.013,"P\\Tests\\Unit\\Invoicing\\EconomicTransferQueueWorkerTickRouteTest::__pest_evaluable_it_keeps_order_transfer_queue_status_routes_read_only":0.005,"P\\Tests\\Unit\\Invoicing\\EconomicV2BookedDepartment75DistributionTest::__pest_evaluable_it_assigns_classified_booked_department_75_amounts_to_fallback_when_no_monthly_basis_exists":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2DistributionServiceFallbackTest::__pest_evaluable_it_falls_back_to_system_orders_for_fixed_pricing_using_the_configured_fallback_department":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2DistributionServiceFallbackTest::__pest_evaluable_it_falls_back_to_system_orders_for_wash_subscriptions_using_the_configured_fallback_department":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2DistributionServiceFallbackTest::__pest_evaluable_it_uses_the_configured_fallback_department_when_a_subscription_has_no_customer_department_basis":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2DistributionServiceFallbackTest::__pest_evaluable_it_excludes_orphaned_customer_traces_from_fixed_pricing_and_customer_price_distributions":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2DistributionServiceFallbackTest::__pest_evaluable_it_excludes_orphaned_customers_from_subscription_fallback_versions":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2DistributionServiceOrderOverrideTest::__pest_evaluable_it_inherits_department_eligibility_when_no_order_override_is_set":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2DistributionServiceOrderOverrideTest::__pest_evaluable_it_allows_an_order_level_include_override_to_overrule_department_exclusion":0,"P\\Tests\\Unit\\Invoicing\\EconomicV2DistributionServiceOrderOverrideTest::__pest_evaluable_it_allows_an_order_level_exclude_override_to_overrule_department_inclusion":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_builds_deterministic_automatic_flag_fingerprints_and_interactive_price_message_parts":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_builds_interactive_message_parts_for_order_and_wash_certificate_warnings":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_includes_order_item_preview_context_for_required_order_field_warnings":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_allows_tank_cleaning_products_for_only_tank_cleaning_customers":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_does_not_flag_interior_wash_variants_as_historical_primary_product_mismatches":0.001,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_does_not_report_duplicate_primary_vehicle_products_from_duplicated_detector_rows_for_the_same_order_item":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_uses_attached_wash_certificate_documents_instead_of_safety_seal_text_for_certificate_presence":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_loads_wash_certificate_attachment_presence_from_order_attachment_content":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_uses_the_highest_customer_specific_discount_in_expected_price_breakdowns":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_uses_a_preloaded_e_conomic_global_discount_in_expected_price_breakdowns":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_does_not_report_a_price_mismatch_when_a_product_specific_discount_makes_the_expected_price_zero":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_preloads_and_caches_missing_e_conomic_discounts_before_price_mismatch_detection":0.04,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_seeds_order_item_preview_cache_from_period_rows":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_sorts_manual_flags_before_automatic_warnings_and_preserves_legacy_circle_indicators_without_flags":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_scopes_invoice_period_flags_to_the_customer_card_that_can_render_them":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_keeps_order_item_preview_context_compact_for_the_period_response":0,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_formats_stored_manual_flags_with_the_creating_superuser_display_name":0.003,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_validates_supported_manual_flag_fields_by_target_type":0.136,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_wires_invoice_period_flag_routes_with_explicit_list_create_and_update_permissions":0.043,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_uses_the_users_display__name_column_in_detector_queries":0.115,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_aggregates_customer_price_overrides_by_customer_number_for_price_mismatch_detection":0.115,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_guards_optional_customer_vehicle_deleted__at_filtering_behind_a_column_check":0.097,"P\\Tests\\Unit\\Invoicing\\InvoicePeriodFlagServiceTest::__pest_evaluable_it_limits_historical_primary_product_lookup_to_current_period_registrations":0.08,"P\\Tests\\Unit\\Invoicing\\InvoicingOrdersCalculationsHardeningTest::__pest_evaluable_it_provides_a_batched_plain_row_transaction_query_for_invoicing_period_responses":0.11,"P\\Tests\\Unit\\Invoicing\\InvoicingOrdersCalculationsHardeningTest::__pest_evaluable_it_adds_guarded_composite_indexes_for_invoicing_period_lookups":0.155,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodDraftOverlayTest::__pest_evaluable_it_blocks_invoicing_when_all_actionable_transactions_are_backed_by_valid_e_conomic_drafts":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodDraftOverlayTest::__pest_evaluable_it_keeps_invoicing_available_when_valid_drafts_only_cover_part_of_the_actionable_work":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodDraftOverlayTest::__pest_evaluable_it_excludes_errored__booked__deleted__and_missing_external_id_invoice_collections_at_query_time":0.027,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodDraftOverlayTest::__pest_evaluable_it_still_checks_valid_drafts_when_the_collection_table_has_no_deleted_marker_column":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodDraftOverlayTest::__pest_evaluable_it_blocks_fixed_pricing_and_subscription_customer_level_work_when_a_relevant_valid_draft_exists":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodDraftOverlayTest::__pest_evaluable_it_keeps_queue_blocking_ahead_of_the_draft_label_when_all_work_is_covered_by_queue_or_draft_state":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodPaginationTest::__pest_evaluable_it_detects_paginated_period_mode_only_when_pagination_parameters_are_present":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodPaginationTest::__pest_evaluable_it_normalizes_period_pagination_options_and_clamps_invalid_page_and_limit_values":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodPaginationTest::__pest_evaluable_it_slices_only_the_active_period_view_and_keeps_exact_full_result_type_counts":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodPaginationTest::__pest_evaluable_it_returns_the_entire_active_period_view_when_the_limit_is_all":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodPaginationTest::__pest_evaluable_it_searches_customer_fields_and_order_fields_at_the_customer_card_level":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodPaginationTest::__pest_evaluable_it_applies_requires_action_and_booked_visibility_filters_before_counting_and_slicing":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodQueueOverlayTest::__pest_evaluable_it_normalizes_targeted_customer_number_filters_from_comma_separated_or_repeated_values":0,"P\\Tests\\Unit\\Invoicing\\InvoicingPeriodQueueOverlayTest::__pest_evaluable_it_filters_period_customer_number_candidates_to_targeted_customers_only":0,"P\\Tests\\Unit\\MotorApi\\MotorApiCachedResultTest::__pest_evaluable_it_only_writes_cached_MotorAPI_metadata_when_a_response_object_exists":0,"P\\Tests\\Unit\\Orders\\OrderBookingsCompletionDedupTest::__pest_evaluable_it_attaches_and_emails_a_wash_certificate_when_a_booking_is_already_linked_to_a_pos_order_without_one":0,"P\\Tests\\Unit\\Orders\\OrderBookingsCompletionDedupTest::__pest_evaluable_it_does_not_create_or_email_a_duplicate_wash_certificate_when_a_linked_pos_order_already_has_one":0,"P\\Tests\\Unit\\Orders\\OrderBookingsCompletionDedupTest::__pest_evaluable_it_keeps_standalone_booking_completion_behavior_unchanged_for_wash_certificates":0,"P\\Tests\\Unit\\Orders\\OrdersAutoWashCertificateCompletionTest::__pest_evaluable_it_auto_attaches_a_wash_certificate_on_order_completion_when_a_wash_certificate_item_is_present":0.001,"P\\Tests\\Unit\\Orders\\OrdersAutoWashCertificateCompletionTest::__pest_evaluable_it_keeps_order_completion_idempotent_when_a_wash_certificate_is_already_attached":0,"P\\Tests\\Unit\\Orders\\OrdersAutoWashCertificateCompletionTest::__pest_evaluable_it_allows_blank_safety_seal_values_when_auto_attaching_a_wash_certificate_on_completion":0,"P\\Tests\\Unit\\Orders\\OrdersIncludeInInvoiceOverrideTest::__pest_evaluable_it_lets_the_order_level_override_include_an_otherwise_excluded_order":0,"P\\Tests\\Unit\\Orders\\OrdersIncludeInInvoiceOverrideTest::__pest_evaluable_it_lets_the_order_level_override_exclude_an_otherwise_included_order":0,"P\\Tests\\Unit\\Orders\\OrdersIncludeInInvoiceOverrideTest::__pest_evaluable_it_falls_back_to_the_department_invoicing_rule_when_the_override_is_null":0,"P\\Tests\\Unit\\Orders\\OrdersIncludeInInvoiceOverrideTest::__pest_evaluable_it_serializes_both_raw_and_effective_include__in__invoice_values":0,"P\\Tests\\Unit\\Orders\\OrdersInputNormalizerTest::__pest_evaluable_it_normalizes_sql_and_datetime_local_created__at_values":0,"P\\Tests\\Unit\\Orders\\OrdersInputNormalizerTest::__pest_evaluable_it_rejects_invalid_created__at_values":0,"P\\Tests\\Unit\\Orders\\OrdersInputNormalizerTest::__pest_evaluable_it_normalizes_include__in__invoice_tri_state_inputs":0,"P\\Tests\\Unit\\Orders\\OrdersInputNormalizerTest::__pest_evaluable_it_rejects_invalid_include__in__invoice_values":0,"P\\Tests\\Unit\\Orders\\OrdersRouteSettingsUpdateWiringTest::__pest_evaluable_it_wires_order_create_and_update_routes_through_the_settings_normalizers":0.035,"P\\Tests\\Unit\\Orders\\OrdersRouteSettingsUpdateWiringTest::__pest_evaluable_it_keeps_line_item_invoice_filtering_in_the_order_net_amount_calculation":0.004,"P\\Tests\\Unit\\Orders\\OrdersRouteStripePaymentIntentLifecycleWiringTest::__pest_evaluable_it_wires_mobile_stripe_payment_intent_routes_to_normalized_lifecycle_handling":0.008,"P\\Tests\\Unit\\Orders\\StripePaymentIntentsPersistenceWiringTest::__pest_evaluable_it_wires_stripe_payment_intent_persistence_to_prune_duplicates_and_clear_reader_state_safely":0.104,"P\\Tests\\Unit\\Redis\\RedisAtomicReservationTest::__pest_evaluable_it_does_not_send_empty_mget_commands_to_redis":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_generates_MinIO_replica_compose_templates_without_embedding_secrets":0.001,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_computes_MinIO_free_space_and_catch_up_math_safely":0.001,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_wires_MinIO_replication_through_routes_and_bootstrap_snapshots":0.07,"P\\Tests\\Unit\\Selfserve\\SelfserveConditionEvaluatorTest::__pest_evaluable_it_evaluates_nested_v2_ALL_and_ANY_expression_trees_with_trace_output":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConditionEvaluatorTest::__pest_evaluable_it_evaluates_v2_if__else_if__and_else_condition_branches_in_order":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConditionEvaluatorTest::__pest_evaluable_it_evaluates_v2_case_expressions_against_question_values":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConditionEvaluatorTest::__pest_evaluable_it_returns_false_and_traces_v2_condition_expression_cycles":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_fails_validation_when_nested_conditions_form_cycles":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_migrates_legacy_AND_and_OR_rules_into_grouped_v2_condition_expressions":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_repairs_legacy_defaulted_always_task_gates_during_v2_normalization":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_does_not_let_legacy_defaulted_always_task_gates_bypass_validation":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_rejects_unsupported_legacy_task_target_rules_after_migration":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_validates_v2_expressions_for_empty_used_conditions__missing_refs__invalid_operators__and_cycles":0,"P\\Tests\\Unit\\Selfserve\\SelfserveConfigVersioningTest::__pest_evaluable_it_validates_nested_v2_branch_and_case_expressions":0,"P\\Tests\\Unit\\Selfserve\\SelfserveInProgressWashAccessTest::__pest_evaluable_it_keeps_own_in_progress_self_serve_wash_details_visible_to_the_customer":0,"P\\Tests\\Unit\\Selfserve\\SelfserveInProgressWashAccessTest::__pest_evaluable_it_redacts_another_customers_in_progress_wash_details_during_customer_lane_polling":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_adds_vehicle_type_product_on_STOP_when_the_physical_machine_ON_signal_was_recorded__then_turns_off_cleaner_and_machine_relays":0.014,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_skips_vehicle_type_product_add_when_no_physical_machine_ON_signal_was_recorded_and_only_disables_configured_relays":0.009,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_does_not_use_selector_relay_online_status_as_machine_wash_billing_evidence":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_continues_STOP_when_exit_relay_dispatch_times_out_ambiguously":0,"P\\Tests\\Unit\\Selfserve\\SelfserveLaneStopFlowTest::__pest_evaluable_it_still_fails_STOP_for_non_timeout_exit_relay_errors":0.012,"P\\Tests\\Unit\\Selfserve\\SelfserveMachineSignalTest::__pest_evaluable_it_normalizes_Shelly_input_toggle_ON_events_as_machine_start_signals":0.001,"P\\Tests\\Unit\\Selfserve\\SelfserveMachineSignalTest::__pest_evaluable_it_normalizes_Shelly_switch_ON_events_and_nested_status_payloads":0,"P\\Tests\\Unit\\Selfserve\\SelfserveMachineSignalTest::__pest_evaluable_it_recognizes_Shelly_OFF_events_but_does_not_treat_them_as_billable_machine_starts":0,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_local_edge_gateway_machine_ON_signal_monitor_endpoints":0.021,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_wires_lane_level_self_serve_toggles_through_lane_APIs__guest_payloads__and_edge_workspace_readiness":0.011,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_returns_authoritative_allowed_service_state_from_self_serve_session_summaries":0.006,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_filters_machine_button_tasks_out_of_self_serve_snapshots_when_MACHINE_is_not_allowed":0.006,"P\\Tests\\Unit\\Selfserve\\SelfserveRouteWiringTest::__pest_evaluable_it_blocks_new_self_serve_eligibility_and_session_sync_for_disabled_lanes":0.009,"P\\Tests\\Unit\\Selfserve\\SelfserveSchemaBootstrapCompatibilityTest::__pest_evaluable_it_adds_lane_level_self_serve_enablement_for_existing_department_lanes":0.002,"P\\Tests\\Unit\\Selfserve\\SelfserveSchemaBootstrapCompatibilityTest::__pest_evaluable_it_creates_canvas_only_self_serve_studio_layout_storage":0.002,"P\\Tests\\Unit\\Selfserve\\SelfserveSchemaBootstrapCompatibilityTest::__pest_evaluable_it_uses_mysql_safe_identifiers_for_self_serve_studio_virtual_hardware_storage":0.009,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_serializes_configurable_studio_actions_with_event__gate__scope__and_ordering_edges":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_validates_action_configuration_and_keeps_warnings_non_blocking":0.018,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_serializes_v2_condition_expressions_without_standalone_rule_nodes":0.05,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_serializes_branch_and_case_condition_expression_dependencies":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_keeps_runtime_on_published_v2_configs_and_leaves_draft_JSON_as_the_studio_edit_surface":0.008,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_surfaces_task_attachments_in_studio_graph__simulator__and_flow_responses":0.016,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_exposes_dynamic_images_and_referenced_machine_types_as_studio_lookup_choices":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_keeps_lane_management_fields_on_lane_scope_nodes":0.024,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_routes_studio_lane_graph_operations_through_department__lanes":0.005,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_projects_visible_question_answer_paths_into_grouped_task_service_and_signal_outcomes":0.011,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_truncates_path_outcome_projection_when_the_state_cap_is_reached":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_returns_complete_terminal_path_results_for_wide_question_trees_and_reports_progress":0.364,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_generates_and_merges_virtual_hardware_as_studio_only_relay_coverage":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_renders_virtual_gateway_nodes_and_task_service_edges_in_the_studio_graph":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_inserts_configured_action_signals_into_the_simulator_timeline_in_runtime_order":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_simulates_lane_scoped_wash_start_actions_for_property_gates_and_lane_entrance_ports":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_adds_ordered_simulator_signal_timeline_rows_for_virtual_hardware_dry_runs":0,"P\\Tests\\Unit\\Selfserve\\SelfserveWashFlowMachineAllowedWiringTest::__pest_evaluable_it_infers_legacy_defaulted_always_task_gates_from_condition__id_at_runtime":0,"P\\Tests\\Unit\\Selfserve\\SelfserveWashSessionStateTest::__pest_evaluable_it_treats_terminal_self_serve_wash_session_statuses_as_closed":0,"P\\Tests\\Unit\\Selfserve\\SelfserveWashSessionStateTest::__pest_evaluable_it_freezes_elapsed_self_serve_wash_minutes_at_completion_time":0,"P\\Tests\\Unit\\Subusers\\SubusersRouteManagementContractTest::__pest_evaluable_it_exposes_chauffeur_management_endpoints_on_the_subusers_route":0.009,"P\\Tests\\Unit\\Subusers\\SubusersRouteManagementContractTest::__pest_evaluable_it_includes_grant_management_fields_in_the_subusers_payload_builder":0.006,"P\\Tests\\Unit\\Subusers\\SubusersRouteManagementContractTest::__pest_evaluable_it_links_grant_disable_operations_to_SUBUSERS__DELETE_for_own_customer_managers":0.006,"P\\Tests\\Unit\\Subusers\\SubusersRouteManagementContractTest::__pest_evaluable_it_prevents_own_customer_managers_from_editing_driver_owned_account_profiles":0.005,"P\\Tests\\Unit\\Subusers\\SubusersRouteManagementContractTest::__pest_evaluable_it_only_allows_invite_resend_while_setup_is_still_pending":0.009,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusOpenApiSpecTest::__pest_evaluable_it_documents_the_superuser_system_status_snapshot_endpoint_in_openapi":0.008,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusOpenApiSpecTest::__pest_evaluable_it_defines_the_reusable_system_status_schemas_and_enums":0.006,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusRouteWiringTest::__pest_evaluable_it_registers_the_aggregated_superuser_system_status_endpoint_and_permission":0.006,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusRouteWiringTest::__pest_evaluable_it_keeps_the_legacy_database_status_endpoint_wired_through_the_shared_snapshot_service":0.004,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_reduces_overall_status_using_down_and_degraded_precedence":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_classifies_runtime_usage_percentages_consistently":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_reuses_cached_module_probes_only_when_the_ttl_is_still_valid_and_force_is_false":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_classifies_authenticated_http_probe_responses_conservatively with data set \"dataset \"success\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_classifies_authenticated_http_probe_responses_conservatively with data set \"dataset \"unauthorized\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_classifies_authenticated_http_probe_responses_conservatively with data set \"dataset \"forbidden\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_classifies_authenticated_http_probe_responses_conservatively with data set \"dataset \"rate limited\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_classifies_authenticated_http_probe_responses_conservatively with data set \"dataset \"server error\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_classifies_authenticated_http_probe_responses_conservatively with data set \"dataset \"no response\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_classifies_transport_errors_as_down":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_normalizes_and_deduplicates_warning_entries_for_snapshots":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_interprets_recaptcha_probe_payloads_safely with data set \"dataset \"dummy token rejected but credentials valid\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_interprets_recaptcha_probe_payloads_safely with data set \"dataset \"invalid secret is down\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_interprets_recaptcha_probe_payloads_safely with data set \"dataset \"unexpected validation errors degrade\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_the_expected_http_probe_requests_for_newly_supported_modules with data set \"dataset \"recaptcha\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_the_expected_http_probe_requests_for_newly_supported_modules with data set \"dataset \"email\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_the_expected_http_probe_requests_for_newly_supported_modules with data set \"dataset \"motorapi\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_the_expected_http_probe_requests_for_newly_supported_modules with data set \"dataset \"fxratesapi\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_the_expected_http_probe_requests_for_newly_supported_modules with data set \"dataset \"weatherapi\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_the_expected_http_probe_requests_for_newly_supported_modules with data set \"dataset \"workfeed\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_the_expected_http_probe_requests_for_newly_supported_modules with data set \"dataset \"gatewayapi\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_the_expected_http_probe_requests_for_newly_supported_modules with data set \"dataset \"xlvask\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_the_expected_http_probe_requests_for_newly_supported_modules with data set \"dataset \"limble\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_the_expected_http_probe_requests_for_newly_supported_modules with data set \"dataset \"license plate recognizer\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_the_expected_http_probe_requests_for_newly_supported_modules with data set \"dataset \"bird\"\"":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_uses_runtime_economic_credentials_for_the_economic_probe":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_returns_down_without_attempting_economic_http_calls_when_runtime_credentials_are_missing":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_reports_backup_probe_failures_from_local_validation":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_returns_configured_for_shelly_when_no_known_device_id_is_available_for_probing":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_builds_an_authenticated_shelly_status_probe_when_a_known_device_id_exists":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_validates_selfserve_schema_and_minute_product_configuration":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_reports_invalid_selfserve_minute_configuration_before_touching_the_schema":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_reports_missing_selfserve_minute_products":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_surfaces_selfserve_bootstrap_failures":0,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_adds_localization_metadata_for_disabled_and_missing_config_modules":40.262,"P\\Tests\\Unit\\SystemStatus\\SuperuserSystemStatusServiceTest::__pest_evaluable_it_marks_newly_supported_modules_as_probe_backed_and_leaves_only_truly_unsupported_modules_as_configuration_only":38.499,"P\\Tests\\Unit\\SystemStatus\\SystemSessionActivityTrackerTest::__pest_evaluable_it_detects_device_types_from_common_user_agents":0,"P\\Tests\\Unit\\SystemStatus\\SystemSessionActivityTrackerTest::__pest_evaluable_it_treats_recent_sessions_as_active_within_the_configured_activity_window":0,"P\\Tests\\Unit\\SystemStatus\\SystemSessionActivityTrackerTest::__pest_evaluable_it_converts_database_utc_datetimes_into_timezone_aware_iso_strings":0,"P\\Tests\\Unit\\SystemStatus\\SystemSessionActivityTrackerTest::__pest_evaluable_it_treats_timezone_aware_iso_timestamps_as_active_using_absolute_time":0,"P\\Tests\\Unit\\Tooling\\LegacyTestInventoryTest::__pest_evaluable_it_keeps_every_legacy_PHP_test_accounted_for_in_the_manifest":0.489,"P\\Tests\\Unit\\Tooling\\MySqlSchemaCompatibilityTest::__pest_evaluable_it_keeps_schema_bootstrap_SQL_compatible_with_the_MySQL_runner":6.55,"P\\Tests\\Unit\\Users\\UsersCustomerNamesCacheTest::__pest_evaluable_it_allows_callers_to_resolve_customer_names_without_e_conomic_fallback":0.003,"P\\Tests\\Unit\\Users\\UsersCustomerNamesCacheTest::__pest_evaluable_it_returns_an_empty_customer_name_map_without_touching_cache_for_empty_input":0,"P\\Tests\\Unit\\Users\\UsersCustomerNamesCacheTest::__pest_evaluable_it_returns_no_rows_for_empty_array_field_filters":0,"P\\Tests\\Unit\\Users\\UsersRedisNamespaceSafetyTest::__pest_evaluable_it_keeps_users_Redis_access_namespace_safe":0.005,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherCacheRuntimeBehaviorTest::__pest_evaluable_it_builds_department_weather_preload_targets_in_cli_without_a_request_uri":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherPreloadCronWiringTest::__pest_evaluable_it_registers_and_implements_cron_warming_for_workfeed_employee_name_cache":0.007,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherStatusTargetsTest::__pest_evaluable_it_aggregates_multi_department_slot_statuses_using_worst_severity_when_any_department_is_unhealthy":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherStatusTargetsTest::__pest_evaluable_it_aggregates_all_unhealthy_multi_department_slot_statuses_as_unhealthy":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherStatusTargetsTest::__pest_evaluable_it_returns_unknown_when_aggregated_multi_department_slot_targets_are_missing":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherStatusTargetsTest::__pest_evaluable_it_returns_unknown_when_aggregated_multi_department_slot_has_no_evaluable_hours":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherStatusTargetsTest::__pest_evaluable_it_returns_unknown_when_aggregated_multi_department_slot_has_not_started_yet":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherTargetsRouteWiringTest::__pest_evaluable_it_registers_department_weather_hour_details_route_with_weather_read_and_department_access_checks":0.007,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_calculates_weather_hour_contributions_grouped_per_employee_for_a_slot":0.001,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_calculates_weather_hour_contributions_for_canonical_nested_workfeed_employee_schema":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_extracts_weather_employee_identity_from_supported_shift_payload_shapes":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_prefers_canonical_workfeed_employee_schema_fields_over_generic_employee_names":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_does_not_use_workfeed_schema_name_fields_as_employee_ids":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_returns_a_null_employee_name_when_no_workfeed_employee_name_is_available":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_resolves_missing_workfeed_employee_names_from_the_employees_endpoint":0.042,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_filters_employee_hour_rows_that_cannot_be_resolved_to_a_workfeed_schema_name":0,"P\\Tests\\Unit\\Workfeed\\DepartmentWeatherWorkfeedHoursTest::__pest_evaluable_it_resolves_employee_display_name_from_cache_when_shift_payload_lacks_a_name":0,"P\\Tests\\Unit\\Workfeed\\WorkfeedEmployeeNameFormatterTest::__pest_evaluable_it_formats_workfeed_employee_display_names_from_the_documented_firstname_lastname_schema":0,"P\\Tests\\Unit\\Workfeed\\WorkfeedEmployeeNameFormatterTest::__pest_evaluable_it_prefers_workfeed_schema_names_over_generic_display_name_fields":0,"P\\Tests\\Unit\\Workfeed\\WorkfeedEmployeeNameFormatterTest::__pest_evaluable_it_falls_back_to_legacy_display_name_fields_when_schema_names_are_absent":0,"P\\Tests\\Unit\\Workfeed\\WorkfeedEmployeeNameFormatterTest::__pest_evaluable_it_ignores_placeholder_workfeed_display_names":0,"P\\Tests\\Unit\\Workfeed\\WorkfeedEmployeeNameFormatterTest::__pest_evaluable_it_ignores_employee_id_placeholder_display_names_when_the_id_is_known":0,"P\\Tests\\Unit\\XLVask\\XLVaskAutomationServiceTest::__pest_evaluable_it_normalizes_registrations_for_XL_Vask_automation_signatures":0,"P\\Tests\\Unit\\XLVask\\XLVaskAutomationServiceTest::__pest_evaluable_it_builds_stable_XL_Vask_automation_item_signatures":0,"P\\Tests\\Unit\\XLVask\\XLVaskAutomationServiceTest::__pest_evaluable_it_normalizes_persisted_XL_Vask_usage_log_rows_before_helper_hydration":0,"P\\Tests\\Unit\\XLVask\\XLVaskAutomationServiceTest::__pest_evaluable_it_builds_stable_OpenAI_cache_keys_for_identical_automation_input":0,"P\\Tests\\Unit\\XLVask\\XLVaskAutomationServiceTest::__pest_evaluable_it_changes_OpenAI_cache_keys_when_automation_eligibility_input_changes":0,"P\\Tests\\Unit\\XLVask\\XLVaskAutomationServiceTest::__pest_evaluable_it_declares_a_persistent_OpenAI_cache_table_for_XL_Vask_automation":0.005,"P\\Tests\\Unit\\XLVask\\XLVaskAutomationServiceTest::__pest_evaluable_it_declares_cached_amount_summary_columns_for_XL_Vask_usage_logs":0.012,"P\\Tests\\Unit\\XLVask\\XLVaskAutomationServiceTest::__pest_evaluable_it_scores_same_day_orders_with_matching_XL_Vask_products_and_extra_add_ons_as_attach_suggestions":0.003,"P\\Tests\\Unit\\XLVask\\XLVaskAutomationServiceTest::__pest_evaluable_it_does_not_score_an_order_with_only_the_primary_product_as_a_matching_add_on_attachment":0,"P\\Tests\\Unit\\XLVask\\XLVaskUsageLogHelperTest::__pest_evaluable_it_accepts_persisted_ignore_metadata_from_xlvask_usage_log_rows":0.019,"P\\Tests\\Unit\\XLVask\\XLVaskUsageLogHelperTest::__pest_evaluable_it_calculates_XL_Vask_amount_summaries_without_hydrating_order_item_previews":0.006,"P\\Tests\\Unit\\XLVask\\XLVaskUsageRouteContractTest::__pest_evaluable_it_exposes_direct_linked_order_metadata_on_XL_Vask_usage_order_rows":0.003,"P\\Tests\\Unit\\XLVask\\XLVaskUsageRouteContractTest::__pest_evaluable_it_returns_cached_amount_summaries_on_XL_Vask_usage_order_rows_without_widening_the_usage_log_object_payload":0.003,"P\\Tests\\Integration\\DailyReports\\DepartmentDailyReportComplaintsIntegrationTest::__pest_evaluable_it_counts_complaint_rows_by_department_and_created__at_reporting_range":0.284,"P\\Tests\\Integration\\DailyReports\\DepartmentDailyReportComplaintsIntegrationTest::__pest_evaluable_it_updates_and_deletes_complaint_rows":0.005,"P\\Tests\\Integration\\DailyReports\\DepartmentDailyReportComplaintsIntegrationTest::__pest_evaluable_it_parses_created__by__name_from_the_users_table":0.005,"P\\Tests\\Integration\\DailyReports\\DepartmentOutsideHoursStatisticsServiceIntegrationTest::__pest_evaluable_it_integrates_orders__xlvask__and_self_serve_into_one_outside_hours_summary_with_missing_hours_diagnostics":0.016,"P\\Tests\\Integration\\Invoicing\\EconomicTransferQueueIntegrationTest::__pest_evaluable_it_processes_only_collected_invoice_jobs_and_respects_the_manual_batch_limit":0.014,"P\\Tests\\Integration\\SystemStatus\\SuperuserSystemStatusInfrastructureProbeTest::__pest_evaluable_it_can_probe_the_configured_database_in_integration_mode":0,"P\\Tests\\Integration\\SystemStatus\\SuperuserSystemStatusInfrastructureProbeTest::__pest_evaluable_it_can_probe_redis_in_integration_mode_when_configured":0,"P\\Tests\\Integration\\SystemStatus\\SuperuserSystemStatusInfrastructureProbeTest::__pest_evaluable_it_can_probe_minio_in_integration_mode_when_configured":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_redacts_sensitive_release_timeline_payload_fields_recursively":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_verifies_GitHub_sha256_webhook_signatures":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_normalizes_GitHub_repository_identifiers_for_private_repository_access_checks":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_defines_release_manager_schema__routes__permissions__and_system_status_integration_hooks":0.575,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_summarizes_failed_deployments_and_blocks_promotion_until_a_deployment_succeeds":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_uses_the_selected_Coolify_project_and_resolves_server_UUID_from_the_instance_default":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_supports_isolated_stack_mode_and_names_new_Coolify_services_explicitly":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_creates_Coolify_service_payloads_from_raw_compose_without_a_service_type":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_normalizes_Coolify_API_base_URLs_to_the_v1_API_root":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_parses_generated_env_files_for_Coolify_service_env_bulk_updates":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_prefers_public_Coolify_server_hosts_over_Docker_local_addresses":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_blocks_planned_downtime_operations_against_active_replication_primaries":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_allows_failed_Coolify_replica_targets_to_be_removed_after_the_service_disappears":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_retries_Coolify_maintenance_while_linked_replication_provisioning_is_still_incomplete":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_plans_Hetzner_load_balancer_target_and_service_drift_without_mutating_state":0.24,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_does_not_plan_removal_of_the_last_Hetzner_load_balancer_target":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_plans_removal_only_for_disabled_or_deleted_Hetzner_load_balancer_targets":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_defines_Coolify_schema__route_permissions__and_replication_integration_hooks":0.418,"P\\Tests\\Unit\\ErrorReports\\ErrorReportTest::__pest_evaluable_it_redacts_sensitive_error_report_payload_fields_recursively":0.001,"P\\Tests\\Unit\\ErrorReports\\ErrorReportTest::__pest_evaluable_it_validates_supported_screenshot_data_uris":0,"P\\Tests\\Unit\\ErrorReports\\ErrorReportTest::__pest_evaluable_it_defines_error_report_schema__routes__permissions__storage__and_OpenAPI_docs":0.04,"P\\Tests\\Unit\\Http\\ResponseRequestParametersTest::__pest_evaluable_it_reads_JSON_payloads_for_DELETE_request_parameter_arrays":0,"P\\Tests\\Unit\\Http\\ResponseRequestParametersTest::__pest_evaluable_it_keeps_DELETE_query_parameters_when_no_JSON_body_is_present":0,"P\\Tests\\Unit\\Infrastructure\\CorsReleaseHeadersTest::__pest_evaluable_it_allows_release_telemetry_headers_at_PHP_served_CORS_entry_points":0.424,"P\\Tests\\Unit\\Orders\\OrderBookingsCompletionDedupTest::__pest_evaluable_it_uses_the_linked_pos_order_wash_certificate_item_added_during_mobile_completion":0,"P\\Tests\\Unit\\Replication\\ReplicaFailoverManagerTest::__pest_evaluable_it_normalizes_failover_config_defaults_and_per_kind_enablement":0,"P\\Tests\\Unit\\Replication\\ReplicaFailoverManagerTest::__pest_evaluable_it_requires_strict_fresh_100_percent_replica_status_for_candidates":0,"P\\Tests\\Unit\\Replication\\ReplicaFailoverManagerTest::__pest_evaluable_it_selects_the_freshest_eligible_replica_for_failover":0,"P\\Tests\\Unit\\Replication\\ReplicaFailoverManagerTest::__pest_evaluable_it_promotes_enabled_startup_dependencies_from_snapshot_in_dependency_order":0.004,"P\\Tests\\Unit\\Replication\\ReplicaFailoverManagerTest::__pest_evaluable_it_does_not_promote_a_disabled_dependency_during_startup_failover":0.001,"P\\Tests\\Unit\\Replication\\ReplicaFailoverManagerTest::__pest_evaluable_it_wires_the_failover_module_config_endpoint_and_promotion_paths":0.312,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_can_embed_primary_admin_credentials_in_generated_MariaDB_replica_env_files":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_keeps_operational_and_derived_tables_schema_only_during_MariaDB_seeding_and_replication":0.021,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_supports_metadata_only_replication_host_renames":0.005,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_keeps_MinIO_backup_replicas_bounded_to_the_recent_backup_window":0.014,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_prefills_MinIO_replica_compose_primary_values_from_current_config_when_available":0.001,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_allows_the_MinIO_client_binary_to_be_configured_explicitly":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_supports_MinIO_client_runtime_fallback_configuration":0,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_extracts_host_specific_MariaDB_replication_account_denials":0.001,"P\\Tests\\Unit\\Replication\\ReplicationManagerStatusTest::__pest_evaluable_it_identifies_stopped_database_replication_threads_as_a_restartable_status":0,"P\\Tests\\Unit\\Scanner\\ModuleScannerRouteTest::__pest_evaluable_it_returns_no_plate_LPR_results_without_a_failed_HTTP_status":0.046,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_does_not_invent_GHCR_images_for_Coolify_service_payloads":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_keeps_release_branch_services_out_of_the_production_Coolify_environment_except_beta":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_creates_Coolify_GitHub_App_application_payloads_so_pulls_use_the_app_token":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_does_not_treat_an_existing_Coolify_service_as_an_application_just_because_a_GitHub_App_UUID_is_stored":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_can_use_the_Coolify_instance_default_GitHub_App_when_source_targets_do_not_store_it_yet":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_updates_existing_frontend_Coolify_applications_away_from_legacy_Nixpacks_detection":0,"P\\Tests\\Unit\\Auth\\EconomicCreateCustomerResponseTest::__pest_evaluable_it_adds_supported_CVR_company_fields_to_the_e_conomic_customer_payload":0.014,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_keeps_release_channel_runtime_availability_independent_from_channel_URLs":0.007,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_chooses_a_requested_runtime_channel_only_when_it_is_available_to_the_principal":0.199,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_normalizes_release_assignment_subject_suggestions_without_leaking_private_fields":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_keeps_GitHub_commit_timestamps_in_public_release_manager_commit_payloads":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_requires_non_default_release_channel_runtime_URLs_and_preserves_load_balancer_paths":0.105,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_exposes_release_version_git_commit_metadata_for_runtime_channel_cards":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_builds_gateway_API_auto_provision_context_for_connected_Coolify_servers":0.001,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_adds_explicit_Coolify_application_route_labels_for_gateway_API_domains":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_builds_explicit_Coolify_application_route_labels_for_release_API_targets":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_uses_the_self_contained_Coolify_API_Dockerfile_for_API_applications":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_isolates_and_restores_Hetzner_load_balancer_IP_targets_for_gateway_certificate_bootstrap":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_requires_gateway_ping_probes_to_return_the_API_ping_contract":0,"P\\Tests\\Unit\\Tooling\\ComposerEntrypointTest::__pest_evaluable_it_checks_PSR_HTTP_message_interfaces_before_trusting_a_Composer_vendor_tree":0,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_marks_a_channel_ready_when_all_release_services_are_healthy":0.001,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_reports_non_default_channels_missing_bundles__versions__and_URLs_as_blocking_missing_values":0.024,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_surfaces_failed_latest_deployments_as_critical_promotion_blockers":0,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_flags_isolated_stacks_that_are_missing_database_Redis_and_MinIO_services":0,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_maps_degraded_Coolify_targets_and_reconcile_failures_to_release_service_issues":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_plans_Hetzner_load_balancer_service_health_check_drift_updates":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_returns_structured_errors_for_failed_gateway_certificate_bootstrap_and_verification":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_captures_release_request_context_from_headers_and_runtime_query_parameters":0.004,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_normalizes_channel_prefixed_API_ingress_paths_before_route_dispatch":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_creates_frontend_Coolify_GitHub_App_application_payloads_with_the_release_Dockerfile":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_builds_gateway_frontend_auto_provision_context_with_the_release_Dockerfile":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_allows_explicit_runtime_selection_of_any_enabled_release_channel":0.289,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_chooses_requested_runtime_channels_from_available_channels_or_enabled_channel_slugs":0,"P\\Tests\\Unit\\Coolify\\CoolifyManagerTest::__pest_evaluable_it_normalizes_gateway_probe_paths_for_release_gateway_health_checks":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_resolves_release_deployment_endpoints_from_manual_overrides__URLs__health_checks__and_gateway_defaults":0.001,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_does_not_report_frontend_or_API_URLs_missing_when_target_auto_endpoints_are_resolvable":0,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_offers_a_release_bundle_action_when_exactly_one_deployed_bundle_is_eligible":0.008,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_offers_application_target_preparation_for_path_routed_Coolify_failures":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_maps_the_public_master_API_prefix_to_the_stable_release_channel":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_uses_master_as_the_public_route_slug_for_the_stable_release_channel":0,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_does_not_block_channels_on_unhealthy_data_targets_when_data_services_are_production_shared":0,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_ignores_missing_legacy_bundles_but_still_blocks_on_missing_versions_and_URLs":0.001,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_marks_a_branch_based_channel_ready_without_a_release_bundle_when_app_versions_and_URLs_exist":0,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_does_not_surface_legacy_release_bundle_actions_as_readiness_blockers":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_adds_exact_hidden_question__skipped_action__signal__and_button_decision_causes":0,"P\\Tests\\Api\\OrderBookingsCompletionApiTest::__pest_evaluable_it_rejects_standalone_order_booking_completion_outside_POS":5.621,"P\\Tests\\Api\\OrderBookingsCompletionApiTest::__pest_evaluable_it_allows_linked_POS_order_booking_completion_for_mobile_POS_compatibility":4.121,"P\\Tests\\Api\\OrderBookingsCompletionApiTest::__pest_evaluable_it_accepts_numeric_safety_seal_strings_when_completing_a_linked_POS_order_booking":4.366,"P\\Tests\\Api\\OrderBookingsCompletionApiTest::__pest_evaluable_it_disables_the_legacy_complete_wash_without_certificate_route":1.122,"P\\Tests\\Api\\OrderBookingsUpdateApiTest::__pest_evaluable_it_detaches_an_order_booking_and_clears_the_matching_order_link":5.559,"P\\Tests\\Api\\OrderBookingsUpdateApiTest::__pest_evaluable_it_keeps_the_linked_order_when_order__id_is_omitted_from_an_order_booking_update":5.22,"P\\Tests\\Unit\\DynamicImages\\DepartmentLaneDynamicImageRouteTest::__pest_evaluable_it_accepts_ordered_dynamic_image_button_tokens_including_program_picker_reset_start_and_zero":0.007,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_adds_program_picker_before_mapped_machine_buttons_in_simulator_debug_decisions":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_verifies_CI_release_gate_bearer_tokens_from_dedicated_release_credentials":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_only_chooses_requested_runtime_channels_from_channels_available_to_the_principal":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_ignores_explicit_runtime_selection_for_channels_outside_the_principal_channel_set":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_auto_prepares_path_routed_release_targets_for_Coolify_application_creation":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_offers_application_target_preparation_for_missing_Coolify_service_creation_failures":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_builds_API_Coolify_runtime_environment_from_allowed_process_variables":0.001,"P\\Tests\\Unit\\Infrastructure\\CorsPolicyTest::__pest_evaluable_it_normalizes_URL_like_CORS_entries_to_origins":0,"P\\Tests\\Unit\\Infrastructure\\CorsPolicyTest::__pest_evaluable_it_merges_required_release_and_existing_frontend_origins_into_configured_CORS":0,"P\\Tests\\Unit\\Infrastructure\\CorsPolicyTest::__pest_evaluable_it_builds_credential_safe_normal_CORS_response_headers_for_allowed_origins":0,"P\\Tests\\Unit\\Infrastructure\\CorsPolicyTest::__pest_evaluable_it_builds_preflight_CORS_response_headers_for_api_v2_release_URLs":0,"P\\Tests\\Unit\\Infrastructure\\CorsPolicyTest::__pest_evaluable_it_rejects_unknown_CORS_origins":0,"P\\Tests\\Unit\\Infrastructure\\CorsPolicyTest::__pest_evaluable_it_reflects_the_request_origin_for_wildcard_CORS_instead_of_sending_credentialed_wildcard_headers":0,"P\\Tests\\Unit\\Selfserve\\SelfserveCustomerLaneAccessTest::__pest_evaluable_it_allows_customers_with_own_self_serve_permission_to_use_enabled_self_serve_lanes":0,"P\\Tests\\Unit\\Selfserve\\SelfserveCustomerLaneAccessTest::__pest_evaluable_it_blocks_customer_lane_mutations_without_own_self_serve_permission":0,"P\\Tests\\Unit\\Selfserve\\SelfserveCustomerLaneAccessTest::__pest_evaluable_it_blocks_customer_lane_mutations_when_the_lane_is_not_operationally_enabled":0,"P\\Tests\\Unit\\Selfserve\\SelfserveCustomerLaneAccessTest::__pest_evaluable_it_allows_active_wash_operations_when_the_lane_runtime_belongs_to_the_customer":0,"P\\Tests\\Unit\\Selfserve\\SelfserveCustomerLaneAccessTest::__pest_evaluable_it_falls_back_to_active_department_sessions_for_customer_active_wash_operations":0,"P\\Tests\\Unit\\Selfserve\\SelfserveCustomerLaneAccessTest::__pest_evaluable_it_blocks_active_wash_operations_for_other_customers":0,"P\\Tests\\Unit\\Selfserve\\SelfservePropertyGatePermissionBypassTest::__pest_evaluable_it_does_not_bypass_property_gate_permissions_without_customer_self_serve_permission":0,"P\\Tests\\Unit\\Selfserve\\SelfserveCustomerLaneAccessTest::__pest_evaluable_it_keeps_active_wash_operations_available_if_a_lane_is_disabled_after_start":0,"P\\Tests\\Api\\SelfserveLaneWashInProgressApiTest::__pest_evaluable_it_requires_authentication_before_checking_in_progress_wash_permissions":0,"P\\Tests\\Api\\SelfserveLaneWashInProgressApiTest::__pest_evaluable_it_reports_both_elevated_and_customer_self_serve_permissions_when_lane_polling_is_not_allowed":0,"P\\Tests\\Api\\SelfserveLaneWashInProgressApiTest::__pest_evaluable_it_allows_customer_self_serve_permission_to_view_their_own_in_progress_wash_details":0,"P\\Tests\\Api\\SelfserveLaneWashInProgressApiTest::__pest_evaluable_it_redacts_another_customers_in_progress_wash_from_customer_self_serve_lane_polling":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_keeps_beta_API_runtime_environment_on_production_database_target":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_treats_attach_existing_service_sets_without_data_target_ids_as_production_shared_ready":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_rejects_beta_release_bundles_that_resolve_to_isolated_cloned_or_fresh_data_services":0.01,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_detects_explicit_data_target_ids_so_beta_service_sets_can_stay_data_only":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_resolves_backend_commit_sha_from_API_runtime_environment_in_priority_order":0.009,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_injects_selected_API_commit_into_Coolify_runtime_env_unless_explicitly_set":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_allows_beta_production_service_bundles_only_when_data_services_stay_production_shared":0,"P\\Tests\\Unit\\ReleaseManager\\ReleaseManagerTest::__pest_evaluable_it_keeps_release_branch_services_out_of_the_production_Coolify_environment":0,"P\\Tests\\Unit\\Release\\ReleaseManagerStatusOverviewTest::__pest_evaluable_it_marks_beta_ready_from_the_production_frontend_and_API_services":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_uses_program_picker_button_numbers_as_thumb_selectors_in_simulator_debug_decisions":0,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_upserts_path_editor_answers_into_generated_condition_and_task_config_rows":0.021,"P\\Tests\\Unit\\Selfserve\\SelfserveStudioGraphTest::__pest_evaluable_it_marks_projected_path_confirmations_confirmed_or_stale_by_stable_signatures":0,"P\\Tests\\Unit\\Selfserve\\SelfserveSchemaBootstrapCompatibilityTest::__pest_evaluable_it_creates_self_serve_studio_path_confirmation_storage":0.003}} \ No newline at end of file diff --git a/services/nginx/app/classes/release_manager.php b/services/nginx/app/classes/release_manager.php index 7e99b77d..1fa0130c 100644 --- a/services/nginx/app/classes/release_manager.php +++ b/services/nginx/app/classes/release_manager.php @@ -132,6 +132,7 @@ class release_manager ]; private bool $schemaEnsured = false; + private array $inProcessPassedReleaseGates = []; public static function initializeRequestContext(): array { @@ -813,6 +814,22 @@ class release_manager ]); $statuses[] = 'passed'; + if ($this->releaseGateAutoSyncRequested($gateInput)) { + foreach ($this->releaseGateAutoSyncValidationSteps($gateInput, $channel) as $autoSyncStep) { + $this->recordOperationStep( + $operationId, + (string)$autoSyncStep['step_key'], + (string)$autoSyncStep['label'], + (string)$autoSyncStep['status'], + $autoSyncStep['message'] ?? null, + $autoSyncStep['diagnostic'] ?? null, + $autoSyncStep['solution_hint'] ?? null, + is_array($autoSyncStep['context'] ?? null) ? $autoSyncStep['context'] : [] + ); + $statuses[] = (string)$autoSyncStep['status']; + } + } + if (($gateInput['required_checks'] ?? []) !== []) { $this->recordOperationStep( $operationId, @@ -905,6 +922,45 @@ class release_manager $finalStatus = in_array('failed', $statuses, true) ? 'failed' : (count(array_intersect($statuses, ['warning', 'skipped'])) > 0 ? 'warning' : 'passed'); + + if ($finalStatus === 'passed' && $this->releaseGateAutoSyncRequested($gateInput)) { + try { + $this->inProcessPassedReleaseGates[$operationId] = [ + 'channel_id' => $channel !== null ? (int)$channel['id'] : null, + 'release_gate' => $gateInput, + ]; + $autoSyncResult = $this->processReleaseGateAutoSync($gateInput, $channel, $operationId, $actorUserId); + $autoSyncStepStatus = (string)($autoSyncResult['step_status'] ?? 'passed'); + $this->recordOperationStep( + $operationId, + 'auto_sync', + 'Automatic container update', + $autoSyncStepStatus, + (string)($autoSyncResult['message'] ?? 'Automatic container update completed.'), + $autoSyncResult['diagnostic'] ?? null, + $autoSyncResult['solution_hint'] ?? null, + $autoSyncResult + ); + $statuses[] = $autoSyncStepStatus; + } catch (Throwable $throwable) { + $this->recordOperationStep( + $operationId, + 'auto_sync', + 'Automatic container update', + 'failed', + 'Automatic container update failed after the release gate passed.', + $throwable->getMessage(), + 'Open the channel sync operation or Release Manager target diagnostics, fix the failure, then rerun the gate.', + $gateInput + ); + $statuses[] = 'failed'; + } + + $finalStatus = in_array('failed', $statuses, true) + ? 'failed' + : (count(array_intersect($statuses, ['warning', 'skipped'])) > 0 ? 'warning' : 'passed'); + } + $this->completeOperationRun( $operationId, $finalStatus, @@ -945,11 +1001,27 @@ class release_manager $apiBaseUrl = $this->normalizeReleaseGateUrl((string)($input['api_base_url'] ?? 'https://api-v2.truckwash.io')); $requiredChecks = $this->normalizeReleaseGateChecks($input, $environmentUrl); $routeSlug = self::routeSlugForChannel($channelSlug ?: 'stable') ?: 'master'; + $app = ''; + if (trim((string)($input['app'] ?? '')) !== '') { + try { + $app = $this->normalizeApp((string)$input['app']); + } catch (Throwable) { + $app = ''; + } + } + $repository = self::normalizeGithubRepositoryName((string)($input['repository'] ?? $input['repo'] ?? '')); + $branch = trim((string)($input['branch'] ?? '')); + $workflowUrl = $this->normalizeReleaseGateUrl((string)($input['workflow_url'] ?? $input['build_url'] ?? '')); return [ 'environment_url' => $environmentUrl, 'channel_slug' => $channelSlug, 'route_slug' => $routeSlug, + 'app' => $app, + 'repository' => $repository, + 'branch' => $branch, + 'auto_sync' => $this->toBool($input['auto_sync'] ?? false), + 'workflow_url' => $workflowUrl, 'expected_commit' => self::safeIdentifier((string)($input['expected_commit'] ?? $input['commit_sha'] ?? ''), 128), 'build_id' => substr(trim((string)($input['build_id'] ?? '')), 0, 128), 'wait_timeout_seconds' => max(0, min(300, (int)($input['wait_timeout_seconds'] ?? 300))), @@ -984,6 +1056,70 @@ class release_manager return $normalized; } + private function releaseGateAutoSyncRequested(array $gateInput): bool + { + return (bool)($gateInput['auto_sync'] ?? false); + } + + private function releaseGateAutoSyncValidationSteps(array $gateInput, ?array $channel): array + { + $steps = []; + $context = [ + 'channel_slug' => $gateInput['channel_slug'] ?? null, + 'app' => $gateInput['app'] ?? null, + 'repository' => $gateInput['repository'] ?? null, + 'branch' => $gateInput['branch'] ?? null, + 'expected_commit' => $gateInput['expected_commit'] ?? null, + 'workflow_url' => $gateInput['workflow_url'] ?? null, + ]; + + if ($channel === null) { + $steps[] = [ + 'step_key' => 'auto_sync_channel', + 'label' => 'Automatic update channel', + 'status' => 'failed', + 'message' => 'Automatic container updates require a release channel.', + 'diagnostic' => 'The gate payload did not resolve to a configured release channel.', + 'solution_hint' => 'Pass channel_slug from CI, for example stable for master.', + 'context' => $context, + ]; + } + if (trim((string)($gateInput['app'] ?? '')) === '') { + $steps[] = [ + 'step_key' => 'auto_sync_app', + 'label' => 'Automatic update app', + 'status' => 'failed', + 'message' => 'Automatic container updates require an app.', + 'diagnostic' => 'The gate payload must identify frontend or api so Release Manager updates exactly one container.', + 'solution_hint' => 'Pass app=frontend from the frontend workflow or app=api from the backend workflow.', + 'context' => $context, + ]; + } + if (trim((string)($gateInput['expected_commit'] ?? '')) === '') { + $steps[] = [ + 'step_key' => 'auto_sync_commit', + 'label' => 'Automatic update commit', + 'status' => 'failed', + 'message' => 'Automatic container updates require the CI-verified commit SHA.', + 'diagnostic' => 'expected_commit was empty.', + 'solution_hint' => 'Pass github.sha as expected_commit in the release gate payload.', + 'context' => $context, + ]; + } + + if ($steps === []) { + $steps[] = [ + 'step_key' => 'auto_sync_inputs', + 'label' => 'Automatic update inputs', + 'status' => 'passed', + 'message' => 'Release gate payload includes app, channel, and exact commit metadata for automatic container updates.', + 'context' => $context, + ]; + } + + return $steps; + } + private function releaseGateStringArray(mixed $value): array { if (is_string($value)) { @@ -1040,7 +1176,7 @@ class release_manager return $steps; } - private function assertReleaseGatePassedForPromotion(int $channelId, ?string $expectedCommit = null, ?string $buildId = null): void + private function assertReleaseGatePassedForPromotion(int $channelId, ?string $expectedCommit = null, ?string $buildId = null, ?string $app = null): void { if (!$this->releaseGateRequiredForPromotion()) { return; @@ -1048,6 +1184,24 @@ class release_manager $expectedCommit = trim((string)$expectedCommit); $buildId = trim((string)$buildId); + $app = trim((string)$app) !== '' ? $this->normalizeApp((string)$app) : ''; + foreach ($this->inProcessPassedReleaseGates as $inProcessGate) { + if ((int)($inProcessGate['channel_id'] ?? 0) !== $channelId) { + continue; + } + $gate = is_array($inProcessGate['release_gate'] ?? null) ? $inProcessGate['release_gate'] : []; + if ($app !== '' && !$this->releaseGateAppMatches($gate, $app)) { + continue; + } + if ($expectedCommit !== '' && !$this->releaseGateCommitMatches((string)($gate['expected_commit'] ?? ''), $expectedCommit)) { + continue; + } + if ($buildId !== '' && (string)($gate['build_id'] ?? '') !== $buildId) { + continue; + } + return; + } + $rows = $this->selectRows( "SELECT id, context_json, completed_at FROM release_operation_runs @@ -1064,6 +1218,9 @@ class release_manager foreach ($rows as $row) { $context = json_decode((string)($row['context_json'] ?? ''), true); $gate = is_array($context['release_gate'] ?? null) ? $context['release_gate'] : []; + if ($app !== '' && !$this->releaseGateAppMatches($gate, $app)) { + continue; + } if ($expectedCommit !== '' && !$this->releaseGateCommitMatches((string)($gate['expected_commit'] ?? ''), $expectedCommit)) { continue; } @@ -1077,6 +1234,35 @@ class release_manager throw new RuntimeException('A passing Release Manager gate is required before promotion. Run the dev upload, public live smoke, credentialed smoke, and api-v2 health checks, then retry promotion.'); } + private function releaseGateAppMatches(array $gate, string $app): bool + { + $app = $this->normalizeApp($app); + $gateApp = trim((string)($gate['app'] ?? '')); + if ($gateApp !== '') { + try { + return $this->normalizeApp($gateApp) === $app; + } catch (Throwable) { + return false; + } + } + + $gateApps = $this->releaseGateStringArray($gate['apps'] ?? []); + if ($gateApps !== []) { + foreach ($gateApps as $value) { + try { + if ($this->normalizeApp($value) === $app) { + return true; + } + } catch (Throwable) { + } + } + return false; + } + + // Gates recorded before app-specific payloads existed were frontend release gates. + return $app === 'frontend'; + } + private function releaseGateRequiredForPromotion(): bool { $envValue = trim((string)(getenv('RELEASE_GATE_REQUIRED_FOR_PROMOTION') ?: ($_SERVER['RELEASE_GATE_REQUIRED_FOR_PROMOTION'] ?? ''))); @@ -1362,14 +1548,92 @@ class release_manager private function releaseGateCommitMatches(string $actual, string $expected): bool { - $expected = trim($expected); + $expected = strtolower(trim($expected)); if ($expected === '') { return true; } - $actual = trim($actual); + $actual = strtolower(trim($actual)); return $actual !== '' && ($actual === $expected || str_starts_with($actual, $expected)); } + private function verifyReleaseDeploymentReadiness(array $deployment, array $target, string $app, string $expectedCommit, array $options = []): array + { + $app = $this->normalizeApp($app); + $baseUrl = $this->normalizeReleasePublicBaseUrl($deployment['deployment_url'] ?? null, $app) + ?? $this->releaseTargetPublicBaseUrl($target); + if ($baseUrl === null || $baseUrl === '') { + throw new RuntimeException(sprintf('%s deployment has no public URL for readiness verification.', strtoupper($app))); + } + + $timeout = max(0, min(300, (int)($options['wait_timeout_seconds'] ?? 300))); + $pollInterval = max(1, min(60, (int)($options['poll_interval_seconds'] ?? 10))); + $deadline = time() + $timeout; + $attempts = 0; + $lastMessage = 'Readiness verification did not run.'; + + do { + $attempts++; + try { + if ($app === 'frontend') { + $context = $this->releaseStaticArtifactAttempt([ + 'environment_url' => $baseUrl, + 'expected_commit' => $expectedCommit, + 'build_id' => (string)($options['build_id'] ?? ''), + 'shell_paths' => $this->releaseGateStringArray($options['shell_paths'] ?? ['/', '/guest/book/wash']), + ]); + $context['app'] = $app; + $context['base_url'] = $baseUrl; + $context['attempts'] = $attempts; + return $context; + } + + $json = $this->releaseGateFetchJson($baseUrl, 'ping'); + $payload = $json['json']; + if (array_key_exists('success', $payload) && $payload['success'] !== true) { + throw new RuntimeException('API ping returned success=false.'); + } + $data = is_array($payload['data'] ?? null) ? $payload['data'] : $payload; + $actualCommit = (string)( + $data['api_commit_sha'] + ?? $data['backend_commit_sha'] + ?? $data['commit_sha'] + ?? $data['backend_version'] + ?? '' + ); + if (!$this->releaseGateCommitMatches($actualCommit, $expectedCommit)) { + throw new RuntimeException(sprintf( + 'API ping commit %s did not match expected commit %s.', + $actualCommit !== '' ? $actualCommit : '(missing)', + $expectedCommit + )); + } + + return [ + 'app' => $app, + 'base_url' => $baseUrl, + 'path' => 'ping', + 'status' => $json['status'] ?? null, + 'commit_sha' => $actualCommit, + 'attempts' => $attempts, + ]; + } catch (Throwable $throwable) { + $lastMessage = $throwable->getMessage(); + if (time() >= $deadline) { + break; + } + sleep($pollInterval); + } + } while (time() <= $deadline); + + throw new RuntimeException(sprintf( + '%s container readiness did not match commit %s after %d attempts: %s', + strtoupper($app), + $expectedCommit, + $attempts, + $lastMessage + )); + } + private function releaseGateRejectsHtml(string $assetUrl): bool { return preg_match('/\.(js|css|json|webmanifest|svg|png|ico|woff2?|mp3)$/i', parse_url($assetUrl, PHP_URL_PATH) ?: '') === 1; @@ -1401,8 +1665,11 @@ class release_manager $requestedApp = $this->normalizeApp((string)$options['app']); } $apps = $requestedApp !== '' ? [$requestedApp] : self::APPS; - $branch = self::releaseBranchForChannel($channel); + $branch = trim((string)($options['branch'] ?? '')) ?: self::releaseBranchForChannel($channel); $routeSlug = self::routeSlugForChannel((string)$channel['slug']); + $requestedCommitSha = self::normalizeCommitSha((string)($options['commit_sha'] ?? $options['commit'] ?? '')); + $commitMode = $requestedCommitSha !== '' ? 'specific' : 'latest'; + $requireReadiness = $this->toBool($options['require_readiness'] ?? false); $operationId = $this->createOperationRun('channel_sync', [ 'subject_type' => 'channel', @@ -1417,6 +1684,13 @@ class release_manager 'branch' => $branch, 'apps' => $apps, 'source' => $options['source'] ?? 'manual', + 'repository' => $options['repository'] ?? null, + 'commit_mode' => $commitMode, + 'commit_sha' => $requestedCommitSha !== '' ? $requestedCommitSha : null, + 'workflow_url' => $options['workflow_url'] ?? $options['build_url'] ?? null, + 'auto_sync_event_id' => $options['auto_sync_event_id'] ?? null, + 'auto_sync_event' => $options['auto_sync_event'] ?? null, + 'gate_operation_id' => $options['gate_operation_id'] ?? null, ], ]); @@ -1512,13 +1786,18 @@ class release_manager } $repository = trim((string)($target['repository'] ?? self::defaultRepositoryForApp($app))); + $requestedRepository = self::normalizeGithubRepositoryName((string)($options['repository'] ?? '')); + if ($requestedRepository !== '') { + $repository = $requestedRepository; + } if ($repository === '') { $repository = self::defaultRepositoryForApp($app); } $access = $this->githubRepositoryAccess([ 'repository' => $repository, 'branch' => $branch, - 'commit_mode' => 'latest', + 'commit_sha' => $requestedCommitSha, + 'commit_mode' => $commitMode, ]); if (!($access['ok'] ?? false)) { $this->recordOperationStep( @@ -1567,20 +1846,37 @@ class release_manager 'app' => $app, 'repository' => $repository, 'branch' => $branch, - 'commit_mode' => 'latest', + 'commit_mode' => $commitMode, + 'commit_sha' => $commitSha, 'version_label' => $commitSha !== '' ? substr($commitSha, 0, 12) : date('Ymd-His'), 'build_url' => $options['build_url'] ?? null, 'metadata' => [ 'release_operation_id' => $operationId, 'sync_source' => $options['source'] ?? 'manual', 'webhook_commit_sha' => $options['commit_sha'] ?? null, + 'auto_sync_event_id' => $options['auto_sync_event_id'] ?? null, + 'gate_operation_id' => $options['gate_operation_id'] ?? null, + 'workflow_url' => $options['workflow_url'] ?? null, ], ], $actorUserId); - $deployments[] = $deployment; if (($deployment['status'] ?? '') === 'deployed' && !empty($deployment['id'])) { + if ($requireReadiness) { + $readiness = $this->verifyReleaseDeploymentReadiness($deployment, $target, $app, $commitSha, $options); + $this->recordOperationStep( + $operationId, + $app . '_readiness', + strtoupper($app) . ' container readiness', + 'passed', + sprintf('%s container readiness matched commit %s.', strtoupper($app), substr($commitSha, 0, 12)), + null, + null, + $readiness + ); + } $promoted = $this->promoteDeployment((int)$deployment['id'], $actorUserId); $deployment = $promoted['deployment'] ?? $deployment; } + $deployments[] = $deployment; $this->recordOperationStep( $operationId, $app . '_deploy', @@ -1627,6 +1923,315 @@ class release_manager return $operation; } + private function processReleaseGateAutoSync(array $gateInput, ?array $channel, int $gateOperationId, ?int $actorUserId): array + { + if ($channel === null) { + throw new RuntimeException('Automatic container update requires a release channel.'); + } + + $channelId = (int)$channel['id']; + $app = $this->normalizeApp((string)($gateInput['app'] ?? '')); + $commitSha = self::normalizeCommitSha((string)($gateInput['expected_commit'] ?? '')); + if ($commitSha === '') { + throw new RuntimeException('Automatic container update requires a 7-40 character Git commit SHA.'); + } + + $branch = trim((string)($gateInput['branch'] ?? '')) ?: self::releaseBranchForChannel($channel); + $repository = self::normalizeGithubRepositoryName((string)($gateInput['repository'] ?? '')); + if ($repository === '') { + $repository = self::defaultRepositoryForApp($app); + } + + $target = $this->deploymentTargetForChannelApp($channelId, $app); + if ($target === null) { + throw new RuntimeException(sprintf('No %s deployment target is configured for %s.', strtoupper($app), (string)$channel['slug'])); + } + if (!$this->toBool($target['auto_deploy'] ?? false)) { + throw new RuntimeException(sprintf('%s automatic deployments are disabled for %s.', strtoupper($app), (string)$channel['slug'])); + } + + $targetRepository = self::normalizeGithubRepositoryName((string)($target['repository'] ?? '')); + $targetBranch = trim((string)($target['branch'] ?? '')); + if ($targetRepository !== '' && $repository !== $targetRepository) { + throw new RuntimeException(sprintf('Gate repository %s does not match target repository %s.', $repository, $targetRepository)); + } + if ($targetBranch !== '' && $branch !== $targetBranch) { + throw new RuntimeException(sprintf('Gate branch %s does not match target branch %s.', $branch, $targetBranch)); + } + + $event = $this->upsertReleaseAutoSyncEvent([ + 'channel_id' => $channelId, + 'app' => $app, + 'repository' => $repository, + 'branch' => $branch, + 'commit_sha' => $commitSha, + 'status' => 'gate_passed', + 'source' => 'release_gate', + 'workflow_url' => $gateInput['workflow_url'] ?? null, + 'gate_operation_id' => $gateOperationId, + 'metadata' => [ + 'release_gate' => $gateInput, + ], + ]); + + $eventId = (int)$event['id']; + if (!$this->acquireReleaseAutoSyncLock($eventId)) { + return [ + 'step_status' => 'passed', + 'message' => 'Automatic container update is already being processed for this commit.', + 'auto_sync_event' => $this->publicReleaseAutoSyncEvent($event), + ]; + } + + try { + $event = $this->releaseAutoSyncEventById($eventId) ?? $event; + if (in_array((string)($event['status'] ?? ''), ['promoted', 'deployed'], true)) { + return [ + 'step_status' => 'passed', + 'message' => 'Automatic container update was already completed for this commit.', + 'auto_sync_event' => $this->publicReleaseAutoSyncEvent($event), + ]; + } + + $current = $this->currentDeploymentForChannelApp($channelId, $app); + if ($current !== null && $this->releaseGateCommitMatches((string)($current['commit_sha'] ?? ''), $commitSha)) { + $event = $this->updateReleaseAutoSyncEvent($eventId, 'promoted', [ + 'deployment_id' => (int)$current['id'], + 'metadata' => ['already_current' => true], + ]); + return [ + 'step_status' => 'passed', + 'message' => sprintf('%s is already active at %s.', strtoupper($app), substr($commitSha, 0, 12)), + 'deployment' => $this->publicDeployment($current), + 'auto_sync_event' => $this->publicReleaseAutoSyncEvent($event), + ]; + } + + $event = $this->updateReleaseAutoSyncEvent($eventId, 'syncing'); + $operation = $this->syncChannel($channelId, $actorUserId, [ + 'app' => $app, + 'source' => 'release_gate', + 'repository' => $repository, + 'branch' => $branch, + 'commit_mode' => 'specific', + 'commit_sha' => $commitSha, + 'build_url' => $gateInput['workflow_url'] ?? null, + 'workflow_url' => $gateInput['workflow_url'] ?? null, + 'gate_operation_id' => $gateOperationId, + 'auto_sync_event_id' => $eventId, + 'auto_sync_event' => $this->publicReleaseAutoSyncEvent($event), + 'require_readiness' => true, + 'wait_timeout_seconds' => $gateInput['wait_timeout_seconds'] ?? 300, + 'poll_interval_seconds' => $gateInput['poll_interval_seconds'] ?? 10, + 'build_id' => $gateInput['build_id'] ?? '', + 'shell_paths' => $gateInput['shell_paths'] ?? [], + ]); + + if ((string)($operation['status'] ?? '') !== 'passed') { + throw new RuntimeException((string)($operation['summary'] ?? 'Automatic channel sync did not pass.')); + } + + $deployment = $this->currentDeploymentForChannelApp($channelId, $app); + if ($deployment === null || !$this->releaseGateCommitMatches((string)($deployment['commit_sha'] ?? ''), $commitSha)) { + throw new RuntimeException(sprintf('%s was deployed but was not promoted as the active %s release.', strtoupper($app), (string)$channel['slug'])); + } + + $event = $this->updateReleaseAutoSyncEvent($eventId, 'promoted', [ + 'sync_operation_id' => (int)($operation['id'] ?? 0) ?: null, + 'deployment_id' => (int)$deployment['id'], + 'metadata' => [ + 'sync_operation_id' => $operation['id'] ?? null, + 'deployment_id' => $deployment['id'] ?? null, + ], + ]); + + return [ + 'step_status' => 'passed', + 'message' => sprintf('%s container was deployed and promoted at %s.', strtoupper($app), substr($commitSha, 0, 12)), + 'sync_operation' => $operation, + 'deployment' => $this->publicDeployment($deployment), + 'auto_sync_event' => $this->publicReleaseAutoSyncEvent($event), + ]; + } catch (Throwable $throwable) { + $this->updateReleaseAutoSyncEvent($eventId, 'failed', [ + 'error_message' => $throwable->getMessage(), + ]); + throw $throwable; + } finally { + $this->releaseReleaseAutoSyncLock($eventId); + } + } + + private function upsertReleaseAutoSyncEvent(array $input): array + { + $channelId = (int)$input['channel_id']; + $app = $this->normalizeApp((string)$input['app']); + $repository = self::normalizeGithubRepositoryName((string)$input['repository']); + $branch = trim((string)$input['branch']); + $commitSha = self::normalizeCommitSha((string)$input['commit_sha']); + $status = self::safeIdentifier((string)($input['status'] ?? 'pending'), 32) ?: 'pending'; + $source = self::safeIdentifier((string)($input['source'] ?? ''), 64) ?: null; + $workflowUrl = $this->nullableString($input['workflow_url'] ?? null, 512); + $gateOperationId = $this->nullablePositiveInt($input['gate_operation_id'] ?? null); + $metadata = is_array($input['metadata'] ?? null) ? $input['metadata'] : []; + + if ($channelId <= 0 || $repository === '' || $branch === '' || $commitSha === '') { + throw new RuntimeException('Automatic sync event requires channel, app, repository, branch, and commit.'); + } + + $existing = $this->releaseAutoSyncEventFor($channelId, $app, $repository, $branch, $commitSha); + if ($existing === null) { + $this->execute( + "INSERT INTO release_auto_sync_events ( + channel_id, app, repository, branch, commit_sha, status, source, + workflow_url, gate_operation_id, metadata_json, gate_passed_at + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CASE WHEN ? = 'gate_passed' THEN NOW() ELSE NULL END)", + 'isssssssiss', + [ + $channelId, + $app, + $repository, + $branch, + $commitSha, + $status, + $source, + $workflowUrl, + $gateOperationId, + self::jsonEncode(self::redactPayload($metadata)), + $status, + ] + ); + return $this->releaseAutoSyncEventById($this->insertId()) ?? []; + } + + $existingStatus = (string)($existing['status'] ?? 'pending'); + if ($status === 'pending' && !in_array($existingStatus, ['pending', 'failed'], true)) { + $status = $existingStatus; + } + if ($status === 'gate_passed' && in_array($existingStatus, ['syncing', 'promoted', 'deployed'], true)) { + $status = $existingStatus; + } + + $this->execute( + "UPDATE release_auto_sync_events + SET status = ?, + source = COALESCE(?, source), + workflow_url = COALESCE(?, workflow_url), + gate_operation_id = COALESCE(NULLIF(?, 0), gate_operation_id), + error_message = NULL, + metadata_json = ?, + gate_passed_at = CASE WHEN ? = 'gate_passed' THEN COALESCE(gate_passed_at, NOW()) ELSE gate_passed_at END, + updated_at = NOW() + WHERE id = ?", + 'sssissi', + [ + $status, + $source, + $workflowUrl, + $gateOperationId ?? 0, + self::jsonEncode(self::redactPayload($metadata)), + $status, + (int)$existing['id'], + ] + ); + + return $this->releaseAutoSyncEventById((int)$existing['id']) ?? []; + } + + private function updateReleaseAutoSyncEvent(int $id, string $status, array $input = []): array + { + $status = self::safeIdentifier($status, 32) ?: 'pending'; + $syncOperationId = $this->nullablePositiveInt($input['sync_operation_id'] ?? null); + $deploymentId = $this->nullablePositiveInt($input['deployment_id'] ?? null); + $errorMessage = isset($input['error_message']) ? substr((string)$input['error_message'], 0, 4096) : null; + $metadata = is_array($input['metadata'] ?? null) ? self::jsonEncode(self::redactPayload($input['metadata'])) : null; + $this->execute( + "UPDATE release_auto_sync_events + SET status = ?, + sync_operation_id = COALESCE(NULLIF(?, 0), sync_operation_id), + deployment_id = COALESCE(NULLIF(?, 0), deployment_id), + error_message = ?, + metadata_json = COALESCE(?, metadata_json), + synced_at = CASE WHEN ? IN ('deployed', 'promoted') THEN COALESCE(synced_at, NOW()) ELSE synced_at END, + promoted_at = CASE WHEN ? = 'promoted' THEN COALESCE(promoted_at, NOW()) ELSE promoted_at END, + failed_at = CASE WHEN ? = 'failed' THEN NOW() ELSE failed_at END, + updated_at = NOW() + WHERE id = ?", + 'siisssssi', + [$status, $syncOperationId ?? 0, $deploymentId ?? 0, $errorMessage, $metadata, $status, $status, $status, $id] + ); + + return $this->releaseAutoSyncEventById($id) ?? []; + } + + private function releaseAutoSyncEventFor(int $channelId, string $app, string $repository, string $branch, string $commitSha): ?array + { + return $this->selectOne( + "SELECT e.*, c.slug AS channel_slug, c.name AS channel_name + FROM release_auto_sync_events e + INNER JOIN release_channels c ON c.id = e.channel_id + WHERE e.channel_id = ? AND e.app = ? AND e.repository = ? AND e.branch = ? AND e.commit_sha = ? + LIMIT 1", + 'issss', + [$channelId, $app, $repository, $branch, $commitSha] + ); + } + + private function releaseAutoSyncEventById(int $id): ?array + { + return $this->selectOne( + "SELECT e.*, c.slug AS channel_slug, c.name AS channel_name + FROM release_auto_sync_events e + INNER JOIN release_channels c ON c.id = e.channel_id + WHERE e.id = ? + LIMIT 1", + 'i', + [$id] + ); + } + + private function publicReleaseAutoSyncEvent(array $event): array + { + return [ + 'id' => (int)($event['id'] ?? 0), + 'channel_id' => (int)($event['channel_id'] ?? 0), + 'channel_slug' => $event['channel_slug'] ?? null, + 'channel_name' => $event['channel_name'] ?? null, + 'app' => (string)($event['app'] ?? ''), + 'repository' => (string)($event['repository'] ?? ''), + 'branch' => (string)($event['branch'] ?? ''), + 'commit_sha' => (string)($event['commit_sha'] ?? ''), + 'status' => (string)($event['status'] ?? 'unknown'), + 'source' => $event['source'] ?? null, + 'workflow_url' => $event['workflow_url'] ?? null, + 'gate_operation_id' => isset($event['gate_operation_id']) ? (int)$event['gate_operation_id'] : null, + 'sync_operation_id' => isset($event['sync_operation_id']) ? (int)$event['sync_operation_id'] : null, + 'deployment_id' => isset($event['deployment_id']) ? (int)$event['deployment_id'] : null, + 'error_message' => $event['error_message'] ?? null, + 'metadata' => self::jsonDecode($event['metadata_json'] ?? null), + 'received_at' => $event['received_at'] ?? null, + 'gate_passed_at' => $event['gate_passed_at'] ?? null, + 'synced_at' => $event['synced_at'] ?? null, + 'promoted_at' => $event['promoted_at'] ?? null, + 'failed_at' => $event['failed_at'] ?? null, + ]; + } + + private function acquireReleaseAutoSyncLock(int $eventId): bool + { + $lockName = 'release_auto_sync:' . $eventId; + $row = $this->selectOne('SELECT GET_LOCK(?, 0) AS acquired', 's', [$lockName]); + return (int)($row['acquired'] ?? 0) === 1; + } + + private function releaseReleaseAutoSyncLock(int $eventId): void + { + try { + $this->selectOne('SELECT RELEASE_LOCK(?) AS released', 's', ['release_auto_sync:' . $eventId]); + } catch (Throwable) { + } + } + public function runIssueAction(array $input, ?int $actorUserId = null): array { $this->ensureSchema(); @@ -4111,8 +4716,17 @@ class release_manager $this->assertReleaseGatePassedForPromotion( $channelId, (string)($bundle['frontend_commit_sha'] ?? ''), - null + null, + 'frontend' ); + if (trim((string)($bundle['api_commit_sha'] ?? '')) !== '') { + $this->assertReleaseGatePassedForPromotion( + $channelId, + (string)$bundle['api_commit_sha'], + null, + 'api' + ); + } $frontendVersionId = $this->nullablePositiveInt($bundle['frontend_version_id'] ?? null); $apiVersionId = $this->nullablePositiveInt($bundle['api_version_id'] ?? null); $deploymentId = $this->nullablePositiveInt($bundle['api_deployment_id'] ?? null) @@ -4423,8 +5037,9 @@ class release_manager } $this->assertReleaseGatePassedForPromotion( $channelId, - (string)($deployment['app'] ?? '') === 'frontend' ? (string)($deployment['commit_sha'] ?? '') : '', - null + (string)($deployment['commit_sha'] ?? ''), + null, + (string)($deployment['app'] ?? '') ); $current = $this->currentChannelVersionRow($channelId); $frontendVersionId = (int)($current['frontend_version_id'] ?? 0) ?: null; @@ -4851,43 +5466,29 @@ class release_manager [$repository, $branch] ); - $deployments = []; - $operations = []; - if ($mappedChannel !== null && $mappedApp !== '') { - $operations[] = $this->syncChannel((int)$mappedChannel['id'], null, [ - 'app' => $mappedApp, - 'source' => 'github_webhook', - 'repository' => $repository, - 'commit_sha' => $commitSha, - 'build_url' => (string)($payload['compare'] ?? ''), - ]); - } - + $autoSyncEvents = []; foreach ($targets as $target) { - if ($mappedChannel !== null && $mappedApp !== '') { - continue; - } - $deployments[] = $this->startDeployment([ - 'target_id' => (int)$target['id'], + $autoSyncEvents[] = $this->publicReleaseAutoSyncEvent($this->upsertReleaseAutoSyncEvent([ 'channel_id' => (int)$target['channel_id'], 'app' => (string)$target['app'], 'repository' => $repository, 'branch' => $branch, 'commit_sha' => $commitSha, - 'version_label' => substr($commitSha, 0, 12), - 'build_url' => (string)($payload['compare'] ?? ''), + 'status' => 'pending', + 'source' => 'github_webhook', + 'workflow_url' => (string)($payload['compare'] ?? ''), 'metadata' => [ 'github_event' => $event, 'head_commit' => self::redactPayload($payload['head_commit'] ?? []), ], - ]); + ])); } $this->audit(null, null, 'github_webhook_processed', null, 'info', [ 'repository' => $repository, 'branch' => $branch, 'commit_sha' => $commitSha, - 'deployment_count' => count($deployments), + 'auto_sync_event_count' => count($autoSyncEvents), ]); return [ @@ -4897,8 +5498,9 @@ class release_manager 'commit_sha' => $commitSha, 'mapped_channel_slug' => $mappedChannelSlug, 'mapped_app' => $mappedApp !== '' ? $mappedApp : null, - 'operations' => $operations, - 'deployments' => $deployments, + 'auto_sync_events' => $autoSyncEvents, + 'operations' => [], + 'deployments' => [], ]; } @@ -7596,6 +8198,16 @@ class release_manager $commit = is_array($commitRow) ? $this->publicGithubCommit($commitRow) : []; $commitSha = trim((string)($commit['sha'] ?? (is_array($commitRow) ? ($commitRow['sha'] ?? null) : null) ?? $rawCommitSha)); $commitUrl = (string)($commit['html_url'] ?? (is_array($commitRow) ? ($commitRow['html_url'] ?? null) : null) ?? $commitUrl); + if ($latestCommitSha !== '' && $commitSha !== '' && $commitSha !== $latestCommitSha) { + $comparison = $this->githubRequest( + 'GET', + '/repos/' . $this->githubRepositoryPath($repository) . '/compare/' . rawurlencode($commitSha) . '...' . rawurlencode($latestCommitSha) + ); + $comparisonStatus = (string)($comparison['status'] ?? ''); + if (!in_array($comparisonStatus, ['behind', 'identical'], true)) { + throw new RuntimeException(sprintf('Commit %s is not reachable from branch %s.', $commitSha, $branch)); + } + } } return [ diff --git a/services/nginx/app/classes/release_manager_schema_bootstrap.php b/services/nginx/app/classes/release_manager_schema_bootstrap.php index ff88e850..a3243adb 100644 --- a/services/nginx/app/classes/release_manager_schema_bootstrap.php +++ b/services/nginx/app/classes/release_manager_schema_bootstrap.php @@ -118,6 +118,35 @@ class release_manager_schema_bootstrap INDEX idx_release_targets_coolify (coolify_instance_id, coolify_service_uuid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", + "CREATE TABLE IF NOT EXISTS release_auto_sync_events ( + id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, + channel_id BIGINT UNSIGNED NOT NULL, + app VARCHAR(16) NOT NULL, + repository VARCHAR(255) NOT NULL, + branch VARCHAR(128) NOT NULL, + commit_sha VARCHAR(64) NOT NULL, + status VARCHAR(32) NOT NULL DEFAULT 'pending', + source VARCHAR(64) NULL, + workflow_url VARCHAR(512) NULL, + gate_operation_id BIGINT UNSIGNED NULL, + sync_operation_id BIGINT UNSIGNED NULL, + deployment_id BIGINT UNSIGNED NULL, + error_message TEXT NULL, + metadata_json LONGTEXT NULL, + received_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + gate_passed_at DATETIME NULL, + synced_at DATETIME NULL, + promoted_at DATETIME NULL, + failed_at DATETIME NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + UNIQUE KEY uq_release_auto_sync_event (channel_id, app, repository, branch, commit_sha), + INDEX idx_release_auto_sync_channel_status (channel_id, status, updated_at), + INDEX idx_release_auto_sync_gate (gate_operation_id), + INDEX idx_release_auto_sync_sync (sync_operation_id), + INDEX idx_release_auto_sync_deployment (deployment_id) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", + "CREATE TABLE IF NOT EXISTS release_service_sets ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, channel_id BIGINT UNSIGNED NULL, @@ -408,6 +437,7 @@ class release_manager_schema_bootstrap 'release_versions', 'release_channel_versions', 'release_assignments', + 'release_auto_sync_events', 'release_service_sets', 'release_deployments', 'release_bundles', diff --git a/services/nginx/app/classes/selfserve_schema_bootstrap.php b/services/nginx/app/classes/selfserve_schema_bootstrap.php index 8f632ec4..d67b4f41 100644 --- a/services/nginx/app/classes/selfserve_schema_bootstrap.php +++ b/services/nginx/app/classes/selfserve_schema_bootstrap.php @@ -139,6 +139,28 @@ class selfserve_schema_bootstrap UNIQUE KEY uniq_selfserve_vhw_department (department_id), INDEX idx_selfserve_vhw_dept_updated (department_id, updated_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", + + "CREATE TABLE IF NOT EXISTS department_selfserve_path_confirmations ( + id INT AUTO_INCREMENT PRIMARY KEY, + department_id INT NOT NULL, + lane_id INT NULL, + vehicle_type_id INT NULL, + config_version_id INT NULL, + config_source VARCHAR(32) NOT NULL DEFAULT 'draft', + path_signature VARCHAR(128) NOT NULL, + result_signature VARCHAR(128) NOT NULL, + answers_json JSON NOT NULL, + result_json JSON NOT NULL, + scope_json JSON NULL, + confirmed_by INT NULL, + confirmed_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + stale_reason VARCHAR(255) NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + deleted_at TIMESTAMP NULL DEFAULT NULL, + INDEX idx_selfserve_path_conf_department_scope (department_id, lane_id, vehicle_type_id, config_version_id), + INDEX idx_selfserve_path_conf_signature (department_id, config_version_id, path_signature) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", ]; foreach ($queries as $sql) { diff --git a/services/nginx/app/modules/selfserve/classes/selfserve_studio_graph.php b/services/nginx/app/modules/selfserve/classes/selfserve_studio_graph.php index 935605fa..ae64b78c 100644 --- a/services/nginx/app/modules/selfserve/classes/selfserve_studio_graph.php +++ b/services/nginx/app/modules/selfserve/classes/selfserve_studio_graph.php @@ -41,6 +41,7 @@ use classes\edge_gateway_view_service; use classes\selfserve_schema_bootstrap; use modules\selfserve\classes\selfserve_studio_actions; use modules\selfserve\helpers\selfserve_task_gate_type; +use objects\department_selfserve_tasks_o; use objects\selfserve_config_versions_o; class selfserve_studio_graph @@ -110,6 +111,7 @@ class selfserve_studio_graph 'department_id' => $departmentId, 'layout_affects_runtime' => false, 'generated_at' => date('c'), + 'path_editor' => is_array($config['v2_meta']['path_editor'] ?? null) ? (array)$config['v2_meta']['path_editor'] : ['paths' => []], ], ]; } @@ -695,6 +697,7 @@ class selfserve_studio_graph $pathSampleLimit = $this->pathLimit($payload['path_sample_limit'] ?? null); $paths = []; $scenarioCount = max(1, count($vehicleTypeIds)); + $confirmationRows = $this->loadPathConfirmationRows($departmentId, $versionId, $laneId, $vehicleTypeId, $configSource); foreach ($vehicleTypeIds as $scenarioIndex => $scenarioVehicleTypeId) { $remainingStates = $maxStates === null ? null : $maxStates - $stateCount; @@ -829,10 +832,12 @@ class selfserve_studio_graph 'terminal_path_count' => $terminalPathCount + (int)($projection['summary']['terminal_path_count'] ?? 0), 'scenario_index' => $scenarioIndex + 1, 'scenario_count' => $scenarioCount, - ] + ], + $confirmationRows ); $progressCallback($partialPayload); }, + 'confirmation_rows' => $confirmationRows, ]; if ($remainingStates === null) { unset($projectionOptions['max_states']); @@ -901,7 +906,8 @@ class selfserve_studio_graph 'terminal_path_count' => $terminalPathCount, 'scenario_index' => $scenarioCount, 'scenario_count' => $scenarioCount, - ] + ], + $confirmationRows ); } @@ -918,6 +924,7 @@ class selfserve_studio_graph $progressCallback = is_callable($options['progress_callback'] ?? null) ? $options['progress_callback'] : null; $progressIntervalStates = max(1, (int)($options['progress_interval_states'] ?? 128)); $scope = is_array($options['scope'] ?? null) ? (array)$options['scope'] : []; + $confirmationRows = is_array($options['confirmation_rows'] ?? null) ? (array)$options['confirmation_rows'] : []; $stack = [[ 'answers' => [], 'chain' => [], @@ -980,7 +987,8 @@ class selfserve_studio_graph $stateCount, $terminalPathCount, $questionIds, - count($stack) + count($stack), + $confirmationRows )); } continue; @@ -1003,7 +1011,8 @@ class selfserve_studio_graph $stateCount, $terminalPathCount, $questionIds, - count($stack) + count($stack), + $confirmationRows )); } } @@ -1017,10 +1026,166 @@ class selfserve_studio_graph $stateCount, $terminalPathCount, $questionIds, - count($stack) + count($stack), + $confirmationRows ); } + /** + * @param array $payload + * @return array + */ + public function confirmPathOutcome(int $departmentId, array $payload, ?int $userId): array + { + $pathSignature = trim((string)($payload['path_signature'] ?? '')); + $resultSignature = trim((string)($payload['result_signature'] ?? '')); + if ($pathSignature === '' || $resultSignature === '') { + throw new \RuntimeException('path_signature and result_signature are required.'); + } + + $scope = is_array($payload['scope'] ?? null) ? (array)$payload['scope'] : []; + $laneId = $this->nullableInt($payload['lane_id'] ?? $scope['lane_id'] ?? null); + $vehicleTypeId = $this->nullableInt($payload['vehicle_type_id'] ?? $scope['vehicle_type_id'] ?? null); + $configVersionId = $this->nullableInt($payload['config_version_id'] ?? $scope['config_version_id'] ?? null); + $configSource = strtolower(trim((string)($payload['config_source'] ?? $scope['config_source'] ?? 'draft'))); + if ($configSource === '') { + $configSource = 'draft'; + } + $answers = is_array($payload['answers'] ?? null) ? array_values((array)$payload['answers']) : []; + $result = is_array($payload['result'] ?? null) ? (array)$payload['result'] : []; + + $answersJson = json_encode($this->sortStableValue($answers), JSON_UNESCAPED_UNICODE); + $resultJson = json_encode($this->sortStableValue($result), JSON_UNESCAPED_UNICODE); + $scopeJson = json_encode($this->sortStableValue($scope), JSON_UNESCAPED_UNICODE); + if ($answersJson === false || $resultJson === false || $scopeJson === false) { + throw new \RuntimeException('Could not encode path confirmation payload.'); + } + + $pdo = db::getPDO(); + $select = $pdo->prepare( + "SELECT id + FROM department_selfserve_path_confirmations + WHERE department_id = :department_id + AND path_signature = :path_signature + AND " . ($configVersionId === null ? "config_version_id IS NULL" : "config_version_id = :config_version_id") . " + AND deleted_at IS NULL + ORDER BY id DESC + LIMIT 1" + ); + $selectParams = [ + ':department_id' => $departmentId, + ':path_signature' => $pathSignature, + ]; + if ($configVersionId !== null) { + $selectParams[':config_version_id'] = $configVersionId; + } + $select->execute($selectParams); + $row = $select->fetch(\PDO::FETCH_ASSOC); + + if (is_array($row) && (int)($row['id'] ?? 0) > 0) { + $update = $pdo->prepare( + "UPDATE department_selfserve_path_confirmations + SET lane_id = :lane_id, + vehicle_type_id = :vehicle_type_id, + config_source = :config_source, + result_signature = :result_signature, + answers_json = :answers_json, + result_json = :result_json, + scope_json = :scope_json, + confirmed_by = :confirmed_by, + confirmed_at = NOW(), + stale_reason = NULL, + deleted_at = NULL + WHERE id = :id" + ); + $update->execute([ + ':lane_id' => $laneId, + ':vehicle_type_id' => $vehicleTypeId, + ':config_source' => $configSource, + ':result_signature' => $resultSignature, + ':answers_json' => $answersJson, + ':result_json' => $resultJson, + ':scope_json' => $scopeJson, + ':confirmed_by' => $userId, + ':id' => (int)$row['id'], + ]); + $id = (int)$row['id']; + } else { + $insert = $pdo->prepare( + "INSERT INTO department_selfserve_path_confirmations + (department_id, lane_id, vehicle_type_id, config_version_id, config_source, path_signature, result_signature, answers_json, result_json, scope_json, confirmed_by, confirmed_at) + VALUES + (:department_id, :lane_id, :vehicle_type_id, :config_version_id, :config_source, :path_signature, :result_signature, :answers_json, :result_json, :scope_json, :confirmed_by, NOW())" + ); + $insert->execute([ + ':department_id' => $departmentId, + ':lane_id' => $laneId, + ':vehicle_type_id' => $vehicleTypeId, + ':config_version_id' => $configVersionId, + ':config_source' => $configSource, + ':path_signature' => $pathSignature, + ':result_signature' => $resultSignature, + ':answers_json' => $answersJson, + ':result_json' => $resultJson, + ':scope_json' => $scopeJson, + ':confirmed_by' => $userId, + ]); + $id = (int)$pdo->lastInsertId(); + } + + return [ + 'id' => $id, + 'department_id' => $departmentId, + 'lane_id' => $laneId, + 'vehicle_type_id' => $vehicleTypeId, + 'config_version_id' => $configVersionId, + 'config_source' => $configSource, + 'path_signature' => $pathSignature, + 'result_signature' => $resultSignature, + 'answers' => $answers, + 'result' => $result, + 'scope' => $scope, + 'confirmation_status' => 'confirmed', + ]; + } + + /** + * @param array $payload + * @return array + */ + public function resetPathConfirmation(int $departmentId, array $payload): array + { + $pathSignature = trim((string)($payload['path_signature'] ?? '')); + if ($pathSignature === '') { + throw new \RuntimeException('path_signature is required.'); + } + $scope = is_array($payload['scope'] ?? null) ? (array)$payload['scope'] : []; + $configVersionId = $this->nullableInt($payload['config_version_id'] ?? $scope['config_version_id'] ?? null); + $pdo = db::getPDO(); + $statement = $pdo->prepare( + "UPDATE department_selfserve_path_confirmations + SET deleted_at = NOW() + WHERE department_id = :department_id + AND path_signature = :path_signature + AND " . ($configVersionId === null ? "config_version_id IS NULL" : "config_version_id = :config_version_id") . " + AND deleted_at IS NULL" + ); + $params = [ + ':department_id' => $departmentId, + ':path_signature' => $pathSignature, + ]; + if ($configVersionId !== null) { + $params[':config_version_id'] = $configVersionId; + } + $statement->execute($params); + + return [ + 'path_signature' => $pathSignature, + 'reset' => true, + 'affected' => $statement->rowCount(), + ]; + } + /** * @param array $payload * @return array @@ -1530,6 +1695,10 @@ class selfserve_studio_graph $this->applyConfigReorder($config, $entity, (array)($operation['items'] ?? [])); return; } + if ($action === 'upsert_path' || ($entity === 'path' && $action === 'upsert')) { + $this->upsertConfigPath($departmentId, $config, $data); + return; + } if ($entity === '') { throw new \RuntimeException('Studio graph operation is missing entity.'); } @@ -1560,6 +1729,555 @@ class selfserve_studio_graph throw new \RuntimeException('Unsupported studio graph operation: ' . $action); } + /** + * @param array $config + * @param array $data + */ + private function upsertConfigPath(int $departmentId, array &$config, array $data): void + { + $scope = $this->normalizePathEditorScope($departmentId, is_array($data['scope'] ?? null) ? (array)$data['scope'] : $data); + $answers = $this->normalizePathEditorAnswers($data['answers'] ?? []); + if ($answers === []) { + throw new \RuntimeException('Path editor operation requires at least one answer.'); + } + $this->assertPathEditorQuestionsExist($config, $answers); + + $result = $this->normalizePathEditorResult(is_array($data['result'] ?? null) ? (array)$data['result'] : $data); + $previousPathKey = trim((string)($data['previous_path_key'] ?? '')); + $pathKey = trim((string)($data['path_key'] ?? '')); + if ($pathKey === '') { + $pathKey = $previousPathKey !== '' ? $previousPathKey : $this->pathEditorPathKey($scope, $answers); + } + + if (!isset($config['v2_meta']) || !is_array($config['v2_meta'])) { + $config['v2_meta'] = []; + } + if (!isset($config['v2_meta']['path_editor']) || !is_array($config['v2_meta']['path_editor'])) { + $config['v2_meta']['path_editor'] = []; + } + if (!isset($config['v2_meta']['path_editor']['paths']) || !is_array($config['v2_meta']['path_editor']['paths'])) { + $config['v2_meta']['path_editor']['paths'] = []; + } + if ($previousPathKey !== '' && $previousPathKey !== $pathKey && isset($config['v2_meta']['path_editor']['paths'][$previousPathKey])) { + $config['v2_meta']['path_editor']['paths'][$pathKey] = $config['v2_meta']['path_editor']['paths'][$previousPathKey]; + unset($config['v2_meta']['path_editor']['paths'][$previousPathKey]); + } + + $paths = &$config['v2_meta']['path_editor']['paths']; + $existing = is_array($paths[$pathKey] ?? null) ? (array)$paths[$pathKey] : []; + $conditionId = $this->nullableInt($existing['condition_id'] ?? $data['condition_id'] ?? $data['existing_condition_id'] ?? null); + $existingTaskIds = $this->pathEditorExistingTaskIds($existing, $data); + $conditionId = $this->upsertPathEditorCondition($departmentId, $config, $pathKey, $scope, $answers, $result, $conditionId); + + $taskIds = []; + if ((bool)$result['machine_allowed']) { + $baseOrderPriority = $this->pathEditorTaskBaseOrderPriority($config, $existingTaskIds); + foreach (array_values((array)($result['tasks'] ?? [])) as $index => $taskResult) { + if (!is_array($taskResult)) { + continue; + } + $taskIds[] = $this->upsertPathEditorTask( + $departmentId, + $config, + $pathKey, + $scope, + $taskResult, + $conditionId, + $existingTaskIds[$index] ?? null, + $baseOrderPriority + ($index * 10) + ); + } + foreach (array_slice($existingTaskIds, count($taskIds)) as $staleTaskId) { + $this->deleteConfigEntity($config, 'task', $staleTaskId); + } + } else { + foreach ($existingTaskIds as $staleTaskId) { + $this->deleteConfigEntity($config, 'task', $staleTaskId); + } + } + + $taskId = $taskIds[0] ?? null; + $pathSignature = $this->pathSignature($scope, $answers); + $resultSignature = $this->pathEditorResultSignature($result, $taskIds); + $paths[$pathKey] = [ + 'path_key' => $pathKey, + 'condition_id' => $conditionId, + 'task_id' => $taskId, + 'task_ids' => $taskIds, + 'scope' => $scope, + 'answers' => $answers, + 'result' => $result, + 'path_signature' => $pathSignature, + 'result_signature' => $resultSignature, + 'updated_at' => date('c'), + ]; + unset($paths); + } + + /** + * @param array $scope + * @return array + */ + private function normalizePathEditorScope(int $departmentId, array $scope): array + { + return [ + 'department_id' => $departmentId, + 'lane_id' => $this->nullableInt($scope['lane_id'] ?? $scope['lane'] ?? null), + 'vehicle_type_id' => $this->nullableInt($scope['vehicle_type_id'] ?? $scope['product'] ?? $scope['product_id'] ?? null), + 'machine_type_id' => $this->nullableInt($scope['machine_type_id'] ?? null), + 'config_source' => strtolower(trim((string)($scope['config_source'] ?? 'draft'))) ?: 'draft', + 'hardware_mode' => strtolower(trim((string)($scope['hardware_mode'] ?? 'studio'))) ?: 'studio', + ]; + } + + /** + * @return array + */ + private function normalizePathEditorAnswers(mixed $answers): array + { + $rows = []; + if (!is_array($answers)) { + return $rows; + } + + foreach ($answers as $key => $entry) { + if (is_array($entry)) { + $questionId = (int)($entry['question_id'] ?? $entry['id'] ?? $key); + $rawValue = $entry['value'] ?? $entry['answer'] ?? null; + } else { + $questionId = (int)$key; + $rawValue = $entry; + } + if ($questionId <= 0) { + continue; + } + $value = filter_var($rawValue, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); + if ($value === null) { + continue; + } + $rows[] = [ + 'question_id' => $questionId, + 'value' => (bool)$value, + 'answer' => (bool)$value, + 'answer_label' => (bool)$value ? 'Yes' : 'No', + ]; + } + + return $rows; + } + + /** + * @param array $config + * @param array $answers + */ + private function assertPathEditorQuestionsExist(array $config, array $answers): void + { + $questionIds = []; + foreach ((array)($config['questions'] ?? []) as $question) { + if (is_array($question)) { + $questionIds[(int)($question['id'] ?? 0)] = true; + } + } + foreach ($answers as $answer) { + $questionId = (int)($answer['question_id'] ?? 0); + if ($questionId > 0 && !isset($questionIds[$questionId])) { + throw new \RuntimeException('Path editor answer references unknown question ' . $questionId . '.'); + } + } + } + + /** + * @param array $result + * @return array + */ + private function normalizePathEditorResult(array $result): array + { + $machineAllowed = filter_var($result['machine_allowed'] ?? $result['allowed'] ?? true, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); + $machineAllowed = $machineAllowed !== false; + $services = $machineAllowed ? $this->normalizeServiceList($result['services'] ?? ['MACHINE']) : $this->normalizeServiceList($result['services'] ?? []); + if ($machineAllowed && !in_array('MACHINE', $services, true)) { + $services[] = 'MACHINE'; + sort($services); + } + + try { + $buttons = department_selfserve_tasks_o::normalizeButtonsInput($result['buttons'] ?? []); + } catch (\Throwable $exception) { + throw new \RuntimeException('Invalid path editor buttons: ' . $exception->getMessage()); + } + + $dynamicImagesVehicleType = $this->nullableInt($result['dynamic_images_vehicle_type'] ?? null); + $hasTaskList = array_key_exists('tasks', $result) && is_array($result['tasks']); + $tasks = []; + if ($machineAllowed) { + if ($hasTaskList) { + foreach (array_values((array)$result['tasks']) as $index => $task) { + if (!is_array($task)) { + continue; + } + $tasks[] = $this->normalizePathEditorTaskResult((array)$task, $services, $index); + } + } else { + $tasks[] = $this->normalizePathEditorTaskResult([ + 'task' => $result['task'] ?? $result['task_text'] ?? 'Start machine', + 'description' => $result['description'] ?? '', + 'services' => $services, + 'buttons' => $buttons, + 'dynamic_images_vehicle_type' => $dynamicImagesVehicleType, + ], $services, 0); + } + } + + if ($hasTaskList) { + $buttons = $this->flattenPathEditorTaskButtons($tasks); + $services = $this->mergePathEditorTaskServices($services, $tasks, $machineAllowed); + if ($dynamicImagesVehicleType === null) { + foreach ($tasks as $task) { + $dynamicImagesVehicleType = $this->nullableInt($task['dynamic_images_vehicle_type'] ?? null); + if ($dynamicImagesVehicleType !== null) { + break; + } + } + } + } + + return [ + 'machine_allowed' => $machineAllowed, + 'task' => trim((string)($result['task'] ?? $result['task_text'] ?? 'Start machine')) ?: 'Start machine', + 'description' => trim((string)($result['description'] ?? '')), + 'services' => $services, + 'buttons' => $buttons, + 'dynamic_images_vehicle_type' => $dynamicImagesVehicleType, + 'tasks' => $tasks, + 'condition_name' => trim((string)($result['condition_name'] ?? '')), + ]; + } + + /** + * @param array $task + * @param array $fallbackServices + * @return array + */ + private function normalizePathEditorTaskResult(array $task, array $fallbackServices, int $index): array + { + try { + $buttons = department_selfserve_tasks_o::normalizeButtonsInput($task['buttons'] ?? []); + } catch (\Throwable $exception) { + throw new \RuntimeException('Invalid path editor task buttons: ' . $exception->getMessage()); + } + + $services = $this->normalizeServiceList($task['services'] ?? $fallbackServices); + if (!in_array('MACHINE', $services, true)) { + $services[] = 'MACHINE'; + } + + $dynamicImagesVehicleType = $this->nullableInt($task['dynamic_images_vehicle_type'] ?? null); + if (($dynamicImagesVehicleType !== null || in_array('program_picker', $buttons, true)) && !in_array('PROGRAM_PICKER', $services, true)) { + $services[] = 'PROGRAM_PICKER'; + } + sort($services); + + return [ + 'task' => trim((string)($task['task'] ?? $task['label'] ?? ('Task ' . ($index + 1)))) ?: ('Task ' . ($index + 1)), + 'description' => trim((string)($task['description'] ?? '')), + 'services' => $services, + 'buttons' => $buttons, + 'dynamic_images_vehicle_type' => $dynamicImagesVehicleType, + ]; + } + + /** + * @param array> $tasks + * @return array + */ + private function flattenPathEditorTaskButtons(array $tasks): array + { + $buttons = []; + foreach ($tasks as $task) { + if (!is_array($task)) { + continue; + } + foreach ($this->normalizeArrayPayload($task['buttons'] ?? []) as $button) { + $buttons[] = $button; + } + } + + return department_selfserve_tasks_o::normalizeButtonsInput($buttons); + } + + /** + * @param array $services + * @param array> $tasks + * @return array + */ + private function mergePathEditorTaskServices(array $services, array $tasks, bool $machineAllowed): array + { + $merged = []; + foreach ($this->normalizeServiceList($services) as $service) { + $merged[$service] = true; + } + foreach ($tasks as $task) { + if (!is_array($task)) { + continue; + } + foreach ($this->normalizeServiceList($task['services'] ?? []) as $service) { + $merged[$service] = true; + } + } + if ($machineAllowed) { + $merged['MACHINE'] = true; + } + + $values = array_keys($merged); + sort($values); + return $values; + } + + /** + * @param array $scope + * @param array> $answers + */ + private function pathEditorPathKey(array $scope, array $answers): string + { + return 'path_' . substr(hash('sha256', $this->stableJson([ + 'scope' => $scope, + 'answers' => $answers, + ])), 0, 16); + } + + /** + * @param array $config + * @param array $scope + * @param array> $answers + * @param array $result + */ + private function upsertPathEditorCondition(int $departmentId, array &$config, string $pathKey, array $scope, array $answers, array $result, ?int $conditionId): int + { + if ($conditionId === null || $this->configRowIndex((array)($config['conditions'] ?? []), $conditionId) === null) { + $conditionId = $this->allocateConfigId($config, 'condition'); + $rows = &$this->configRows($config, 'condition'); + $rows[] = [ + 'id' => $conditionId, + 'department' => $departmentId, + 'lane' => 0, + 'product' => 0, + 'machine_type_id' => null, + 'condition_id' => null, + 'name' => 'Generated path condition', + 'description' => '', + 'expression' => $this->emptyV2Expression(), + ]; + unset($rows); + } + + $name = trim((string)($result['condition_name'] ?? '')); + if ($name === '') { + $name = 'Path: ' . $this->pathEditorAnswerSummary($answers); + } + $rows = &$this->configRows($config, 'condition'); + $index = $this->configRowIndex($rows, $conditionId); + if ($index === null) { + throw new \RuntimeException('Generated path condition could not be created.'); + } + $rows[$index] = $this->mergeConfigEntityData('condition', $rows[$index], [ + 'department' => $departmentId, + 'lane' => $scope['lane_id'] ?? 0, + 'product' => $scope['vehicle_type_id'] ?? 0, + 'machine_type_id' => $scope['machine_type_id'] ?? null, + 'name' => $name, + 'description' => 'Generated by Path Editor for ' . $this->pathEditorAnswerSummary($answers), + 'expression' => $this->pathEditorConditionExpression($answers), + ]); + $rows[$index]['generated_by'] = 'path_editor'; + $rows[$index]['path_key'] = $pathKey; + unset($rows); + + return $conditionId; + } + + /** + * @param array $config + * @param array $scope + * @param array $result + */ + private function upsertPathEditorTask(int $departmentId, array &$config, string $pathKey, array $scope, array $result, int $conditionId, ?int $taskId, int $orderPriority): int + { + if ($taskId === null || $this->configRowIndex((array)($config['tasks'] ?? []), $taskId) === null) { + $taskId = $this->allocateConfigId($config, 'task'); + $rows = &$this->configRows($config, 'task'); + $rows[] = [ + 'id' => $taskId, + 'department' => $departmentId, + 'lane' => 0, + 'product' => 0, + 'machine_type_id' => null, + 'condition_id' => null, + 'gate_type' => selfserve_task_gate_type::CONDITION->value, + 'gate_ref_id' => $conditionId, + 'task' => 'Start machine', + 'description' => '', + 'order_priority' => $orderPriority, + 'services' => [], + 'buttons' => [], + 'dynamic_images_vehicle_type' => null, + ]; + unset($rows); + } + + $rows = &$this->configRows($config, 'task'); + $index = $this->configRowIndex($rows, $taskId); + if ($index === null) { + throw new \RuntimeException('Generated path task could not be created.'); + } + $rows[$index] = $this->mergeConfigEntityData('task', $rows[$index], [ + 'department' => $departmentId, + 'lane' => $scope['lane_id'] ?? 0, + 'product' => $scope['vehicle_type_id'] ?? 0, + 'machine_type_id' => $scope['machine_type_id'] ?? null, + 'condition_id' => $conditionId, + 'gate_type' => selfserve_task_gate_type::CONDITION->value, + 'gate_ref_id' => $conditionId, + 'task' => $result['task'], + 'description' => $result['description'], + 'order_priority' => $orderPriority, + 'services' => $result['services'], + 'buttons' => $result['buttons'], + 'dynamic_images_vehicle_type' => $result['dynamic_images_vehicle_type'], + ]); + $rows[$index]['condition_id'] = $conditionId; + $rows[$index]['generated_by'] = 'path_editor'; + $rows[$index]['path_key'] = $pathKey; + unset($rows); + + return $taskId; + } + + /** + * @param array $existing + * @param array $data + * @return array + */ + private function pathEditorExistingTaskIds(array $existing, array $data): array + { + $ids = []; + foreach ([$existing['task_ids'] ?? null, $data['task_ids'] ?? null] as $taskIds) { + if (!is_array($taskIds)) { + continue; + } + foreach ($taskIds as $taskId) { + $normalizedTaskId = $this->nullableInt($taskId); + if ($normalizedTaskId !== null) { + $ids[] = $normalizedTaskId; + } + } + } + + foreach ([ + $existing['task_id'] ?? null, + $data['task_id'] ?? null, + $data['existing_task_id'] ?? null, + ] as $taskId) { + $normalizedTaskId = $this->nullableInt($taskId); + if ($normalizedTaskId !== null) { + $ids[] = $normalizedTaskId; + } + } + + return array_values(array_unique(array_filter($ids, static fn(int $taskId): bool => $taskId > 0))); + } + + /** + * @param array $config + * @param array $taskIds + */ + private function pathEditorTaskBaseOrderPriority(array $config, array $taskIds): int + { + $taskRows = (array)($config['tasks'] ?? []); + foreach ($taskIds as $taskId) { + $index = $this->configRowIndex($taskRows, $taskId); + if ($index !== null && is_array($taskRows[$index] ?? null)) { + return (int)($taskRows[$index]['order_priority'] ?? 0); + } + } + + return $this->nextOrderPriority($taskRows); + } + + /** + * @param array> $answers + * @return array + */ + private function pathEditorConditionExpression(array $answers): array + { + return [ + 'type' => 'group', + 'operator' => 'ALL', + 'children' => array_values(array_map(static fn(array $answer): array => [ + 'type' => 'predicate', + 'subject_type' => 'question', + 'subject_id' => (int)($answer['question_id'] ?? 0), + 'operator' => ((bool)($answer['value'] ?? $answer['answer'] ?? false)) ? 'IS_TRUE' : 'IS_FALSE', + ], $answers)), + ]; + } + + /** + * @param array> $answers + */ + private function pathEditorAnswerSummary(array $answers): string + { + $parts = []; + foreach ($answers as $answer) { + $parts[] = 'Q' . (int)($answer['question_id'] ?? 0) . '=' . (((bool)($answer['value'] ?? $answer['answer'] ?? false)) ? 'Yes' : 'No'); + } + return implode(', ', $parts) ?: 'answers'; + } + + /** + * @param array $scope + * @param array> $answers + */ + private function pathSignature(array $scope, array $answers): string + { + return hash('sha256', $this->stableJson([ + 'scope' => $this->pathScopeKey($scope), + 'answers' => array_values(array_map(static fn(array $answer): array => [ + 'question_id' => (int)($answer['question_id'] ?? 0), + 'answer' => (bool)($answer['answer'] ?? $answer['value'] ?? false), + ], $answers)), + ])); + } + + /** + * @param array $result + */ + private function pathEditorResultSignature(array $result, array $taskIds): string + { + $tasks = []; + if ((bool)($result['machine_allowed'] ?? false)) { + foreach (array_values((array)($result['tasks'] ?? [])) as $index => $task) { + if (!is_array($task)) { + continue; + } + $tasks[] = [ + 'id' => (int)($taskIds[$index] ?? 0), + 'label' => (string)($task['task'] ?? $task['label'] ?? ''), + 'services' => $this->normalizeServiceList($task['services'] ?? []), + 'buttons' => $this->normalizeArrayPayload($task['buttons'] ?? []), + 'dynamic_images_vehicle_type' => $this->nullableInt($task['dynamic_images_vehicle_type'] ?? null), + ]; + } + } + + return hash('sha256', $this->stableJson([ + 'allowed' => (bool)($result['machine_allowed'] ?? false), + 'services' => $this->normalizeServiceList($result['services'] ?? []), + 'tasks' => $tasks, + 'buttons' => $this->normalizeArrayPayload($result['buttons'] ?? []), + 'signals' => [], + ])); + } + /** * @param array $config * @param array $data @@ -3548,7 +4266,8 @@ class selfserve_studio_graph int $stateCount, int $terminalPathCount, array $questionIds, - int $pendingStateCount + int $pendingStateCount, + array $confirmationRows = [] ): array { $warnings = []; if ($truncated && $maxStates !== null) { @@ -3575,7 +4294,8 @@ class selfserve_studio_graph 'state_count' => $stateCount, 'pending_state_count' => $pendingStateCount, 'terminal_path_count' => $terminalPathCount, - ] + ], + $confirmationRows ); } @@ -3598,7 +4318,8 @@ class selfserve_studio_graph int $stateCount, int $terminalPathCount, array $questionIds, - array $progress = [] + array $progress = [], + array $confirmationRows = [] ): array { usort($outcomes, static fn(array $left, array $right): int => ((int)($right['path_count'] ?? 0) <=> (int)($left['path_count'] ?? 0)) ?: strcmp((string)($left['summary'] ?? ''), (string)($right['summary'] ?? ''))); @@ -3612,6 +4333,8 @@ class selfserve_studio_graph } unset($path); + $confirmations = $this->applyPathConfirmations($paths, $confirmationRows); + $questionIdValues = []; foreach ($questionIds as $key => $value) { $questionIdValues[] = $value === true ? (int)$key : (int)$value; @@ -3637,15 +4360,103 @@ class selfserve_studio_graph 'question_ids' => $questionIdValues, 'max_states' => $maxStates, 'path_sample_count' => count($paths), + 'confirmations' => $confirmations['summary'], ], 'outcomes' => array_values($outcomes), 'paths' => array_values($paths), + 'confirmations' => $confirmations, 'warnings' => array_values(array_unique($warnings)), 'truncated' => $truncated, 'progress' => $progress, ]; } + /** + * @param array> $paths + * @param array> $confirmationRows + * @return array{summary:array,removed:array>} + */ + private function applyPathConfirmations(array &$paths, array $confirmationRows): array + { + $rowsBySignature = []; + foreach ($confirmationRows as $row) { + if (!is_array($row)) { + continue; + } + $signature = trim((string)($row['path_signature'] ?? '')); + if ($signature !== '') { + $rowsBySignature[$signature] = $row; + } + } + + $matched = []; + $summary = [ + 'confirmed' => 0, + 'unconfirmed' => 0, + 'stale' => 0, + 'removed' => 0, + 'total' => count($paths), + ]; + + foreach ($paths as &$path) { + if (!is_array($path)) { + continue; + } + $pathSignature = $this->pathSignature( + is_array($path['scope'] ?? null) ? (array)$path['scope'] : [], + is_array($path['answers'] ?? null) ? (array)$path['answers'] : [] + ); + $resultSignature = $this->pathResultSignature($path); + $path['path_signature'] = $pathSignature; + $path['result_signature'] = $resultSignature; + $path['confirmation_status'] = 'unconfirmed'; + $path['confirmed_at'] = null; + $path['confirmed_by'] = null; + $path['stale_reason'] = null; + + $row = $rowsBySignature[$pathSignature] ?? null; + if (is_array($row)) { + $matched[$pathSignature] = true; + $path['confirmed_at'] = $row['confirmed_at'] ?? null; + $path['confirmed_by'] = $row['confirmed_by'] ?? null; + if ((string)($row['result_signature'] ?? '') === $resultSignature) { + $path['confirmation_status'] = 'confirmed'; + } else { + $path['confirmation_status'] = 'stale'; + $path['stale_reason'] = 'Result changed since confirmation.'; + } + } + + $summary[(string)$path['confirmation_status']]++; + } + unset($path); + + $removed = []; + foreach ($rowsBySignature as $signature => $row) { + if (isset($matched[$signature])) { + continue; + } + $removed[] = [ + 'id' => $row['id'] ?? null, + 'path_signature' => $signature, + 'result_signature' => (string)($row['result_signature'] ?? ''), + 'confirmation_status' => 'stale', + 'stale_reason' => 'Path no longer appears in the projected cases.', + 'answers' => is_array($row['answers'] ?? null) ? $row['answers'] : [], + 'result' => is_array($row['result'] ?? null) ? $row['result'] : [], + 'scope' => is_array($row['scope'] ?? null) ? $row['scope'] : [], + 'confirmed_at' => $row['confirmed_at'] ?? null, + 'confirmed_by' => $row['confirmed_by'] ?? null, + ]; + } + $summary['removed'] = count($removed); + + return [ + 'summary' => $summary, + 'removed' => $removed, + ]; + } + /** * @param array> $groups * @param array $simulation @@ -3905,11 +4716,117 @@ class selfserve_studio_graph 'department_id' => $scope['department_id'] ?? null, 'lane_id' => $scope['lane_id'] ?? null, 'vehicle_type_id' => $scope['vehicle_type_id'] ?? null, + 'machine_type_id' => $scope['machine_type_id'] ?? null, 'config_source' => $scope['config_source'] ?? null, + 'config_version_id' => $scope['config_version_id'] ?? null, 'hardware_mode' => $scope['hardware_mode'] ?? null, ]; } + /** + * @param array $path + */ + private function pathResultSignature(array $path): string + { + return hash('sha256', $this->stableJson([ + 'allowed' => (bool)($path['allowed'] ?? false), + 'services' => $this->normalizeServiceList($path['services'] ?? []), + 'tasks' => array_values(array_map(function (array $task): array { + return [ + 'id' => (int)($task['id'] ?? 0), + 'label' => (string)($task['label'] ?? $task['task'] ?? ''), + 'services' => $this->normalizeServiceList($task['services'] ?? []), + 'buttons' => $this->normalizeArrayPayload($task['buttons'] ?? []), + 'order_priority' => (int)($task['order_priority'] ?? 0), + ]; + }, array_values((array)($path['tasks'] ?? [])))), + 'buttons' => array_values(array_reduce( + array_values((array)($path['tasks'] ?? [])), + function (array $carry, mixed $task): array { + if (!is_array($task)) { + return $carry; + } + foreach ($this->normalizeArrayPayload($task['buttons'] ?? []) as $button) { + $key = (is_int($button) ? 'int:' : 'string:') . (string)$button; + $carry[$key] = $button; + } + return $carry; + }, + [] + )), + 'signals' => array_values(array_map(static fn(array $signal): array => [ + 'runtime_stage' => (string)($signal['runtime_stage'] ?? ''), + 'signal_type' => (string)($signal['signal_type'] ?? ''), + 'relay_role' => (string)($signal['relay_role'] ?? ''), + 'relay_id' => $signal['relay_id'] ?? null, + 'target_binding' => $signal['target_binding'] ?? null, + 'source' => (string)($signal['source'] ?? ''), + 'predicted_status' => (string)($signal['predicted_status'] ?? ''), + 'payload' => is_array($signal['payload'] ?? null) ? (array)$signal['payload'] : [], + ], array_values((array)($path['signals'] ?? [])))), + ])); + } + + /** + * @return array> + */ + private function loadPathConfirmationRows(int $departmentId, ?int $configVersionId, int $laneId, ?int $vehicleTypeId, string $configSource): array + { + if (!$this->tableExists('department_selfserve_path_confirmations')) { + return []; + } + + $where = [ + 'department_id = :department_id', + 'lane_id = :lane_id', + 'config_source = :config_source', + 'deleted_at IS NULL', + ]; + $params = [ + ':department_id' => $departmentId, + ':lane_id' => $laneId, + ':config_source' => $configSource, + ]; + if ($configVersionId === null) { + $where[] = 'config_version_id IS NULL'; + } else { + $where[] = 'config_version_id = :config_version_id'; + $params[':config_version_id'] = $configVersionId; + } + if ($vehicleTypeId !== null) { + $where[] = 'vehicle_type_id = :vehicle_type_id'; + $params[':vehicle_type_id'] = $vehicleTypeId; + } + + $statement = db::getPDO()->prepare( + 'SELECT * + FROM department_selfserve_path_confirmations + WHERE ' . implode(' AND ', $where) . ' + ORDER BY confirmed_at DESC, id DESC' + ); + $statement->execute($params); + $rows = $statement->fetchAll(\PDO::FETCH_ASSOC) ?: []; + + return array_values(array_map(function (array $row): array { + $row['answers'] = $this->decodeJsonArray($row['answers_json'] ?? null); + $row['result'] = $this->decodeJsonArray($row['result_json'] ?? null); + $row['scope'] = $this->decodeJsonArray($row['scope_json'] ?? null); + return $row; + }, $rows)); + } + + /** + * @return array|array + */ + private function decodeJsonArray(mixed $value): array + { + if (is_array($value)) { + return $value; + } + $decoded = json_decode((string)($value ?? '[]'), true); + return is_array($decoded) ? $decoded : []; + } + /** * @param array $services * @param array> $tasks @@ -4162,6 +5079,7 @@ class selfserve_studio_graph 'tasks' => 'task', 'actions' => 'action', 'lanes' => 'lane', + 'paths' => 'path', default => $entity, }; } diff --git a/services/nginx/app/openapi.yaml b/services/nginx/app/openapi.yaml index 00980b11..f3a0f23d 100644 --- a/services/nginx/app/openapi.yaml +++ b/services/nginx/app/openapi.yaml @@ -5460,7 +5460,7 @@ paths: tags: - Self-Serve summary: Bulk save all-in-one self-serve studio graph changes - description: Creates, updates, deletes, connects, disconnects, and reorders questions, conditions, and tasks by editing the schema_version 2 draft config JSON. Condition connections create expression predicates; layout remains separate from runtime behavior. + description: Creates, updates, deletes, connects, disconnects, reorders, and upserts self-serve answer paths by editing the schema_version 2 draft config JSON. Condition connections create expression predicates; Path Editor upserts create normal generated condition and task nodes; layout remains separate from runtime behavior. operationId: saveSelfserveStudioGraph requestBody: required: true @@ -5617,6 +5617,29 @@ paths: '422': $ref: '#/components/responses/BadRequest' + /department/selfserve/studio/path-confirmations: + post: + tags: + - Self-Serve + summary: Confirm or reset a projected self-serve studio path + description: Stores confirmation for a projected terminal path using its stable path and result signatures. Projections report confirmed, unconfirmed, or stale when the resulting tasks, buttons, services, or signals change. + operationId: confirmSelfserveStudioPath + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/SelfserveStudioPathConfirmationRequest' + responses: + '200': + description: Path confirmation updated + content: + application/json: + schema: + $ref: '#/components/schemas/SelfserveStudioPathConfirmation' + '422': + $ref: '#/components/responses/BadRequest' + /department/selfserve/studio/publish: post: tags: @@ -17898,10 +17921,10 @@ components: properties: action: type: string - enum: [create, update, delete, connect, disconnect, reorder] + enum: [create, update, delete, connect, disconnect, reorder, upsert, upsert_path] entity: type: string - enum: [question, condition, task] + enum: [question, condition, task, action, path] description: Standalone rule operations are not accepted for schema_version 2 drafts. id: type: integer @@ -18288,6 +18311,8 @@ components: items: { type: integer } max_states: { type: integer } path_sample_count: { type: integer } + confirmations: + $ref: '#/components/schemas/SelfserveStudioPathConfirmationSummary' outcomes: type: array items: @@ -18303,6 +18328,15 @@ components: type: boolean progress: $ref: '#/components/schemas/SelfserveStudioPathProgress' + confirmations: + type: object + properties: + summary: + $ref: '#/components/schemas/SelfserveStudioPathConfirmationSummary' + removed: + type: array + items: + $ref: '#/components/schemas/SelfserveStudioPathConfirmation' SelfserveStudioPathProgress: type: object @@ -18388,6 +18422,95 @@ components: node_ids: type: array items: { type: string } + path_signature: { type: string } + result_signature: { type: string } + confirmation_status: + type: string + enum: [unconfirmed, confirmed, stale] + confirmed_at: + type: string + nullable: true + confirmed_by: + type: integer + nullable: true + stale_reason: + type: string + nullable: true + + SelfserveStudioPathConfirmationSummary: + type: object + properties: + confirmed: { type: integer } + unconfirmed: { type: integer } + stale: { type: integer } + removed: { type: integer } + total: { type: integer } + + SelfserveStudioPathConfirmationRequest: + type: object + required: [department, path_signature] + properties: + department: { type: integer } + action: + type: string + enum: [confirm, reset, delete, clear] + default: confirm + path_signature: { type: string } + result_signature: + type: string + description: Required when action is confirm. + scope: + type: object + additionalProperties: true + answers: + type: array + items: + $ref: '#/components/schemas/SelfserveStudioPathAnswer' + result: + type: object + additionalProperties: true + + SelfserveStudioPathConfirmation: + type: object + properties: + id: + type: integer + nullable: true + department_id: { type: integer } + lane_id: + type: integer + nullable: true + vehicle_type_id: + type: integer + nullable: true + config_version_id: + type: integer + nullable: true + config_source: { type: string } + path_signature: { type: string } + result_signature: { type: string } + confirmation_status: + type: string + enum: [unconfirmed, confirmed, stale] + answers: + type: array + items: + $ref: '#/components/schemas/SelfserveStudioPathAnswer' + result: + type: object + additionalProperties: true + scope: + type: object + additionalProperties: true + confirmed_at: + type: string + nullable: true + confirmed_by: + type: integer + nullable: true + stale_reason: + type: string + nullable: true SelfserveStudioPathTask: type: object diff --git a/services/nginx/app/routes/departmentSelfserveStudioRoute.php b/services/nginx/app/routes/departmentSelfserveStudioRoute.php index 49a23599..a4c6aef0 100644 --- a/services/nginx/app/routes/departmentSelfserveStudioRoute.php +++ b/services/nginx/app/routes/departmentSelfserveStudioRoute.php @@ -195,6 +195,29 @@ class departmentSelfserveStudioRoute 'list_department_selfserve_vehicle_conditions' => 'Project grouped self-serve studio question path outcomes', ]); + $this->post('/department/selfserve/studio/path-confirmations', function (): void { + global $response; + $user = $this->requireStudioUser('edit_department_selfserve_config_versions'); + self::requireParameters(['department', 'path_signature']); + $departmentId = (int)self::getParameter('department'); + $this->assertDepartmentAccess($user, $departmentId); + + try { + $payload = self::getParametersAsArray(); + $action = strtolower(trim((string)($payload['action'] ?? 'confirm'))); + $service = new selfserve_studio_graph(); + $result = in_array($action, ['delete', 'reset', 'clear'], true) + ? $service->resetPathConfirmation($departmentId, $payload) + : $service->confirmPathOutcome($departmentId, $payload, (int)$user->id); + (new logs_o())->add('selfserve_studio', $departmentId, 1, $user->id, 'CONFIRM_STUDIO_PATH', 'Updated self-serve studio path confirmation'); + $response->success($result); + } catch (\RuntimeException $exception) { + $response->error($exception->getMessage(), 422); + } + }, [ + 'edit_department_selfserve_config_versions' => 'Confirm or reset projected self-serve studio answer paths', + ]); + $this->post('/department/selfserve/studio/publish', function (): void { global $response; $user = $this->requireStudioUser('publish_department_selfserve_config_versions'); diff --git a/services/nginx/app/routes/pingRoute.php b/services/nginx/app/routes/pingRoute.php index 3ea9297f..4d48d45f 100644 --- a/services/nginx/app/routes/pingRoute.php +++ b/services/nginx/app/routes/pingRoute.php @@ -2,6 +2,7 @@ namespace routes; +use classes\release_manager; use traits\route_t; class pingRoute @@ -15,6 +16,8 @@ class pingRoute $response->success([ 'message' => 'pong', 'time' => date('c'), + 'backend_version' => release_manager::backendVersion(), + 'api_commit_sha' => release_manager::backendCommitSha(), ]); }); } diff --git a/services/nginx/app/tests/Api/PingApiTest.php b/services/nginx/app/tests/Api/PingApiTest.php index 6d75a7a4..920e90cd 100644 --- a/services/nginx/app/tests/Api/PingApiTest.php +++ b/services/nginx/app/tests/Api/PingApiTest.php @@ -17,5 +17,7 @@ it('returns the ping contract', function (): void { expect($response->data()) ->toBeArray() ->toHaveKey('message', 'pong') - ->toHaveKey('time'); + ->toHaveKey('time') + ->toHaveKey('backend_version') + ->toHaveKey('api_commit_sha'); }); diff --git a/services/nginx/app/tests/Unit/ReleaseManager/ReleaseManagerTest.php b/services/nginx/app/tests/Unit/ReleaseManager/ReleaseManagerTest.php index 861b90f1..23b76516 100644 --- a/services/nginx/app/tests/Unit/ReleaseManager/ReleaseManagerTest.php +++ b/services/nginx/app/tests/Unit/ReleaseManager/ReleaseManagerTest.php @@ -62,6 +62,40 @@ it('verifies CI release gate bearer tokens from dedicated release credentials', } }); +it('normalizes app-specific release gate auto-sync metadata', function (): void { + $manager = new release_manager(); + $normalizeGate = new ReflectionMethod(release_manager::class, 'normalizeReleaseGateInput'); + $normalizeGate->setAccessible(true); + $appMatches = new ReflectionMethod(release_manager::class, 'releaseGateAppMatches'); + $appMatches->setAccessible(true); + + $gate = $normalizeGate->invoke($manager, [ + 'channel_slug' => 'stable', + 'app' => 'api', + 'repository' => 'https://github.com/copenhagentruckwash/api.git', + 'branch' => 'master', + 'expected_commit' => 'd52ceb85138740c45f20cda9b7ed9b7a21f0d4e8', + 'workflow_url' => 'https://github.com/copenhagentruckwash/api/actions/runs/123', + 'auto_sync' => true, + ], ['slug' => 'stable']); + + expect($gate)->toMatchArray([ + 'channel_slug' => 'stable', + 'route_slug' => 'master', + 'app' => 'api', + 'repository' => 'copenhagentruckwash/api', + 'branch' => 'master', + 'expected_commit' => 'd52ceb85138740c45f20cda9b7ed9b7a21f0d4e8', + 'workflow_url' => 'https://github.com/copenhagentruckwash/api/actions/runs/123', + 'auto_sync' => true, + ]); + + expect($appMatches->invoke($manager, ['app' => 'api'], 'api'))->toBeTrue(); + expect($appMatches->invoke($manager, ['apps' => ['frontend', 'api']], 'api'))->toBeTrue(); + expect($appMatches->invoke($manager, [], 'frontend'))->toBeTrue(); + expect($appMatches->invoke($manager, [], 'api'))->toBeFalse(); +}); + it('normalizes GitHub repository identifiers for private repository access checks', function (): void { expect(release_manager::normalizeGithubRepositoryName('truckwash/backend-php'))->toBe('truckwash/backend-php'); expect(release_manager::normalizeGithubRepositoryName('https://github.com/truckwash/front-end-vue.git'))->toBe('truckwash/front-end-vue'); @@ -727,6 +761,8 @@ it('defines release manager schema, routes, permissions, and system-status integ expect($schema)->toContain('CREATE TABLE IF NOT EXISTS release_channel_versions'); expect($schema)->toContain('CREATE TABLE IF NOT EXISTS release_assignments'); expect($schema)->toContain('CREATE TABLE IF NOT EXISTS release_deployment_targets'); + expect($schema)->toContain('CREATE TABLE IF NOT EXISTS release_auto_sync_events'); + expect($schema)->toContain('UNIQUE KEY uq_release_auto_sync_event'); expect($schema)->toContain('CREATE TABLE IF NOT EXISTS release_service_sets'); expect($schema)->toContain('CREATE TABLE IF NOT EXISTS release_deployments'); expect($schema)->toContain('CREATE TABLE IF NOT EXISTS release_bundles'); @@ -796,6 +832,9 @@ it('defines release manager schema, routes, permissions, and system-status integ expect($manager)->toContain('verifyGithubSignature'); expect($manager)->toContain('verifyReleaseGateToken'); expect($manager)->toContain('normalizeReleaseGateInput'); + expect($manager)->toContain('processReleaseGateAutoSync'); + expect($manager)->toContain('release_auto_sync_events'); + expect($manager)->toContain('require_readiness'); expect($manager)->toContain('release-manifest.json'); expect($manager)->toContain('static_artifact'); expect($manager)->toContain('api_gateway'); diff --git a/services/nginx/app/tests/Unit/Selfserve/SelfserveOpenApiSpecTest.php b/services/nginx/app/tests/Unit/Selfserve/SelfserveOpenApiSpecTest.php index fbf73147..4112dfd1 100644 --- a/services/nginx/app/tests/Unit/Selfserve/SelfserveOpenApiSpecTest.php +++ b/services/nginx/app/tests/Unit/Selfserve/SelfserveOpenApiSpecTest.php @@ -76,6 +76,7 @@ it('documents the all-in-one self-serve studio replacement API', function (): vo expect($content)->toContain('/department/selfserve/studio/simulate:'); expect($content)->toContain('/department/selfserve/studio/path-outcomes:'); expect($content)->toContain('/department/selfserve/studio/path-outcomes/stream:'); + expect($content)->toContain('/department/selfserve/studio/path-confirmations:'); expect($content)->toContain('/department/selfserve/studio/publish:'); expect($content)->toContain('/department/selfserve/studio/rollback:'); expect($content)->toContain('/department/selfserve/studio/gateway-action:'); @@ -86,8 +87,11 @@ it('documents the all-in-one self-serve studio replacement API', function (): vo expect($content)->toContain('SelfserveStudioPathOutcomesResponse:'); expect($content)->toContain('SelfserveStudioPathResult:'); expect($content)->toContain('SelfserveStudioPathProgress:'); + expect($content)->toContain('SelfserveStudioPathConfirmationRequest:'); + expect($content)->toContain('SelfserveStudioPathConfirmation:'); expect($content)->toContain('projectSelfserveStudioPathOutcomes'); expect($content)->toContain('streamSelfserveStudioPathOutcomes'); + expect($content)->toContain('confirmSelfserveStudioPath'); expect($content)->toContain('runSelfserveStudioGatewayAction'); }); diff --git a/services/nginx/app/tests/Unit/Selfserve/SelfserveRouteWiringTest.php b/services/nginx/app/tests/Unit/Selfserve/SelfserveRouteWiringTest.php index 14e6f81b..f787d6b3 100644 --- a/services/nginx/app/tests/Unit/Selfserve/SelfserveRouteWiringTest.php +++ b/services/nginx/app/tests/Unit/Selfserve/SelfserveRouteWiringTest.php @@ -108,16 +108,19 @@ it('wires the all-in-one self-serve studio replacement endpoints', function (): expect($studioRoute)->toContain('/department/selfserve/studio/simulate'); expect($studioRoute)->toContain('/department/selfserve/studio/path-outcomes'); expect($studioRoute)->toContain('/department/selfserve/studio/path-outcomes/stream'); + expect($studioRoute)->toContain('/department/selfserve/studio/path-confirmations'); expect($studioRoute)->toContain("ini_set('display_errors', '0')"); expect($studioRoute)->toContain('/department/selfserve/studio/publish'); expect($studioRoute)->toContain('/department/selfserve/studio/rollback'); expect($studioRoute)->toContain('/department/selfserve/studio/gateway-action'); expect($studioRoute)->toContain('projectPathOutcomes'); + expect($studioRoute)->toContain('confirmPathOutcome'); expect($studioRoute)->toContain('modules_shelly_config'); expect($studioRoute)->toContain('modules_selfserve_sessions_force_stop'); expect($studioGraph)->not->toBeFalse(); expect($studioGraph)->toContain('department_selfserve_studio_layouts'); + expect($studioGraph)->toContain('department_selfserve_path_confirmations'); expect($studioGraph)->toContain('buildGatewayWorkspace'); expect($studioGraph)->toContain('runGatewayAction'); expect($studioGraph)->toContain('layout_affects_runtime'); diff --git a/services/nginx/app/tests/Unit/Selfserve/SelfserveSchemaBootstrapCompatibilityTest.php b/services/nginx/app/tests/Unit/Selfserve/SelfserveSchemaBootstrapCompatibilityTest.php index ec0d77b6..dc0f9776 100644 --- a/services/nginx/app/tests/Unit/Selfserve/SelfserveSchemaBootstrapCompatibilityTest.php +++ b/services/nginx/app/tests/Unit/Selfserve/SelfserveSchemaBootstrapCompatibilityTest.php @@ -50,3 +50,13 @@ it('uses mysql-safe identifiers for self-serve studio virtual hardware storage', expect(strlen($identifier))->toBeLessThanOrEqual(64); } }); + +it('creates self-serve studio path confirmation storage', function (): void { + $bootstrapContent = file_get_contents(app_path('classes/selfserve_schema_bootstrap.php')); + + expect($bootstrapContent)->not->toBeFalse(); + expect($bootstrapContent)->toContain('CREATE TABLE IF NOT EXISTS department_selfserve_path_confirmations'); + expect($bootstrapContent)->toContain('path_signature VARCHAR(128) NOT NULL'); + expect($bootstrapContent)->toContain('result_signature VARCHAR(128) NOT NULL'); + expect($bootstrapContent)->toContain('idx_selfserve_path_conf_signature'); +}); diff --git a/services/nginx/app/tests/Unit/Selfserve/SelfserveStudioGraphTest.php b/services/nginx/app/tests/Unit/Selfserve/SelfserveStudioGraphTest.php index a3a0f1b8..b09e2bb2 100644 --- a/services/nginx/app/tests/Unit/Selfserve/SelfserveStudioGraphTest.php +++ b/services/nginx/app/tests/Unit/Selfserve/SelfserveStudioGraphTest.php @@ -370,6 +370,168 @@ it('keeps runtime on published v2 configs and leaves draft JSON as the studio ed expect($washFlowSource)->toContain("\$configSource = \$publishedConfigPayload === null ? 'legacy' : 'published';"); expect($studioGraphSource)->toContain('$draftObject->config_json->set($config);'); expect($studioGraphSource)->toContain('Standalone rule operations are not supported in self-serve rules v2.'); + expect($studioGraphSource)->toContain('upsert_path'); +}); + +it('upserts path editor answers into generated condition and task config rows', function (): void { + $service = selfserve_studio_graph_without_constructor(); + $method = new ReflectionMethod(selfserve_studio_graph::class, 'applyConfigOperation'); + $method->setAccessible(true); + $config = [ + 'schema_version' => 2, + 'questions' => [ + ['id' => 11, 'question' => 'Machine wash is allowed', 'order_priority' => 1], + ['id' => 12, 'question' => 'Trailer present', 'order_priority' => 2], + ], + 'conditions' => [], + 'rules' => [], + 'tasks' => [], + 'actions' => [], + 'v2_meta' => ['next_ids' => ['condition' => 100, 'task' => 200]], + ]; + + $method->invokeArgs($service, [6, &$config, [ + 'action' => 'upsert_path', + 'entity' => 'path', + 'data' => [ + 'path_key' => 'allowed_front', + 'scope' => ['lane_id' => 7, 'vehicle_type_id' => 2, 'machine_type_id' => 1001], + 'answers' => [ + ['question_id' => 11, 'value' => true], + ['question_id' => 12, 'value' => false], + ], + 'result' => [ + 'machine_allowed' => true, + 'task' => 'Set program', + 'services' => ['MACHINE', 'PROGRAM_PICKER'], + 'buttons' => ['program_picker', 'reset', 2, 'start'], + 'dynamic_images_vehicle_type' => 3, + 'tasks' => [ + [ + 'task' => 'Set program', + 'services' => ['MACHINE', 'PROGRAM_PICKER'], + 'buttons' => ['program_picker'], + 'dynamic_images_vehicle_type' => 3, + ], + [ + 'task' => 'Press reset', + 'services' => ['MACHINE'], + 'buttons' => ['reset'], + ], + [ + 'task' => 'Press machine button 2', + 'services' => ['MACHINE'], + 'buttons' => [2], + ], + [ + 'task' => 'Press start', + 'services' => ['MACHINE'], + 'buttons' => ['start'], + ], + ], + ], + ], + ]]); + + $condition = $config['conditions'][0] ?? []; + $tasks = array_values($config['tasks'] ?? []); + $pathMeta = $config['v2_meta']['path_editor']['paths']['allowed_front'] ?? []; + $validation = (new class extends selfserve_config_versioning { + public function __construct() + { + } + })->validateConfig($config); + + expect($condition['generated_by'])->toBe('path_editor') + ->and($condition['path_key'])->toBe('allowed_front') + ->and($condition['lane'])->toBe(7) + ->and($condition['product'])->toBe(2) + ->and($condition['machine_type_id'])->toBe(1001) + ->and($condition['expression']['children'])->toHaveCount(2) + ->and($condition['expression']['children'][0]['operator'])->toBe('IS_TRUE') + ->and($condition['expression']['children'][1]['operator'])->toBe('IS_FALSE') + ->and($tasks)->toHaveCount(4) + ->and(array_column($tasks, 'task'))->toBe(['Set program', 'Press reset', 'Press machine button 2', 'Press start']) + ->and(array_column($tasks, 'order_priority'))->toBe([10, 20, 30, 40]) + ->and(array_column($tasks, 'gate_ref_id'))->toBe([(int)$condition['id'], (int)$condition['id'], (int)$condition['id'], (int)$condition['id']]) + ->and($tasks[0]['generated_by'])->toBe('path_editor') + ->and($tasks[0]['gate_type'])->toBe('CONDITION') + ->and($tasks[0]['services'])->toBe(['MACHINE', 'PROGRAM_PICKER']) + ->and($tasks[0]['buttons'])->toBe(['program_picker']) + ->and($tasks[0]['dynamic_images_vehicle_type'])->toBe(3) + ->and($tasks[1]['buttons'])->toBe(['reset']) + ->and($tasks[2]['buttons'])->toBe([2]) + ->and($tasks[3]['buttons'])->toBe(['start']) + ->and($pathMeta['condition_id'])->toBe((int)$condition['id']) + ->and($pathMeta['task_id'])->toBe((int)$tasks[0]['id']) + ->and($pathMeta['task_ids'])->toBe(array_map(static fn(array $task): int => (int)$task['id'], $tasks)) + ->and($pathMeta['result']['buttons'])->toBe(['program_picker', 'reset', 2, 'start']) + ->and($pathMeta['path_signature'])->not->toBe('') + ->and($validation['valid'])->toBeTrue(); + + $method->invokeArgs($service, [6, &$config, [ + 'action' => 'upsert_path', + 'entity' => 'path', + 'data' => [ + 'path_key' => 'allowed_front', + 'scope' => ['lane_id' => 7, 'vehicle_type_id' => 2, 'machine_type_id' => 1001], + 'answers' => [ + ['question_id' => 11, 'value' => true], + ['question_id' => 12, 'value' => false], + ], + 'result' => [ + 'machine_allowed' => true, + 'task' => 'Set program', + 'services' => ['MACHINE', 'PROGRAM_PICKER'], + 'buttons' => ['program_picker', 'start'], + 'dynamic_images_vehicle_type' => 3, + 'tasks' => [ + ['task' => 'Set program', 'services' => ['MACHINE', 'PROGRAM_PICKER'], 'buttons' => ['program_picker'], 'dynamic_images_vehicle_type' => 3], + ['task' => 'Press start', 'services' => ['MACHINE'], 'buttons' => ['start']], + ], + ], + ], + ]]); + + $updatedTasks = array_values(array_filter( + $config['tasks'] ?? [], + static fn(array $task): bool => ($task['path_key'] ?? '') === 'allowed_front' + )); + $updatedPathMeta = $config['v2_meta']['path_editor']['paths']['allowed_front'] ?? []; + + expect($updatedTasks)->toHaveCount(2) + ->and(array_column($updatedTasks, 'id'))->toBe([(int)$tasks[0]['id'], (int)$tasks[1]['id']]) + ->and(array_column($updatedTasks, 'task'))->toBe(['Set program', 'Press start']) + ->and($updatedPathMeta['task_ids'])->toBe([(int)$tasks[0]['id'], (int)$tasks[1]['id']]); + + $method->invokeArgs($service, [6, &$config, [ + 'action' => 'upsert_path', + 'entity' => 'path', + 'data' => [ + 'path_key' => 'legacy_front', + 'scope' => ['lane_id' => 7, 'vehicle_type_id' => 2, 'machine_type_id' => 1001], + 'answers' => [ + ['question_id' => 11, 'value' => false], + ], + 'result' => [ + 'machine_allowed' => true, + 'task' => 'Legacy start', + 'services' => ['MACHINE'], + 'buttons' => ['start'], + ], + ], + ]]); + + $legacyPathMeta = $config['v2_meta']['path_editor']['paths']['legacy_front'] ?? []; + $legacyTask = array_values(array_filter( + $config['tasks'] ?? [], + static fn(array $task): bool => ($task['path_key'] ?? '') === 'legacy_front' + ))[0] ?? []; + + expect($legacyTask['task'])->toBe('Legacy start') + ->and($legacyTask['buttons'])->toBe(['start']) + ->and($legacyPathMeta['task_id'])->toBe((int)$legacyTask['id']) + ->and($legacyPathMeta['task_ids'])->toBe([(int)$legacyTask['id']]); }); it('surfaces task attachments in studio graph, simulator, and flow responses', function (): void { @@ -1016,10 +1178,93 @@ it('projects visible question answer paths into grouped task service and signal ->and($allowedPath['answers'])->toHaveCount(2) ->and($allowedPath['answers'][0]['question'])->toBe('Are mirrors folded?') ->and($allowedPath['services'])->toBe(['MACHINE']) + ->and($allowedPath['path_signature'])->not->toBe('') + ->and($allowedPath['result_signature'])->not->toBe('') + ->and($allowedPath['confirmation_status'])->toBe('unconfirmed') ->and($allowedPath['node_ids'])->toContain('question:11') ->and($allowedPath['node_ids'])->toContain('task:41'); }); +it('marks projected path confirmations confirmed or stale by stable signatures', function (): void { + $service = selfserve_studio_graph_without_constructor(); + $simulate = static function (string $button): callable { + return static function (array $overrides) use ($button): array { + $answers = []; + foreach ($overrides as $entry) { + $answers[(int)($entry['question_id'] ?? 0)] = $entry['value'] ?? null; + } + $allowed = ($answers[11] ?? null) === true; + + return [ + 'allowed' => $allowed, + 'questions' => [ + ['id' => 11, 'question' => 'Machine wash is allowed', 'answer' => $answers[11] ?? null], + ], + 'tasks' => $allowed ? [ + ['id' => 41, 'task' => 'Start machine', 'services' => ['MACHINE'], 'buttons' => [$button]], + ] : [], + 'allowed_services' => $allowed ? ['MACHINE'] : [], + 'debug' => [ + 'questions' => [ + ['id' => 11, 'node_id' => 'question:11', 'label' => 'Machine wash is allowed', 'visible' => true, 'answer' => $answers[11] ?? null], + ], + 'tasks' => [ + ['id' => 41, 'node_id' => 'task:41', 'label' => 'Start machine', 'active' => $allowed, 'services' => ['MACHINE'], 'buttons' => [$button], 'order_priority' => 1], + ], + 'signal_timeline' => [], + ], + ]; + }; + }; + + $scope = [ + 'department_id' => 6, + 'lane_id' => 7, + 'vehicle_type_id' => 2, + 'config_source' => 'draft', + 'config_version_id' => 90, + 'hardware_mode' => 'studio', + ]; + $initial = $service->projectPathOutcomesFromSimulator($simulate('start'), ['scope' => $scope]); + $allowedPath = array_values(array_filter( + $initial['paths'], + static fn(array $path): bool => ($path['allowed'] ?? false) === true + ))[0] ?? []; + + $rows = [[ + 'path_signature' => $allowedPath['path_signature'], + 'result_signature' => $allowedPath['result_signature'], + 'answers' => $allowedPath['answers'], + 'result' => ['allowed' => true], + 'scope' => $scope, + 'confirmed_at' => '2026-05-27 10:00:00', + 'confirmed_by' => 9, + ]]; + $confirmed = $service->projectPathOutcomesFromSimulator($simulate('start'), [ + 'scope' => $scope, + 'confirmation_rows' => $rows, + ]); + $changed = $service->projectPathOutcomesFromSimulator($simulate('reset'), [ + 'scope' => $scope, + 'confirmation_rows' => $rows, + ]); + + $confirmedAllowed = array_values(array_filter( + $confirmed['paths'], + static fn(array $path): bool => ($path['allowed'] ?? false) === true + ))[0] ?? []; + $staleAllowed = array_values(array_filter( + $changed['paths'], + static fn(array $path): bool => ($path['allowed'] ?? false) === true + ))[0] ?? []; + + expect($confirmedAllowed['confirmation_status'])->toBe('confirmed') + ->and($confirmed['summary']['confirmations']['confirmed'])->toBe(1) + ->and($staleAllowed['confirmation_status'])->toBe('stale') + ->and($staleAllowed['stale_reason'])->toBe('Result changed since confirmation.') + ->and($changed['summary']['confirmations']['stale'])->toBe(1); +}); + it('truncates path outcome projection when the state cap is reached', function (): void { $service = selfserve_studio_graph_without_constructor(); $simulate = function (array $overrides): array {