<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="0" skipped="0" tests="102" time="25.921" timestamp="2026-08-09T09:34:05.164623+00:00" hostname="cube-B850M-AORUS-ELITE-WIFI6E-ICE"><testcase classname="tests.gateway.test_update_command.TestHandleUpdateCommand" name="test_managed_install_returns_package_manager_guidance" time="0.023" /><testcase classname="tests.gateway.test_update_command.TestHandleUpdateCommand" name="test_no_git_directory" time="0.014" /><testcase classname="tests.gateway.test_update_command.TestHandleUpdateCommand" name="test_no_hermes_binary" time="0.003" /><testcase classname="tests.gateway.test_update_command.TestHandleUpdateCommand" name="test_fallback_to_sys_executable" time="0.004" /><testcase classname="tests.gateway.test_update_command.TestHandleUpdateCommand" name="test_resolve_hermes_bin_prefers_which" time="0.003" /><testcase classname="tests.gateway.test_update_command.TestHandleUpdateCommand" name="test_resolve_hermes_bin_fallback" time="0.003" /><testcase classname="tests.gateway.test_update_command.TestHandleUpdateCommand" name="test_resolve_hermes_bin_returns_none_when_both_fail" time="0.003" /><testcase classname="tests.gateway.test_update_command.TestHandleUpdateCommand" name="test_writes_pending_marker" time="0.003" /><testcase classname="tests.gateway.test_update_command.TestHandleUpdateCommand" name="test_writes_pending_marker_with_thread_id" time="0.003" /><testcase classname="tests.gateway.test_update_command.TestHandleUpdateCommand" name="test_spawns_setsid" time="0.003" /><testcase classname="tests.gateway.test_update_command.TestHandleUpdateCommand" name="test_fallback_when_no_setsid" time="0.003" /><testcase classname="tests.gateway.test_update_command.TestHandleUpdateCommand" name="test_popen_failure_cleans_up" time="0.003" /><testcase classname="tests.gateway.test_update_command.TestHandleUpdateCommand" name="test_returns_user_friendly_message" time="0.004" /><testcase classname="tests.gateway.test_update_command.TestUpdateCommandPlatformGate" name="test_blocks_programmatic_interface" time="0.004" /><testcase classname="tests.gateway.test_update_command.TestUpdateCommandPlatformGate" name="test_blocks_api_server_platform" time="0.003" /><testcase classname="tests.gateway.test_update_command.TestUpdateCommandPlatformGate" name="test_allows_plugin_platform_via_registry_fallback" time="0.135" /><testcase classname="tests.gateway.test_update_command.TestUpdateCommandPlatformGate" name="test_allows_mattermost_via_registry_fallback" time="0.053" /><testcase classname="tests.gateway.test_update_command.TestUpdateCommandPlatformGate" name="test_allows_homeassistant_via_registry_fallback" time="0.048" /><testcase classname="tests.gateway.test_update_command.TestUpdateCommandPlatformGate" name="test_allows_builtin_platform_in_allowlist" time="0.005" /><testcase classname="tests.gateway.test_update_command.TestSendUpdateNotification" name="test_no_pending_file_is_noop" time="0.003" /><testcase classname="tests.gateway.test_update_command.TestSendUpdateNotification" name="test_defers_notification_while_update_still_running" time="0.003" /><testcase classname="tests.gateway.test_update_command.TestSendUpdateNotification" name="test_recovers_from_claimed_pending_file" time="0.004" /><testcase classname="tests.gateway.test_update_command.TestSendUpdateNotification" name="test_sends_notification_with_output" time="0.004" /><testcase classname="tests.gateway.test_update_command.TestSendUpdateNotification" name="test_sends_notification_with_thread_metadata" time="0.004" /><testcase classname="tests.gateway.test_update_command.TestSendUpdateNotification" name="test_strips_ansi_codes" time="0.003" /><testcase classname="tests.gateway.test_update_command.TestSendUpdateNotification" name="test_truncates_long_output" time="0.003" /><testcase classname="tests.gateway.test_update_command.TestSendUpdateNotification" name="test_sends_failure_message_when_update_fails" time="0.004" /><testcase classname="tests.gateway.test_update_command.TestSendUpdateNotification" name="test_sends_generic_message_when_no_output" time="0.003" /><testcase classname="tests.gateway.test_update_command.TestSendUpdateNotification" name="test_cleans_up_files_after_notification" time="0.003" /><testcase classname="tests.gateway.test_update_command.TestSendUpdateNotification" name="test_cleans_up_on_error" time="0.004" /><testcase classname="tests.gateway.test_update_command.TestSendUpdateNotification" name="test_handles_corrupt_pending_file" time="0.003" /><testcase classname="tests.gateway.test_update_command.TestSendUpdateNotification" name="test_no_adapter_for_platform_preserves_markers" time="0.003" /><testcase classname="tests.gateway.test_update_command.TestSendUpdateNotification" name="test_deferred_notification_delivers_after_reconnect" time="0.004" /><testcase classname="tests.gateway.test_update_command.TestUpdateInHelp" name="test_update_in_help_output" time="0.027" /><testcase classname="tests.gateway.test_update_command.TestUpdateInHelp" name="test_update_is_known_command" time="0.008" /><testcase classname="tests.gateway.test_update_streaming.TestGatewayPrompt" name="test_writes_prompt_file_and_reads_response" time="0.510" /><testcase classname="tests.gateway.test_update_streaming.TestGatewayPrompt" name="test_prompt_file_content" time="0.506" /><testcase classname="tests.gateway.test_update_streaming.TestGatewayPrompt" name="test_timeout_returns_default" time="0.506" /><testcase classname="tests.gateway.test_update_streaming.TestGatewayPrompt" name="test_empty_response_returns_default" time="2.008" /><testcase classname="tests.gateway.test_update_streaming.TestRestoreStashWithInputFn" name="test_uses_input_fn_when_provided" time="0.006" /><testcase classname="tests.gateway.test_update_streaming.TestRestoreStashWithInputFn" name="test_input_fn_yes_proceeds_with_restore" time="0.004" /><testcase classname="tests.gateway.test_update_streaming.TestUpdateCommandGatewayFlag" name="test_spawns_with_gateway_flag" time="0.005" /><testcase classname="tests.gateway.test_update_streaming.TestWatchUpdateProgress" name="test_streams_output_to_adapter" time="0.307" /><testcase classname="tests.gateway.test_update_streaming.TestWatchUpdateProgress" name="test_detects_and_forwards_prompt" time="1.114" /><testcase classname="tests.gateway.test_update_streaming.TestWatchUpdateProgress" name="test_prompt_forwarding_preserves_thread_metadata" time="0.509" /><testcase classname="tests.gateway.test_update_streaming.TestWatchUpdateProgress" name="test_cleans_up_on_completion" time="0.007" /><testcase classname="tests.gateway.test_update_streaming.TestWatchUpdateProgress" name="test_failure_exit_code" time="0.005" /><testcase classname="tests.gateway.test_update_streaming.TestWatchUpdateProgress" name="test_falls_back_and_delivers_after_reconnect" time="0.308" /><testcase classname="tests.gateway.test_update_streaming.TestWatchUpdateProgress" name="test_prompt_forwarded_only_once" time="1.315" /><testcase classname="tests.gateway.test_update_streaming.TestWatchUpdateProgress" name="test_prompt_is_recovered_after_watcher_restart" time="0.462" /><testcase classname="tests.gateway.test_update_streaming.TestUpdatePromptInterception" name="test_intercepts_response_when_prompt_pending" time="0.005" /><testcase classname="tests.gateway.test_update_streaming.TestUpdatePromptInterception" name="test_recognized_slash_command_bypasses_pending_update_prompt" time="0.013" /><testcase classname="tests.gateway.test_update_streaming.TestUpdatePromptInterception" name="test_unrecognized_slash_command_still_consumed_as_response" time="0.004" /><testcase classname="tests.gateway.test_update_streaming.TestUpdatePromptInterception" name="test_normal_message_when_no_prompt_pending" time="0.004" /><testcase classname="tests.gateway.test_update_streaming.TestCmdUpdateGatewayMode" name="test_gateway_flag_enables_gateway_prompt_for_stash" time="0.004" /><testcase classname="tests.gateway.test_update_streaming.TestCmdUpdateGatewayMode" name="test_gateway_flag_parsed" time="0.004" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_non_forum_group_reply_thread_id_does_not_fork_session_key" time="0.052" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_forum_group_topic_message_preserves_thread_session_key" time="0.004" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_forum_general_topic_without_message_thread_id_keeps_thread_context" time="0.004" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_omits_general_topic_thread_id" time="0.005" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_typing_preserves_general_topic_thread_id" time="0.004" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_typing_does_not_fall_back_to_root_for_dm_topic" time="0.004" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_typing_attempts_api_call_for_dm_topic_reply_fallback" time="0.004" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_typing_falls_back_without_thread_on_bad_request" time="0.004" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_retries_without_thread_on_thread_not_found" time="0.004" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_retries_transient_thread_not_found_before_fallback" time="0.004" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_private_dm_topic_uses_direct_messages_topic_id" time="0.004" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_base_gateway_metadata_marks_telegram_dm_topics_as_reply_fallback" time="0.004" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_base_gateway_metadata_for_resumed_telegram_dm_topic_uses_direct_topic" time="0.004" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_base_gateway_replies_to_triggering_message_for_telegram_dm_topic" time="0.004" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_gateway_runner_busy_ack_replies_to_triggering_message_for_telegram_dm_topic" time="0.005" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_uses_reply_fallback_for_hermes_dm_topics" time="0.004" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_uses_reply_anchor_when_direct_topic_fallback_metadata_exists" time="0.004" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_created_private_topic_uses_message_thread_without_anchor" time="0.004" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_created_private_topic_thread_not_found_fails_without_root_fallback" time="0.004" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_uses_metadata_reply_fallback_for_streaming_dm_topics" time="0.004" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_reply_fallback_applies_to_every_chunk_for_dm_topics" time="0.004" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_model_picker_uses_metadata_reply_fallback_for_dm_topics" time="0.396" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_dm_topic_fallback_without_anchor_does_not_crash" time="0.004" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_dm_topic_reply_not_found_fails_closed" time="0.003" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_native_media_dm_topic_reply_not_found_retry_drops_thread_id[send_image_file-send_photo-image_path-photo.png-png-data]" time="0.003" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_native_media_dm_topic_reply_not_found_retry_drops_thread_id[send_document-send_document-file_path-report.txt-report-data]" time="0.003" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_native_media_dm_topic_reply_not_found_retry_drops_thread_id[send_video-send_video-video_path-clip.mp4-video-data]" time="0.003" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_native_media_dm_topic_reply_not_found_retry_drops_thread_id[send_voice-send_voice-audio_path-clip.ogg-ogg-data]" time="0.003" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_native_media_dm_topic_reply_not_found_retry_drops_thread_id[send_voice-send_audio-audio_path-clip.mp3-mp3-data]" time="0.003" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_animation_dm_topic_reply_not_found_retry_drops_thread_id" time="0.003" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_media_group_dm_topic_reply_not_found_retry_drops_thread_id" time="0.003" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_image_url_dm_topic_reply_not_found_retry_drops_thread_id" time="0.003" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_image_upload_dm_topic_reply_not_found_retry_drops_thread_id" time="0.005" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_slash_confirm_private_topic_callback_followup_sends_thread_and_reply" time="0.116" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_slash_confirm_forum_callback_followup_keeps_existing_thread_behavior" time="0.005" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_base_send_image_fallback_preserves_metadata" time="0.003" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_raises_on_other_bad_request" time="0.003" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_without_thread_id_unaffected" time="0.003" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_retries_network_errors_normally" time="3.008" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_does_not_retry_timeout" time="0.006" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_retries_wrapped_connect_timeout" time="3.008" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_marks_wrapped_connect_timeout_retryable_after_exhaustion" time="3.011" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_retries_pool_timeout" time="3.010" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_marks_pool_timeout_retryable_after_exhaustion" time="3.011" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_thread_fallback_only_fires_once" time="0.007" /><testcase classname="tests.gateway.test_telegram_thread_fallback" name="test_send_retries_retry_after_errors" time="2.007" /></testsuite></testsuites>