Discovered 369 test files (8248 tests) under ['tests/gateway']; running with -j 20
[  0.1% |     8/8248 | ✓8 | ✗0] ✓ tests/gateway/relay/test_contract_doc_conformance.py (8✓, 0.9s)
[  0.2% |    13/8248 | ✓13 | ✗ 0] ✓ tests/gateway/relay/test_descriptor.py (5✓, 0.9s)
[  0.2% |    17/8248 | ✓17 | ✗ 0] ✓ tests/gateway/relay/test_descriptor_from_entry.py (4✓, 0.9s)
[  0.4% |    34/8248 | ✓34 | ✗ 0] ✓ tests/gateway/relay/test_auth.py (17✓, 0.9s)
[  0.5% |    45/8248 | ✓45 | ✗ 0] ✓ tests/gateway/relay/test_relay_adapter.py (11✓, 0.9s)
[  0.6% |    48/8248 | ✓48 | ✗ 0] ✓ tests/gateway/relay/test_relay_sheds_crypto.py (3✓, 1.0s)
[  0.6% |    53/8248 | ✓53 | ✗ 0] ✓ tests/gateway/relay/test_relay_roundtrip.py (5✓, 1.0s)
[  0.7% |    57/8248 | ✓57 | ✗ 0] ✓ tests/gateway/relay/test_relay_follow_up.py (4✓, 1.0s)
[  0.7% |    59/8248 | ✓59 | ✗ 0] ✓ tests/gateway/platforms/test_yuanbao_recall_db_only.py (2✓, 1.0s)
[  0.8% |    68/8248 | ✓68 | ✗ 0] ✓ tests/gateway/test_7100_transient_failure_transcript.py (9✓, 1.0s)
[  0.9% |    72/8248 | ✓72 | ✗ 0] ✓ tests/gateway/relay/test_relay_interrupt.py (4✓, 1.0s)
[  0.9% |    78/8248 | ✓78 | ✗ 0] ✓ tests/gateway/relay/test_relay_roundtrip_telegram.py (6✓, 1.0s)
[  1.0% |    84/8248 | ✓84 | ✗ 0] ✓ tests/gateway/relay/test_relay_registration.py (6✓, 1.1s)
[  1.1% |    91/8248 | ✓91 | ✗ 0] ✓ tests/gateway/relay/test_ws_transport.py (7✓, 1.1s)
[  1.2% |   103/8248 | ✓103 | ✗  0] ✓ tests/gateway/relay/test_self_provision.py (12✓, 1.1s)
[  1.3% |   104/8248 | ✓104 | ✗  0] ✓ tests/gateway/relay/test_no_stub_leak.py (1✓, 1.1s)
[  1.3% |   108/8248 | ✓108 | ✗  0] ✓ tests/gateway/test_35809_auto_reset_clean_context.py (4✓, 1.5s)
[  1.4% |   112/8248 | ✓112 | ✗  0] ✓ tests/gateway/test_allowlist_startup_check.py (4✓, 0.7s)
[  1.5% |   127/8248 | ✓127 | ✗  0] ✓ tests/gateway/test_active_session_text_merge.py (15✓, 1.8s)
[  1.6% |   130/8248 | ✓130 | ✗  0] ✓ tests/gateway/test_auth_fallback.py (3✓, 0.9s)
[  1.9% |   153/8248 | ✓153 | ✗  0] ✓ tests/gateway/test_api_server_multimodal.py (23✓, 1.1s)
[  2.0% |   165/8248 | ✓165 | ✗  0] ✓ tests/gateway/test_auto_continue.py (12✓, 1.0s)
[  2.2% |   182/8248 | ✓182 | ✗  0] ✓ tests/gateway/test_api_server_bind_guard.py (17✓, 1.1s)
[  2.4% |   200/8248 | ✓200 | ✗  0] ✓ tests/gateway/test_api_server_normalize.py (18✓, 1.2s)
[  2.5% |   204/8248 | ✓204 | ✗  0] ✓ tests/gateway/test_42039_duplicate_user_message.py (4✓, 2.3s)
[  2.5% |   206/8248 | ✓206 | ✗  0] ✓ tests/gateway/test_auto_voice_reply_format.py (2✓, 1.3s)
[  3.0% |   246/8248 | ✓246 | ✗  0] ✓ tests/gateway/test_api_server_jobs.py (40✓, 1.5s)
[  3.1% |   256/8248 | ✓256 | ✗  0] ✓ tests/gateway/test_base_topic_sessions.py (10✓, 1.0s)
[  3.2% |   260/8248 | ✓260 | ✗  0] ✓ tests/gateway/test_bundles_command.py (4✓, 0.9s)
[  3.2% |   264/8248 | ✓264 | ✗  0] ✓ tests/gateway/test_busy_session_auth_bypass.py (4✓, 0.8s)
[  3.2% |   267/8248 | ✓267 | ✗  0] ✓ tests/gateway/test_cached_agent_max_iterations.py (3✓, 0.8s)
[  3.6% |   294/8248 | ✓294 | ✗  0] ✓ tests/gateway/test_allowed_channels_widening.py (27✓, 2.0s)
[  3.9% |   325/8248 | ✓325 | ✗  0] ✓ tests/gateway/test_background_process_notifications.py (31✓, 1.8s)
[  4.1% |   337/8248 | ✓337 | ✗  0] ✓ tests/gateway/test_api_server_toolset.py (12✓, 1.9s)
[  4.1% |   340/8248 | ✓340 | ✗  0] ✓ tests/gateway/test_cancel_background_drain.py (3✓, 1.0s)
[  4.3% |   358/8248 | ✓358 | ✗  0] ✓ tests/gateway/test_busy_session_ack.py (18✓, 1.2s)
[  4.4% |   365/8248 | ✓365 | ✗  0] ✓ tests/gateway/test_clean_shutdown_marker.py (7✓, 1.0s)
[  4.7% |   386/8248 | ✓386 | ✗  0] ✓ tests/gateway/test_approve_deny_commands.py (21✓, 2.3s)
[  5.4% |   442/8248 | ✓442 | ✗  0] ✓ tests/gateway/test_bluebubbles.py (56✓, 1.7s)
[  5.8% |   482/8248 | ✓482 | ✗  0] ✓ tests/gateway/test_channel_directory.py (40✓, 1.2s)
[  6.1% |   504/8248 | ✓504 | ✗  0] ✓ tests/gateway/test_background_command.py (22✓, 2.3s)
[  6.3% |   519/8248 | ✓519 | ✗  0] ✓ tests/gateway/test_complete_path_at_filter.py (15✓, 0.9s)
[  6.8% |   559/8248 | ✓559 | ✗  0] ✓ tests/gateway/test_command_bypass_active_session.py (40✓, 1.1s)
[  6.8% |   563/8248 | ✓563 | ✗  0] ✓ tests/gateway/test_compress_command.py (4✓, 1.4s)
[  7.1% |   587/8248 | ✓587 | ✗  0] ✓ tests/gateway/test_config_cwd_bridge.py (24✓, 1.0s)
[  7.1% |   589/8248 | ✓589 | ✗  0] ✓ tests/gateway/test_debug_command.py (2✓, 0.8s)
[  7.4% |   612/8248 | ✓612 | ✗  0] ✓ tests/gateway/test_delivery.py (23✓, 0.8s)
[  7.4% |   614/8248 | ✓614 | ✗  0] ✓ tests/gateway/test_compress_focus.py (2✓, 1.5s)
[  7.5% |   620/8248 | ✓620 | ✗  0] ✓ tests/gateway/test_destructive_slash_confirm.py (6✓, 0.9s)
[  7.6% |   625/8248 | ✓625 | ✗  0] ✓ tests/gateway/test_cron_fire_webhook.py (5✓, 1.0s)
[  7.6% |   626/8248 | ✓626 | ✗  0] ✓ tests/gateway/test_compression_failure_session_sync.py (1✓, 1.5s)
[  8.1% |   664/8248 | ✓664 | ✗  0] ✓ tests/gateway/test_delivery_silence_filter.py (38✓, 1.0s)
[  8.1% |   668/8248 | ✓668 | ✗  0] ✓ tests/gateway/test_compression_session_id_persistence.py (4✓, 1.5s)
[  8.1% |   670/8248 | ✓670 | ✗  0] ✓ tests/gateway/test_compress_plugin_engine.py (2✓, 1.6s)
[  8.7% |   715/8248 | ✓715 | ✗  0] ✓ tests/gateway/test_config_driven_access_policy.py (45✓, 1.3s)
[  8.9% |   737/8248 | ✓737 | ✗  0] ✓ tests/gateway/test_api_server_runs.py (22✓, 3.5s)
[  9.1% |   752/8248 | ✓752 | ✗  0] ✓ tests/gateway/test_discord_allowed_channels.py (15✓, 0.9s)
[  9.3% |   771/8248 | ✓771 | ✗  0] ✓ tests/gateway/test_discord_allowed_mentions.py (19✓, 0.8s)
[  9.4% |   779/8248 | ✓779 | ✗  0] ✓ tests/gateway/test_discord_bot_filter.py (8✓, 0.8s)
[  9.6% |   788/8248 | ✓788 | ✗  0] ✓ tests/gateway/test_discord_bot_auth_bypass.py (9✓, 0.9s)
[  9.6% |   794/8248 | ✓794 | ✗  0] ✓ tests/gateway/test_discord_channel_skills.py (6✓, 0.8s)
[  9.8% |   808/8248 | ✓808 | ✗  0] ✓ tests/gateway/test_discord_attachment_download.py (14✓, 1.1s)
[  9.9% |   814/8248 | ✓814 | ✗  0] ✓ tests/gateway/test_config_env_bridge_authority.py (6✓, 2.0s)
[ 10.6% |   877/8248 | ✓877 | ✗  0] ✓ tests/gateway/test_diagnostic_isolation.py (63✓, 1.9s)
[ 10.9% |   897/8248 | ✓897 | ✗  0] ✓ tests/gateway/test_discord_clarify_buttons.py (20✓, 1.0s)
[ 11.2% |   925/8248 | ✓925 | ✗  0] ✓ tests/gateway/test_discord_component_auth.py (28✓, 1.0s)
[ 12.0% |   993/8248 | ✓993 | ✗  0] ✓ tests/gateway/test_dingtalk.py (68✓, 1.6s)
[ 12.2% |  1003/8248 | ✓1003 | ✗   0] ✓ tests/gateway/test_discord_channel_prompts.py (10✓, 1.3s)
[ 12.3% |  1017/8248 | ✓1017 | ✗   0] ✓ tests/gateway/test_discord_channel_controls.py (14✓, 1.3s)
[ 12.3% |  1018/8248 | ✓1018 | ✗   0] ✓ tests/gateway/test_discord_imports.py (1✓, 0.9s)
[ 14.3% |  1176/8248 | ✓1176 | ✗   0] ✓ tests/gateway/test_api_server.py (158✓, 4.9s)
[ 14.3% |  1178/8248 | ✓1178 | ✗   0] ✓ tests/gateway/test_discord_lazy_install_views.py (2✓, 0.9s)
[ 14.3% |  1179/8248 | ✓1179 | ✗   0] ✓ tests/gateway/test_discord_media_metadata.py (1✓, 0.9s)
[ 14.8% |  1222/8248 | ✓1222 | ✗   0] ✓ tests/gateway/test_discord_free_response.py (43✓, 1.2s)
[ 15.1% |  1242/8248 | ✓1242 | ✗   0] ✓ tests/gateway/test_discord_document_handling.py (20✓, 1.6s)
[ 15.1% |  1246/8248 | ✓1246 | ✗   0] ✓ tests/gateway/test_discord_opus.py (4✓, 0.9s)
[ 15.1% |  1247/8248 | ✓1247 | ✗   0] ✓ tests/gateway/test_discord_race_polish.py (1✓, 0.9s)
[ 15.2% |  1254/8248 | ✓1254 | ✗   0] ✓ tests/gateway/test_discord_reactions.py (7✓, 0.9s)
[ 15.4% |  1272/8248 | ✓1272 | ✗   0] ✓ tests/gateway/test_discord_connect.py (18✓, 1.8s)
[ 15.6% |  1284/8248 | ✓1284 | ✗   0] ✓ tests/gateway/test_discord_roles_dm_scope.py (12✓, 0.9s)
[ 15.7% |  1292/8248 | ✓1292 | ✗   0] ✓ tests/gateway/test_discord_system_messages.py (8✓, 0.8s)
[ 15.7% |  1292/8248 | ✓1292 | ✗   0] ✓ tests/gateway/test_discord_voice_mixer.py (1s, 0.8s)
[ 15.7% |  1294/8248 | ✓1294 | ✗   0] ✓ tests/gateway/test_discord_model_picker.py (2✓, 1.6s)
[ 15.8% |  1302/8248 | ✓1302 | ✗   0] ✓ tests/gateway/test_discord_thread_persistence.py (8✓, 0.9s)
[ 16.0% |  1320/8248 | ✓1320 | ✗   0] ✓ tests/gateway/test_discord_send.py (18✓, 1.2s)
[ 16.4% |  1352/8248 | ✓1352 | ✗   0] ✓ tests/gateway/test_discord_slash_auth.py (32✓, 1.2s)
[ 16.5% |  1359/8248 | ✓1359 | ✗   0] ✓ tests/gateway/test_dualcoach_activation_cutover.py (7✓, 0.9s)
[ 16.9% |  1391/8248 | ✓1391 | ✗   0] ✓ tests/gateway/test_document_cache.py (32✓, 1.0s)
[ 17.7% |  1458/8248 | ✓1458 | ✗   0] ✓ tests/gateway/test_config.py (67✓, 4.3s)
[ 17.8% |  1471/8248 | ✓1471 | ✗   0] ✓ tests/gateway/test_dualcoach_tasks21_25_controller.py (13✓, 0.9s)
[ 18.2% |  1504/8248 | ✓1504 | ✗   0] ✓ tests/gateway/test_discord_reply_mode.py (33✓, 1.8s)
[ 18.7% |  1540/8248 | ✓1540 | ✗   0] ✓ tests/gateway/test_dm_topics.py (36✓, 1.2s)
[ 19.2% |  1580/8248 | ✓1580 | ✗   0] ✓ tests/gateway/test_display_config.py (40✓, 1.3s)
[ 19.4% |  1604/8248 | ✓1604 | ✗   0] ✓ tests/gateway/test_duplicate_reply_suppression.py (24✓, 1.0s)
[ 19.5% |  1612/8248 | ✓1612 | ✗   0] ✓ tests/gateway/test_document_context_note.py (8✓, 1.4s)
[ 19.6% |  1616/8248 | ✓1616 | ✗   0] ✓ tests/gateway/test_fallback_eviction.py (4✓, 0.9s)
[ 19.8% |  1630/8248 | ✓1630 | ✗   0] ✓ tests/gateway/test_ephemeral_reply.py (14✓, 1.0s)
[ 20.2% |  1664/8248 | ✓1664 | ✗   0] ✓ tests/gateway/test_discord_slash_commands.py (34✓, 2.2s)
[ 20.8% |  1712/8248 | ✓1712 | ✗   0] ✓ tests/gateway/test_extract_local_files.py (48✓, 1.1s)
[ 20.8% |  1714/8248 | ✓1714 | ✗   0] ✓ tests/gateway/test_compression_concurrent_sessions.py (2✓, 5.2s)
[ 20.9% |  1720/8248 | ✓1720 | ✗   0] ✓ tests/gateway/test_feishu_bot_auth_bypass.py (6✓, 0.9s)
[ 20.9% |  1724/8248 | ✓1724 | ✗   0] ✓ tests/gateway/test_fast_command.py (4✓, 1.4s)
[ 21.1% |  1744/8248 | ✓1744 | ✗   0] ✓ tests/gateway/test_feishu_comment.py (20✓, 1.1s)
[ 21.9% |  1804/8248 | ✓1804 | ✗   0] ✓ tests/gateway/test_feishu_bot_admission.py (60✓, 1.3s)
[ 22.0% |  1813/8248 | ✓1813 | ✗   0] ✓ tests/gateway/test_fresh_reset_skill_injection.py (9✓, 0.9s)
[ 22.3% |  1843/8248 | ✓1843 | ✗   0] ✓ tests/gateway/test_feishu_comment_rules.py (30✓, 1.2s)
[ 22.5% |  1852/8248 | ✓1852 | ✗   0] ✓ tests/gateway/test_feishu_meeting_invite.py (9✓, 1.2s)
[ 22.6% |  1861/8248 | ✓1861 | ✗   0] ✓ tests/gateway/test_empty_model_recovery.py (9✓, 1.8s)
[ 23.0% |  1899/8248 | ✓1899 | ✗   0] ✓ tests/gateway/test_feishu_approval_buttons.py (38✓, 1.4s)
[ 23.4% |  1926/8248 | ✓1926 | ✗   0] ✓ tests/gateway/test_feishu_onboard.py (27✓, 1.2s)
[ 23.7% |  1951/8248 | ✓1951 | ✗   0] ✓ tests/gateway/test_gateway_command_line_matcher.py (25✓, 1.0s)
[ 24.1% |  1984/8248 | ✓1984 | ✗   0] ✓ tests/gateway/test_dualcoach_admin_provider_auth.py (33✓, 2.5s)
[ 24.1% |  1988/8248 | ✓1988 | ✗   0] ✓ tests/gateway/test_gateway_command_help.py (4✓, 1.1s)
[ 24.9% |  2056/8248 | ✓2056 | ✗   0] ✓ tests/gateway/test_agent_cache.py (68✓, 7.9s)
[ 25.8% |  2124/8248 | ✓2124 | ✗   0] ✓ tests/gateway/test_email.py (68✓, 2.3s)
[ 25.9% |  2136/8248 | ✓2136 | ✗   0] ✓ tests/gateway/test_insights_unicode_flags.py (12✓, 0.8s)
[ 25.9% |  2137/8248 | ✓2137 | ✗   0] ✓ tests/gateway/test_goal_max_turns_config.py (1✓, 1.1s)
[ 26.2% |  2158/8248 | ✓2158 | ✗   0] ✓ tests/gateway/test_hooks.py (21✓, 0.9s)
[ 26.2% |  2164/8248 | ✓2164 | ✗   0] ✓ tests/gateway/test_interrupt_key_match.py (6✓, 0.8s)
[ 26.3% |  2167/8248 | ✓2167 | ✗   0] ✓ tests/gateway/test_goal_status_notice.py (3✓, 1.2s)
[ 26.3% |  2172/8248 | ✓2172 | ✗   0] ✓ tests/gateway/test_goal_verdict_send.py (5✓, 1.1s)
[ 26.4% |  2176/8248 | ✓2176 | ✗   0] ✓ tests/gateway/test_kanban_watchers_mixin.py (4✓, 0.8s)
[ 26.5% |  2184/8248 | ✓2184 | ✗   0] ✓ tests/gateway/test_internal_event_bypass_pairing.py (8✓, 1.2s)
[ 26.6% |  2191/8248 | ✓2191 | ✗   0] ✓ tests/gateway/test_home_target_env_var.py (7✓, 1.3s)
[ 27.1% |  2236/8248 | ✓2236 | ✗   0] ✓ tests/gateway/test_homeassistant.py (45✓, 1.3s)
[ 27.2% |  2242/8248 | ✓2242 | ✗   0] ✓ tests/gateway/test_gateway_silence_tokens.py (6✓, 1.8s)
[ 27.2% |  2245/8248 | ✓2245 | ✗   0] ✓ tests/gateway/test_kanban_notifier_watcher_dispatch_gate.py (3✓, 1.1s)
[ 27.3% |  2251/8248 | ✓2251 | ✗   0] ✓ tests/gateway/test_kanban_notifier.py (6✓, 1.1s)
[ 29.8% |  2456/8248 | ✓2411 | ✗   0] ✓ tests/gateway/test_feishu.py (160✓ 45s, 2.9s)
[ 29.8% |  2457/8248 | ✓2412 | ✗   0] ✓ tests/gateway/test_load_transcript_db_only.py (1✓, 0.7s)
[ 29.8% |  2459/8248 | ✓2414 | ✗   0] ✓ tests/gateway/test_matrix_exec_approval.py (2✓, 0.7s)
[ 29.9% |  2463/8248 | ✓2418 | ✗   0] ✓ tests/gateway/test_matrix_approval_reaction_fail_closed.py (4✓, 0.8s)
[ 29.9% |  2463/8248 | ✓2418 | ✗   0] ✓ tests/gateway/test_matrix_voice.py (1s, 0.7s)
[ 30.8% |  2539/8248 | ✓2494 | ✗   0] ✓ tests/gateway/test_line_plugin.py (76✓, 1.2s)
[ 31.8% |  2624/8248 | ✓2579 | ✗   0] ✓ tests/gateway/test_korean_humanizer.py (85✓, 1.3s)
[ 32.0% |  2643/8248 | ✓2598 | ✗   0] ✓ tests/gateway/test_matrix_project_context_isolation.py (19✓, 0.9s)
[ 32.7% |  2695/8248 | ✓2650 | ✗   0] ✓ tests/gateway/test_matrix_mention.py (52✓, 1.0s)
[ 32.8% |  2709/8248 | ✓2664 | ✗   0] ✓ tests/gateway/test_loop_exception_handler.py (14✓, 1.3s)
[ 33.0% |  2722/8248 | ✓2677 | ✗   0] ✓ tests/gateway/test_media_extraction.py (13✓, 0.8s)
[ 33.1% |  2728/8248 | ✓2683 | ✗   0] ✓ tests/gateway/test_max_tokens_propagation.py (6✓, 1.2s)
[ 35.0% |  2888/8248 | ✓2843 | ✗   0] ✓ tests/gateway/test_google_chat.py (160✓, 2.8s)
[ 35.5% |  2924/8248 | ✓2879 | ✗   0] ✓ tests/gateway/test_media_download_retry.py (36✓, 1.2s)
[ 35.6% |  2940/8248 | ✓2893 | ✗   0] ✓ tests/gateway/test_media_metadata_contract.py (14✓ 2s, 1.1s)
[ 35.7% |  2948/8248 | ✓2901 | ✗   0] ✓ tests/gateway/test_message_deduplicator.py (8✓, 0.9s)
[ 35.8% |  2953/8248 | ✓2906 | ✗   0] ✓ tests/gateway/test_max_concurrent_sessions.py (5✓, 1.6s)
[ 36.0% |  2968/8248 | ✓2921 | ✗   0] ✓ tests/gateway/test_mirror.py (15✓, 0.8s)
[ 36.1% |  2978/8248 | ✓2931 | ✗   0] ✓ tests/gateway/test_memory_monitor.py (10✓, 1.3s)
[ 36.1% |  2981/8248 | ✓2934 | ✗   0] ✓ tests/gateway/test_mcp_reload_refreshes_cached_agents.py (3✓, 1.8s)
[ 36.8% |  3039/8248 | ✓2992 | ✗   0] ✓ tests/gateway/test_mattermost.py (58✓, 2.1s)
[ 37.4% |  3083/8248 | ✓3036 | ✗   0] ✓ tests/gateway/test_irc_adapter.py (44✓, 3.2s)
[ 37.4% |  3087/8248 | ✓3040 | ✗   0] ✓ tests/gateway/test_model_command_expensive_confirm.py (4✓, 1.3s)
[ 37.5% |  3092/8248 | ✓3045 | ✗   0] ✓ tests/gateway/test_multiplex_lifecycle.py (5✓, 0.7s)
[ 37.6% |  3101/8248 | ✓3054 | ✗   0] ✓ tests/gateway/test_model_switch_persistence.py (9✓, 0.8s)
[ 37.7% |  3109/8248 | ✓3062 | ✗   0] ✓ tests/gateway/test_message_timestamps.py (8✓, 1.6s)
[ 37.7% |  3110/8248 | ✓3063 | ✗   0] ✓ tests/gateway/test_model_command_custom_providers.py (1✓, 1.5s)
[ 37.7% |  3113/8248 | ✓3066 | ✗   0] ✓ tests/gateway/test_model_picker_persist.py (3✓, 1.1s)
[ 37.8% |  3120/8248 | ✓3073 | ✗   0] ✓ tests/gateway/test_multiplex_http_routing.py (7✓, 0.9s)
[ 37.9% |  3129/8248 | ✓3082 | ✗   0] ✓ tests/gateway/test_multiplex_adapter_registry.py (9✓, 1.2s)
[ 38.0% |  3136/8248 | ✓3089 | ✗   0] ✓ tests/gateway/test_multiplex_credential_isolation.py (7✓, 1.3s)
[ 38.1% |  3141/8248 | ✓3094 | ✗   0] ✓ tests/gateway/test_model_command_flat_string_config.py (5✓, 1.6s)
[ 38.4% |  3168/8248 | ✓3121 | ✗   0] ✓ tests/gateway/test_msgraph_webhook.py (27✓, 1.5s)
[ 38.7% |  3193/8248 | ✓3146 | ✗   0] ✓ tests/gateway/test_multiplex_phase0.py (25✓, 1.0s)
[ 38.7% |  3195/8248 | ✓3148 | ✗   0] ✓ tests/gateway/test_native_image_buffer_isolation.py (2✓, 1.1s)
[ 38.8% |  3198/8248 | ✓3151 | ✗   0] ✓ tests/gateway/test_notice_delivery.py (3✓, 1.1s)
[ 39.3% |  3241/8248 | ✓3194 | ✗   0] ✓ tests/gateway/test_pairing.py (43✓, 0.9s)
[ 39.4% |  3250/8248 | ✓3203 | ✗   0] ✓ tests/gateway/test_notice_rendering.py (9✓, 1.3s)
[ 39.4% |  3253/8248 | ✓3206 | ✗   0] ✓ tests/gateway/test_pending_drain_race.py (3✓, 1.0s)
[ 40.3% |  3326/8248 | ✓3279 | ✗   0] ✓ tests/gateway/test_nutrition_coaching_judgment.py (73✓, 1.2s)
[ 43.1% |  3556/8248 | ✓3509 | ✗   0] ✓ tests/gateway/test_matrix.py (230✓, 4.0s)
[ 43.5% |  3586/8248 | ✓3539 | ✗   0] ✓ tests/gateway/test_nutrition_onboarding_reconciliation.py (30✓, 1.3s)
[ 44.5% |  3668/8248 | ✓3621 | ✗   0] ✓ tests/gateway/test_ntfy_plugin.py (82✓, 1.4s)
[ 44.7% |  3684/8248 | ✓3637 | ✗   0] ✓ tests/gateway/test_pii_redaction.py (16✓, 0.8s)
[ 45.1% |  3719/8248 | ✓3671 | ✗   0] ✓ tests/gateway/test_platform_connected_checkers.py (34✓ 1s, 0.8s)
[ 45.2% |  3725/8248 | ✓3677 | ✗   0] ✓ tests/gateway/test_pending_event_none.py (6✓, 1.2s)
[ 45.2% |  3729/8248 | ✓3681 | ✗   0] ✓ tests/gateway/test_per_platform_streaming_defaults.py (4✓, 1.2s)
[ 45.3% |  3736/8248 | ✓3681 | ✗   0] ✓ tests/gateway/test_plugin_platform_interface.py (7s, 0.7s)
[ 45.4% |  3743/8248 | ✓3688 | ✗   0] ✓ tests/gateway/test_platform_http_client_limits.py (7✓, 1.0s)
[ 45.4% |  3748/8248 | ✓3693 | ✗   0] ✓ tests/gateway/test_pre_gateway_dispatch.py (5✓, 0.8s)
[ 45.6% |  3757/8248 | ✓3702 | ✗   0] ✓ tests/gateway/test_post_delivery_callback_chaining.py (9✓, 0.9s)
[ 45.6% |  3764/8248 | ✓3709 | ✗   0] ✓ tests/gateway/test_platform_reconnect_fd_leak.py (7✓, 1.2s)
[ 47.5% |  3914/8248 | ✓3857 | ✗   0] ✓ tests/gateway/test_platform_base.py (148✓ 2s, 1.8s)
[ 47.5% |  3918/8248 | ✓3861 | ✗   0] ✓ tests/gateway/test_relay_capability_surface.py (4✓, 0.6s)
[ 47.7% |  3932/8248 | ✓3875 | ✗   0] ✓ tests/gateway/test_queue_consumption.py (14✓, 1.0s)
[ 47.9% |  3948/8248 | ✓3891 | ✗   0] ✓ tests/gateway/test_raft_adapter.py (16✓, 0.9s)
[ 47.9% |  3952/8248 | ✓3895 | ✗   0] ✓ tests/gateway/test_reload_skills_command.py (4✓, 0.8s)
[ 48.0% |  3957/8248 | ✓3900 | ✗   0] ✓ tests/gateway/test_reload_skills_discord_resync.py (5✓, 0.8s)
[ 48.2% |  3979/8248 | ✓3922 | ✗   0] ✓ tests/gateway/test_proxy_mode.py (22✓, 1.7s)
[ 48.3% |  3982/8248 | ✓3925 | ✗   0] ✓ tests/gateway/test_response_filters.py (3✓, 0.6s)
[ 48.9% |  4032/8248 | ✓3975 | ✗   0] ✓ tests/gateway/test_platform_registry.py (50✓, 2.2s)
[ 49.1% |  4050/8248 | ✓3993 | ✗   0] ✓ tests/gateway/test_reasoning_command.py (18✓, 1.5s)
[ 49.5% |  4080/8248 | ✓4023 | ✗   0] ✓ tests/gateway/test_platform_reconnect.py (30✓, 2.4s)
[ 49.7% |  4096/8248 | ✓4039 | ✗   0] ✓ tests/gateway/test_replay_entry_fields.py (16✓, 1.2s)
[ 49.7% |  4102/8248 | ✓4045 | ✗   0] ✓ tests/gateway/test_reply_to_injection.py (6✓, 1.0s)
[ 49.9% |  4113/8248 | ✓4056 | ✗   0] ✓ tests/gateway/test_planned_stop_watcher.py (11✓, 2.9s)
[ 50.0% |  4122/8248 | ✓4065 | ✗   0] ✓ tests/gateway/test_read_only_preflight_config.py (9✓, 1.7s)
[ 50.2% |  4139/8248 | ✓4082 | ✗   0] ✓ tests/gateway/test_resume_command.py (17✓, 0.9s)
[ 50.3% |  4148/8248 | ✓4091 | ✗   0] ✓ tests/gateway/test_restart_redelivery_dedup.py (9✓, 1.1s)
[ 50.4% |  4153/8248 | ✓4096 | ✗   0] ✓ tests/gateway/test_keep_typing_timeout.py (5✓, 7.3s)
[ 50.7% |  4180/8248 | ✓4123 | ✗   0] ✓ tests/gateway/test_restart_notification.py (27✓, 1.4s)
[ 50.7% |  4182/8248 | ✓4125 | ✗   0] ✓ tests/gateway/test_retry_replacement.py (2✓, 1.1s)
[ 50.9% |  4201/8248 | ✓4144 | ✗   0] ✓ tests/gateway/test_restart_drain.py (19✓, 1.7s)
[ 51.0% |  4203/8248 | ✓4146 | ✗   0] ✓ tests/gateway/test_retry_response.py (2✓, 1.0s)
[ 51.3% |  4234/8248 | ✓4177 | ✗   0] ✓ tests/gateway/test_run_tool_media_re.py (31✓, 1.0s)
[ 53.4% |  4403/8248 | ✓4346 | ✗   0] ✓ tests/gateway/test_nutrition_coaching.py (169✓, 4.6s)
[ 53.4% |  4408/8248 | ✓4351 | ✗   0] ✓ tests/gateway/test_running_agent_session_toggles.py (5✓, 0.7s)
[ 55.4% |  4569/8248 | ✓4512 | ✗   0] ✓ tests/gateway/test_qqbot.py (161✓, 3.3s)
[ 55.7% |  4594/8248 | ✓4537 | ✗   0] ✓ tests/gateway/test_runtime_footer.py (25✓, 0.7s)
[ 55.7% |  4597/8248 | ✓4540 | ✗   0] ✓ tests/gateway/test_runtime_env_reload_config_authority.py (3✓, 1.0s)
[ 55.8% |  4601/8248 | ✓4544 | ✗   0] ✓ tests/gateway/test_safe_adapter_disconnect.py (4✓, 0.9s)
[ 56.2% |  4636/8248 | ✓4579 | ✗   0] ✓ tests/gateway/test_send_retry.py (35✓, 0.8s)
[ 56.3% |  4645/8248 | ✓4588 | ✗   0] ✓ tests/gateway/test_runtime_config_env_expansion.py (9✓, 1.3s)
[ 56.4% |  4650/8248 | ✓4593 | ✗   0] ✓ tests/gateway/test_pending_drain_no_recursion.py (5✓, 5.4s)
[ 56.4% |  4652/8248 | ✓4595 | ✗   0] ✓ tests/gateway/test_run_progress_interrupt.py (2✓, 2.1s)
[ 56.6% |  4671/8248 | ✓4614 | ✗   0] ✓ tests/gateway/test_send_multiple_images.py (19✓, 1.2s)
[ 56.9% |  4694/8248 | ✓4637 | ✗   0] ✓ tests/gateway/test_send_image_file.py (23✓, 1.2s)
[ 56.9% |  4697/8248 | ✓4640 | ✗   0] ✓ tests/gateway/test_runner_fatal_adapter.py (3✓, 2.0s)
[ 57.0% |  4699/8248 | ✓4642 | ✗   0] ✓ tests/gateway/test_send_voice_reply_notify.py (2✓, 1.1s)
[ 57.0% |  4704/8248 | ✓4647 | ✗   0] ✓ tests/gateway/test_session_boundary_security_state.py (5✓, 0.8s)
[ 58.0% |  4783/8248 | ✓4726 | ✗   0] ✓ tests/gateway/test_session.py (79✓, 1.2s)
[ 58.1% |  4795/8248 | ✓4738 | ✗   0] ✓ tests/gateway/test_session_api.py (12✓, 1.0s)
[ 58.3% |  4805/8248 | ✓4748 | ✗   0] ✓ tests/gateway/test_session_dm_thread_seeding.py (10✓, 0.7s)
[ 58.3% |  4808/8248 | ✓4751 | ✗   0] ✓ tests/gateway/test_session_model_reset.py (3✓, 0.7s)
[ 58.6% |  4831/8248 | ✓4774 | ✗   0] ✓ tests/gateway/test_session_hygiene.py (23✓, 1.0s)
[ 58.8% |  4847/8248 | ✓4790 | ✗   0] ✓ tests/gateway/test_session_reset_notify.py (16✓, 0.6s)
[ 58.8% |  4851/8248 | ✓4794 | ✗   0] ✓ tests/gateway/test_session_list_allowed_sources.py (4✓, 0.8s)
[ 59.0% |  4863/8248 | ✓4806 | ✗   0] ✓ tests/gateway/test_session_state_cleanup.py (12✓, 0.7s)
[ 59.0% |  4867/8248 | ✓4810 | ✗   0] ✓ tests/gateway/test_session_override_thread_recovery.py (4✓, 1.1s)
[ 59.2% |  4881/8248 | ✓4824 | ✗   0] ✓ tests/gateway/test_session_env.py (14✓, 1.3s)
[ 59.4% |  4899/8248 | ✓4842 | ✗   0] ✓ tests/gateway/test_session_store_prune.py (18✓, 0.8s)
[ 59.4% |  4903/8248 | ✓4846 | ✗   0] ✓ tests/gateway/test_session_model_override_routing.py (4✓, 1.2s)
[ 59.6% |  4916/8248 | ✓4859 | ✗   0] ✓ tests/gateway/test_session_split_brain_11016.py (13✓, 1.3s)
[ 59.8% |  4930/8248 | ✓4873 | ✗   0] ✓ tests/gateway/test_setup_feishu.py (14✓, 0.9s)
[ 59.8% |  4932/8248 | ✓4875 | ✗   0] ✓ tests/gateway/test_shared_group_sender_prefix.py (2✓, 1.0s)
[ 60.0% |  4950/8248 | ✓4893 | ✗   0] ✓ tests/gateway/test_signal_rate_limit.py (18✓, 0.7s)
[ 60.1% |  4957/8248 | ✓4893 | ✗   7] ✗ tests/gateway/test_shutdown_memory_provider_messages.py (7✗, 0.9s)

  ╔╍ Failed: tests/gateway/test_shutdown_memory_provider_messages.py ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍
  ║     - Home channels for each platform
  ║     - Session reset policies
  ║     - Delivery preferences
  ║     """
  ║     
  ║     import hashlib
  ║     import io
  ║     import logging
  ║     import os
  ║     import json
  ║     import stat
  ║     from pathlib import Path
  ║     from dataclasses import dataclass, field
  ║     from typing import Dict, List, Optional, Any, Callable, Mapping
  ║     from enum import Enum
  ║     
  ║     import yaml
  ║ >   from dotenv import dotenv_values
  ║ E   ImportError: cannot import name 'dotenv_values' from 'dotenv' (unknown location)
  ║ 
  ║ gateway/config.py:23: ImportError
  ║ =========================== short test summary info ============================
  ║ FAILED tests/gateway/test_shutdown_memory_provider_messages.py::TestCleanupAgentResourcesPassesMessages::test_populated_messages_forwarded
  ║ FAILED tests/gateway/test_shutdown_memory_provider_messages.py::TestCleanupAgentResourcesPassesMessages::test_empty_list_still_forwarded
  ║ FAILED tests/gateway/test_shutdown_memory_provider_messages.py::TestCleanupAgentResourcesPassesMessages::test_missing_attribute_falls_back_to_no_arg
  ║ FAILED tests/gateway/test_shutdown_memory_provider_messages.py::TestCleanupAgentResourcesPassesMessages::test_non_list_attribute_falls_back_to_no_arg
  ║ FAILED tests/gateway/test_shutdown_memory_provider_messages.py::TestCleanupAgentResourcesPassesMessages::test_provider_exception_is_swallowed
  ║ FAILED tests/gateway/test_shutdown_memory_provider_messages.py::TestCleanupAgentResourcesPassesMessages::test_none_agent_is_noop
  ║ FAILED tests/gateway/test_shutdown_memory_provider_messages.py::TestCleanupAgentResourcesPassesMessages::test_agent_without_shutdown_method_is_tolerated
  ║ ============================== 7 failed in 0.33s ===============================
  ║
  ║  Repro: python -m pytest tests/gateway/test_shutdown_memory_provider_messages.py
  ╚╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍

[ 60.2% |  4965/8248 | ✓4901 | ✗   7] ✓ tests/gateway/test_shutdown_cache_cleanup.py (8✓, 1.1s)
[ 60.3% |  4970/8248 | ✓4906 | ✗   7] ✓ tests/gateway/test_run_cleanup_progress.py (5✓, 4.0s)
[ 60.4% |  4979/8248 | ✓4915 | ✗   7] ✓ tests/gateway/test_session_info.py (9✓, 2.0s)
[ 61.0% |  5033/8248 | ✓4969 | ✗   7] ✓ tests/gateway/test_signal_format.py (54✓, 0.9s)
[ 61.2% |  5044/8248 | ✓4980 | ✗   7] ✓ tests/gateway/test_runner_startup_failures.py (11✓, 4.0s)
[ 61.5% |  5074/8248 | ✓5010 | ✗   7] ✓ tests/gateway/test_shutdown_forensics.py (30✓, 1.4s)
[ 61.8% |  5100/8248 | ✓5036 | ✗   7] ✓ tests/gateway/test_slack_approval_buttons.py (26✓, 0.8s)
[ 62.0% |  5111/8248 | ✓5047 | ✗   7] ✓ tests/gateway/test_slack_channel_skills.py (11✓, 0.6s)
[ 62.1% |  5118/8248 | ✓5054 | ✗   7] ✓ tests/gateway/test_slack_channel_session_scope.py (7✓, 0.8s)
[ 62.3% |  5139/8248 | ✓5075 | ✗   7] ✓ tests/gateway/test_slash_access.py (21✓, 0.7s)
[ 62.5% |  5153/8248 | ✓5089 | ✗   7] ✓ tests/gateway/test_slack_plugin_action_handlers.py (14✓, 0.8s)
[ 62.8% |  5183/8248 | ✓5119 | ✗   7] ✓ tests/gateway/test_simplex_plugin.py (30✓, 1.4s)
[ 64.4% |  5309/8248 | ✓5245 | ✗   7] ✓ tests/gateway/test_signal.py (126✓, 1.8s)
[ 64.4% |  5311/8248 | ✓5247 | ✗   7] ✓ tests/gateway/test_ssl_cert_detection.py (2✓, 0.7s)
[ 64.5% |  5317/8248 | ✓5253 | ✗   7] ✓ tests/gateway/test_sse_agent_cancel.py (6✓, 0.9s)
[ 64.5% |  5320/8248 | ✓5256 | ✗   7] ✓ tests/gateway/test_ssl_certs.py (3✓, 0.6s)
[ 64.7% |  5338/8248 | ✓5274 | ✗   7] ✓ tests/gateway/test_slash_access_dispatch.py (18✓, 1.3s)
[ 64.8% |  5343/8248 | ✓5279 | ✗   7] ✓ tests/gateway/test_steer_command.py (5✓, 0.7s)
[ 65.3% |  5382/8248 | ✓5318 | ✗   7] ✓ tests/gateway/test_sms.py (39✓, 1.4s)
[ 65.5% |  5399/8248 | ✓5335 | ✗   7] ✓ tests/gateway/test_sticker_cache.py (17✓, 0.8s)
[ 66.3% |  5472/8248 | ✓5408 | ✗   7] ✓ tests/gateway/test_status.py (73✓, 1.0s)
[ 67.0% |  5527/8248 | ✓5463 | ✗   7] ✓ tests/gateway/test_slack_mention.py (55✓, 1.7s)
[ 67.2% |  5544/8248 | ✓5480 | ✗   7] ✓ tests/gateway/test_status_command.py (17✓, 1.1s)
[ 67.3% |  5548/8248 | ✓5484 | ✗   7] ✓ tests/gateway/test_step_callback_compat.py (4✓, 0.9s)
[ 67.3% |  5555/8248 | ✓5491 | ✗   7] ✓ tests/gateway/test_stop_thread_sibling.py (7✓, 0.9s)
[ 67.5% |  5568/8248 | ✓5504 | ✗   7] ✓ tests/gateway/test_stream_events.py (13✓, 0.6s)
[ 67.6% |  5577/8248 | ✓5513 | ✗   7] ✓ tests/gateway/test_stream_consumer_thread_routing.py (9✓, 0.8s)
[ 67.7% |  5584/8248 | ✓5520 | ✗   7] ✓ tests/gateway/test_stt_config.py (7✓, 1.1s)
[ 67.9% |  5602/8248 | ✓5538 | ✗   7] ✓ tests/gateway/test_stream_consumer_draft.py (18✓, 1.5s)
[ 68.0% |  5611/8248 | ✓5547 | ✗   7] ✓ tests/gateway/test_stuck_loop.py (9✓, 1.0s)
[ 68.1% |  5621/8248 | ✓5557 | ✗   7] ✓ tests/gateway/test_telegram_activation_notice.py (10✓, 0.8s)
[ 68.2% |  5628/8248 | ✓5564 | ✗   7] ✓ tests/gateway/test_teams_pipeline_runtime_wiring.py (7✓, 1.0s)
[ 68.9% |  5685/8248 | ✓5621 | ✗   7] ✓ tests/gateway/test_teams.py (57✓, 1.1s)
[ 69.1% |  5702/8248 | ✓5638 | ✗   7] ✓ tests/gateway/test_subagent_protection_30170.py (17✓, 1.2s)
[ 69.2% |  5707/8248 | ✓5643 | ✗   7] ✓ tests/gateway/test_telegram_audio_vs_voice.py (5✓, 0.7s)
[ 69.5% |  5735/8248 | ✓5671 | ✗   7] ✓ tests/gateway/test_stream_consumer_fresh_final.py (28✓, 1.7s)
[ 70.0% |  5772/8248 | ✓5708 | ✗   7] ✓ tests/gateway/test_task7_generation_hardening.py (37✓, 1.2s)
[ 70.2% |  5792/8248 | ✓5728 | ✗   7] ✓ tests/gateway/test_telegram_approval_buttons.py (20✓, 1.1s)
[ 70.3% |  5797/8248 | ✓5733 | ✗   7] ✓ tests/gateway/test_telegram_callback_auth_fail_closed.py (5✓, 0.8s)
[ 70.4% |  5810/8248 | ✓5746 | ✗   7] ✓ tests/gateway/test_telegram_caption_merge.py (13✓, 0.8s)
[ 70.5% |  5816/8248 | ✓5752 | ✗   7] ✓ tests/gateway/test_session_boundary_hooks.py (6✓, 6.0s)
[ 70.6% |  5819/8248 | ✓5755 | ✗   7] ✓ tests/gateway/test_telegram_channel_posts.py (3✓, 0.9s)
[ 72.9% |  6015/8248 | ✓5951 | ✗   7] ✓ tests/gateway/test_slack.py (196✓, 3.9s)
[ 73.1% |  6027/8248 | ✓5963 | ✗   7] ✓ tests/gateway/test_telegram_clarify_buttons.py (12✓, 1.1s)
[ 73.1% |  6032/8248 | ✓5968 | ✗   7] ✓ tests/gateway/test_telegram_forum_commands.py (5✓, 1.0s)
[ 73.2% |  6035/8248 | ✓5971 | ✗   7] ✓ tests/gateway/test_telegram_mock_bootstrap.py (3✓, 0.5s)
[ 73.2% |  6041/8248 | ✓5977 | ✗   7] ✓ tests/gateway/test_telegram_customer_bootstrap.py (6✓, 1.1s)
[ 73.3% |  6044/8248 | ✓5980 | ✗   7] ✓ tests/gateway/test_telegram_max_doc_bytes.py (3✓, 0.9s)
[ 73.5% |  6063/8248 | ✓5999 | ✗   7] ✓ tests/gateway/test_telegram_mention_boundaries.py (19✓, 1.0s)
[ 74.7% |  6164/8248 | ✓6100 | ✗   7] ✓ tests/gateway/test_telegram_format.py (101✓, 1.5s)
[ 74.9% |  6174/8248 | ✓6110 | ✗   7] ✓ tests/gateway/test_telegram_conflict.py (10✓, 1.8s)
[ 75.0% |  6189/8248 | ✓6125 | ✗   7] ✓ tests/gateway/test_telegram_network_reconnect.py (15✓, 1.0s)
[ 75.3% |  6208/8248 | ✓6144 | ✗   7] ✓ tests/gateway/test_session_race_guard.py (19✓, 6.3s)
[ 75.5% |  6228/8248 | ✓6164 | ✗   7] ✓ tests/gateway/test_telegram_nutrition_addresses.py (20✓, 0.7s)
[ 75.6% |  6237/8248 | ✓6173 | ✗   7] ✓ tests/gateway/test_telegram_nutrition_onboarding_copy.py (9✓, 0.7s)
[ 75.7% |  6243/8248 | ✓6179 | ✗   7] ✓ tests/gateway/test_telegram_noise_filter.py (6✓, 1.1s)
[ 76.2% |  6289/8248 | ✓6225 | ✗   7] ✓ tests/gateway/test_telegram_network.py (46✓, 1.3s)
[ 76.3% |  6295/8248 | ✓6231 | ✗   7] ✓ tests/gateway/test_telegram_model_picker.py (6✓, 1.5s)
[ 76.5% |  6310/8248 | ✓6246 | ✗   7] ✓ tests/gateway/test_telegram_nutrition_onboarding_callback_observability.py (15✓, 1.0s)
[ 77.7% |  6405/8248 | ✓6341 | ✗   7] ✓ tests/gateway/test_telegram_group_gating.py (95✓, 2.1s)
[ 77.7% |  6410/8248 | ✓6346 | ✗   7] ✓ tests/gateway/test_telegram_nutrition_onboarding_direct_entry.py (5✓, 1.1s)
[ 77.8% |  6414/8248 | ✓6350 | ✗   7] ✓ tests/gateway/test_telegram_overflow_partial.py (4✓, 0.8s)
[ 77.9% |  6422/8248 | ✓6358 | ✗   7] ✓ tests/gateway/test_telegram_nutrition_onboarding_preview.py (8✓, 1.1s)
[ 78.0% |  6435/8248 | ✓6371 | ✗   7] ✓ tests/gateway/test_telegram_nutrition_operator_console.py (13✓, 1.0s)
[ 78.1% |  6438/8248 | ✓6374 | ✗   7] ✓ tests/gateway/test_telegram_polling_receipts_multiprocess.py (3✓, 0.7s)
[ 78.3% |  6458/8248 | ✓6394 | ✗   7] ✓ tests/gateway/test_gateway_shutdown.py (20✓, 17.2s)
[ 78.4% |  6467/8248 | ✓6403 | ✗   7] ✓ tests/gateway/test_telegram_nutrition_onboarding_preview_runtime.py (9✓, 1.2s)
[ 78.4% |  6468/8248 | ✓6404 | ✗   7] ✓ tests/gateway/test_telegram_photo_interrupts.py (1✓, 1.2s)
[ 78.7% |  6490/8248 | ✓6426 | ✗   7] ✓ tests/gateway/test_telegram_progress_edit_transient.py (22✓, 0.9s)
[ 79.4% |  6552/8248 | ✓6488 | ✗   7] ✓ tests/gateway/test_telegram_nutrition_onboarding.py (62✓, 2.0s)
[ 79.6% |  6569/8248 | ✓6505 | ✗   7] ✓ tests/gateway/test_telegram_polling_receipts.py (17✓, 1.4s)
[ 79.9% |  6590/8248 | ✓6526 | ✗   7] ✓ tests/gateway/test_telegram_reactions.py (21✓, 1.3s)
[ 79.9% |  6593/8248 | ✓6529 | ✗   7] ✓ tests/gateway/test_telegram_slash_confirm.py (3✓, 0.8s)
[ 80.0% |  6597/8248 | ✓6533 | ✗   7] ✓ tests/gateway/test_telegram_reply_quote.py (4✓, 1.0s)
[ 80.0% |  6600/8248 | ✓6536 | ✗   7] ✓ tests/gateway/test_telegram_send_draft_format.py (3✓, 0.9s)
[ 80.1% |  6604/8248 | ✓6540 | ✗   7] ✓ tests/gateway/test_telegram_room_bootstrap_adversarial.py (4✓, 1.1s)
[ 80.1% |  6606/8248 | ✓6542 | ✗   7] ✓ tests/gateway/test_telegram_staff_membership_polling.py (2✓, 0.8s)
[ 80.2% |  6617/8248 | ✓6553 | ✗   7] ✓ tests/gateway/test_telegram_staff_membership_gate.py (11✓, 0.9s)
[ 80.3% |  6622/8248 | ✓6558 | ✗   7] ✓ tests/gateway/test_telegram_status_update.py (5✓, 0.8s)
[ 80.4% |  6631/8248 | ✓6567 | ✗   7] ✓ tests/gateway/test_telegram_status_indicator.py (9✓, 0.8s)
[ 81.1% |  6686/8248 | ✓6622 | ✗   7] ✓ tests/gateway/test_telegram_rich_messages.py (55✓, 1.3s)
[ 81.6% |  6727/8248 | ✓6663 | ✗   7] ✓ tests/gateway/test_telegram_documents.py (41✓, 3.9s)
[ 83.1% |  6855/8248 | ✓6791 | ✗   7] ✓ tests/gateway/test_telegram_physique_checkin.py (128✓, 2.1s)
[ 83.6% |  6895/8248 | ✓6831 | ✗   7] ✓ tests/gateway/test_telegram_reply_mode.py (40✓, 1.8s)
[ 83.7% |  6900/8248 | ✓6836 | ✗   7] ✓ tests/gateway/test_telegram_webhook_secret.py (5✓, 0.6s)
[ 83.8% |  6912/8248 | ✓6848 | ✗   7] ✓ tests/gateway/test_telegram_text_batch_perf.py (12✓, 0.9s)
[ 83.9% |  6920/8248 | ✓6856 | ✗   7] ✓ tests/gateway/test_tool_response_drop_recovery.py (8✓, 0.7s)
[ 84.0% |  6925/8248 | ✓6861 | ✗   7] ✓ tests/gateway/test_unavailable_skill_hint.py (5✓, 0.7s)
[ 84.2% |  6941/8248 | ✓6877 | ✗   7] ✓ tests/gateway/test_title_command.py (16✓, 1.0s)
[ 84.2% |  6943/8248 | ✓6879 | ✗   7] ✓ tests/gateway/test_telegram_voice_v0_regressions.py (2✓, 1.2s)
[ 84.6% |  6976/8248 | ✓6912 | ✗   7] ✓ tests/gateway/test_unauthorized_dm_behavior.py (33✓, 0.8s)
[ 84.7% |  6982/8248 | ✓6918 | ✗   7] ✓ tests/gateway/test_trainer_free_v1_contract.py (6✓, 1.0s)
[ 85.2% |  7026/8248 | ✓6962 | ✗   7] ✓ tests/gateway/test_telegram_topic_mode.py (44✓, 1.4s)
[ 85.3% |  7032/8248 | ✓6968 | ✗   7] ✓ tests/gateway/test_undo_rewind_session.py (6✓, 0.7s)
[ 85.4% |  7040/8248 | ✓6976 | ✗   7] ✓ tests/gateway/test_transcript_offset.py (8✓, 1.1s)
[ 85.4% |  7047/8248 | ✓6983 | ✗   7] ✓ tests/gateway/test_tts_media_routing.py (7✓, 1.0s)
[ 85.6% |  7058/8248 | ✓6994 | ✗   7] ✓ tests/gateway/test_unknown_command.py (11✓, 1.2s)
[ 85.6% |  7059/8248 | ✓6995 | ✗   7] ✓ tests/gateway/test_video_context_note.py (1✓, 0.7s)
[ 85.7% |  7065/8248 | ✓7001 | ✗   7] ✓ tests/gateway/test_telegram_text_batching.py (6✓, 2.2s)
[ 85.8% |  7073/8248 | ✓7009 | ✗   7] ✓ tests/gateway/test_usage_command.py (8✓, 0.8s)
[ 85.8% |  7076/8248 | ✓7012 | ✗   7] ✓ tests/gateway/test_vision_memory_leak.py (3✓, 0.7s)
[ 85.8% |  7077/8248 | ✓7013 | ✗   7] ✓ tests/gateway/test_version_command.py (1✓, 0.8s)
[ 85.9% |  7088/8248 | ✓7024 | ✗   7] ✓ tests/gateway/test_weak_credential_guard.py (11✓, 0.8s)
[ 86.1% |  7098/8248 | ✓7034 | ✗   7] ✓ tests/gateway/test_voice_mode_platform_isolation.py (10✓, 0.9s)
[ 86.5% |  7133/8248 | ✓7069 | ✗   7] ✓ tests/gateway/test_update_command.py (35✓, 1.4s)
[ 86.6% |  7141/8248 | ✓7077 | ✗   7] ✓ tests/gateway/test_verbose_command.py (8✓, 1.1s)
[ 87.7% |  7234/8248 | ✓7170 | ✗   7] ✓ tests/gateway/test_stream_consumer.py (93✓, 7.8s)
[ 87.7% |  7237/8248 | ✓7173 | ✗   7] ✓ tests/gateway/test_webhook_signature_rate_limit.py (3✓, 0.8s)
[ 87.8% |  7241/8248 | ✓7177 | ✗   7] ✓ tests/gateway/test_webhook_integration.py (4✓, 0.8s)
[ 88.0% |  7255/8248 | ✓7191 | ✗   7] ✓ tests/gateway/test_webhook_deliver_only.py (14✓, 0.9s)
[ 88.1% |  7268/8248 | ✓7204 | ✗   7] ✓ tests/gateway/test_webhook_dynamic_routes.py (13✓, 0.9s)
[ 88.9% |  7336/8248 | ✓7272 | ✗   7] ✓ tests/gateway/test_webhook_adapter.py (68✓, 1.1s)
[ 89.1% |  7348/8248 | ✓7284 | ✗   7] ✓ tests/gateway/test_wecom_callback.py (12✓, 0.8s)
[ 89.2% |  7361/8248 | ✓7297 | ✗   7] ✓ tests/gateway/test_weixin_typing.py (13✓, 0.7s)
[ 89.8% |  7407/8248 | ✓7343 | ✗   7] ✓ tests/gateway/test_wecom.py (46✓, 1.1s)
[ 90.2% |  7440/8248 | ✓7376 | ✗   7] ✓ tests/gateway/test_run_progress_topics.py (33✓, 13.7s)
[ 90.3% |  7448/8248 | ✓7384 | ✗   7] ✓ tests/gateway/test_gateway_inactivity_timeout.py (8✓, 21.6s)
[ 90.4% |  7459/8248 | ✓7395 | ✗   7] ✓ tests/gateway/test_whatsapp_stale_bridge.py (11✓, 0.7s)
[ 90.5% |  7465/8248 | ✓7401 | ✗   7] ✓ tests/gateway/test_ws_auth_retry.py (6✓, 0.6s)
[ 91.8% |  7570/8248 | ✓7506 | ✗   7] ✓ tests/gateway/test_whatsapp_cloud.py (105✓, 1.3s)
[ 91.9% |  7578/8248 | ✓7514 | ✗   7] ✓ tests/gateway/test_whatsapp_reply_prefix.py (8✓, 1.0s)
[ 92.2% |  7604/8248 | ✓7540 | ✗   7] ✓ tests/gateway/test_whatsapp_group_gating.py (26✓, 1.0s)
[ 92.3% |  7610/8248 | ✓7546 | ✗   7] ✓ tests/gateway/test_whatsapp_text_batching.py (6✓, 1.0s)
[ 92.3% |  7611/8248 | ✓7547 | ✗   7] ✓ tests/gateway/test_yolo_command.py (1✓, 0.9s)
[ 92.6% |  7638/8248 | ✓7574 | ✗   7] ✓ tests/gateway/test_whatsapp_connect.py (27✓, 1.7s)
[ 93.4% |  7707/8248 | ✓7643 | ✗   7] ✓ tests/gateway/test_weixin.py (69✓, 2.4s)
[ 93.5% |  7710/8248 | ✓7646 | ✗   7] ✓ tests/gateway/test_telegram_send_path_health.py (3✓, 5.7s)
[ 95.7% |  7894/8248 | ✓7830 | ✗   7] ✓ tests/gateway/test_voice_command.py (184✓, 4.1s)
[ 96.0% |  7921/8248 | ✓7857 | ✗   7] ✓ tests/gateway/test_whatsapp_formatting.py (27✓, 2.8s)
[ 96.9% |  7996/8248 | ✓7932 | ✗   7] ✓ tests/gateway/test_restart_resume_pending.py (75✓, 17.2s)
[ 97.2% |  8019/8248 | ✓7955 | ✗   7] ✓ tests/gateway/test_text_batching.py (23✓, 6.4s)
[ 97.5% |  8040/8248 | ✓7976 | ✗   7] ✓ tests/gateway/test_update_streaming.py (21✓, 8.1s)
[ 98.0% |  8086/8248 | ✓8022 | ✗   7] ✓ tests/gateway/test_telegram_thread_fallback.py (46✓, 18.7s)
[100.0% |  8248/8248 | ✓8184 | ✗   7] ✓ tests/gateway/test_adaptive_nutrition.py (162✓, 333.9s)

=== Summary: 369 files, 8184 tests passed, 7 failed (100% complete) in 333.9s (20 workers) ===
  Durations cached to test_durations.json (369 files)

=== Per-file subprocess time distribution ===
  Files:   369
  Total subprocess CPU-wall: 928.3s  (runner wall: 333.9s, parallelism: 20x)
  P50: 1.06s  P90: 2.27s  P95: 4.30s  P99: 17.18s  Max: 333.87s
  <1s: 152 files (41%)  <2s: 320 files (87%)
  Top 10 slowest:
    333.87s  tests/gateway/test_adaptive_nutrition.py
     21.60s  tests/gateway/test_gateway_inactivity_timeout.py
     18.66s  tests/gateway/test_telegram_thread_fallback.py
     17.18s  tests/gateway/test_restart_resume_pending.py
     17.17s  tests/gateway/test_gateway_shutdown.py
     13.72s  tests/gateway/test_run_progress_topics.py
      8.13s  tests/gateway/test_update_streaming.py
      7.94s  tests/gateway/test_agent_cache.py
      7.76s  tests/gateway/test_stream_consumer.py
      7.30s  tests/gateway/test_keep_typing_timeout.py

=== Failure output ===

--- tests/gateway/test_shutdown_memory_provider_messages.py ---
============================= test session starts ==============================
platform linux -- Python 3.12.9, pytest-9.0.2, pluggy-1.6.0
rootdir: /home/cube/projects/richard/hermes-agent
configfile: pyproject.toml
plugins: anyio-4.12.1, asyncio-1.3.0
asyncio: mode=Mode.STRICT, debug=False, asyncio_default_fixture_loop_scope=function, asyncio_default_test_loop_scope=function
collected 7 items

tests/gateway/test_shutdown_memory_provider_messages.py FFFFFFF          [100%]

=================================== FAILURES ===================================
__ TestCleanupAgentResourcesPassesMessages.test_populated_messages_forwarded ___

self = <tests.gateway.test_shutdown_memory_provider_messages.TestCleanupAgentResourcesPassesMessages object at 0x79f78b7e7320>

    def test_populated_messages_forwarded(self):
        """Real-world path: an agent that ran a turn has a populated
        ``_session_messages`` list and the cleanup call forwards it."""
>       runner = _make_runner()
                 ^^^^^^^^^^^^^^

tests/gateway/test_shutdown_memory_provider_messages.py:65: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/gateway/test_shutdown_memory_provider_messages.py:38: in _make_runner
    from gateway.run import GatewayRunner
gateway/__init__.py:12: in <module>
    from .config import (
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """
    Gateway configuration management.
    
    Handles loading and validating configuration for:
    - Connected platforms (Telegram, Discord, WhatsApp, Weixin, and more)
    - Home channels for each platform
    - Session reset policies
    - Delivery preferences
    """
    
    import hashlib
    import io
    import logging
    import os
    import json
    import stat
    from pathlib import Path
    from dataclasses import dataclass, field
    from typing import Dict, List, Optional, Any, Callable, Mapping
    from enum import Enum
    
    import yaml
>   from dotenv import dotenv_values
E   ImportError: cannot import name 'dotenv_values' from 'dotenv' (unknown location)

gateway/config.py:23: ImportError
___ TestCleanupAgentResourcesPassesMessages.test_empty_list_still_forwarded ____

self = <tests.gateway.test_shutdown_memory_provider_messages.TestCleanupAgentResourcesPassesMessages object at 0x79f78b7e7b00>

    def test_empty_list_still_forwarded(self):
        """An agent that initialised but ran no turns has an empty list
        on ``_session_messages``. Forwarding it (rather than falling
        through to the no-arg path) makes the absence of content
        explicit to providers and matches the pre-fix observable
        behaviour (``on_session_end([])``)."""
>       runner = _make_runner()
                 ^^^^^^^^^^^^^^

tests/gateway/test_shutdown_memory_provider_messages.py:84: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/gateway/test_shutdown_memory_provider_messages.py:38: in _make_runner
    from gateway.run import GatewayRunner
gateway/__init__.py:12: in <module>
    from .config import (
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """
    Gateway configuration management.
    
    Handles loading and validating configuration for:
    - Connected platforms (Telegram, Discord, WhatsApp, Weixin, and more)
    - Home channels for each platform
    - Session reset policies
    - Delivery preferences
    """
    
    import hashlib
    import io
    import logging
    import os
    import json
    import stat
    from pathlib import Path
    from dataclasses import dataclass, field
    from typing import Dict, List, Optional, Any, Callable, Mapping
    from enum import Enum
    
    import yaml
>   from dotenv import dotenv_values
E   ImportError: cannot import name 'dotenv_values' from 'dotenv' (unknown location)

gateway/config.py:23: ImportError
_ TestCleanupAgentResourcesPassesMessages.test_missing_attribute_falls_back_to_no_arg _

self = <tests.gateway.test_shutdown_memory_provider_messages.TestCleanupAgentResourcesPassesMessages object at 0x79f78b7e7f50>

    def test_missing_attribute_falls_back_to_no_arg(self):
        """Test stubs built via ``object.__new__(AIAgent)`` skip
        ``__init__`` and therefore have no ``_session_messages``
        attribute. The fix must not explode — it falls back to the
        legacy no-arg call so existing suites keep passing."""
>       runner = _make_runner()
                 ^^^^^^^^^^^^^^

tests/gateway/test_shutdown_memory_provider_messages.py:96: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/gateway/test_shutdown_memory_provider_messages.py:38: in _make_runner
    from gateway.run import GatewayRunner
gateway/__init__.py:12: in <module>
    from .config import (
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """
    Gateway configuration management.
    
    Handles loading and validating configuration for:
    - Connected platforms (Telegram, Discord, WhatsApp, Weixin, and more)
    - Home channels for each platform
    - Session reset policies
    - Delivery preferences
    """
    
    import hashlib
    import io
    import logging
    import os
    import json
    import stat
    from pathlib import Path
    from dataclasses import dataclass, field
    from typing import Dict, List, Optional, Any, Callable, Mapping
    from enum import Enum
    
    import yaml
>   from dotenv import dotenv_values
E   ImportError: cannot import name 'dotenv_values' from 'dotenv' (unknown location)

gateway/config.py:23: ImportError
_ TestCleanupAgentResourcesPassesMessages.test_non_list_attribute_falls_back_to_no_arg _

self = <tests.gateway.test_shutdown_memory_provider_messages.TestCleanupAgentResourcesPassesMessages object at 0x79f78b7e78f0>

    def test_non_list_attribute_falls_back_to_no_arg(self):
        """A MagicMock-based agent auto-synthesises ``_session_messages``
        as a nested MagicMock. ``isinstance(mock, list)`` is False, so
        we fall back to the no-arg path rather than passing a garbage
        value to providers that expect ``List[Dict]``."""
>       runner = _make_runner()
                 ^^^^^^^^^^^^^^

tests/gateway/test_shutdown_memory_provider_messages.py:108: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/gateway/test_shutdown_memory_provider_messages.py:38: in _make_runner
    from gateway.run import GatewayRunner
gateway/__init__.py:12: in <module>
    from .config import (
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """
    Gateway configuration management.
    
    Handles loading and validating configuration for:
    - Connected platforms (Telegram, Discord, WhatsApp, Weixin, and more)
    - Home channels for each platform
    - Session reset policies
    - Delivery preferences
    """
    
    import hashlib
    import io
    import logging
    import os
    import json
    import stat
    from pathlib import Path
    from dataclasses import dataclass, field
    from typing import Dict, List, Optional, Any, Callable, Mapping
    from enum import Enum
    
    import yaml
>   from dotenv import dotenv_values
E   ImportError: cannot import name 'dotenv_values' from 'dotenv' (unknown location)

gateway/config.py:23: ImportError
_ TestCleanupAgentResourcesPassesMessages.test_provider_exception_is_swallowed _

self = <tests.gateway.test_shutdown_memory_provider_messages.TestCleanupAgentResourcesPassesMessages object at 0x79f78b808320>

    def test_provider_exception_is_swallowed(self):
        """Provider teardown must be best-effort — a raising
        ``shutdown_memory_provider`` must not prevent ``close()`` from
        running (tool resource leak is worse than a missed memory
        flush)."""
>       runner = _make_runner()
                 ^^^^^^^^^^^^^^

tests/gateway/test_shutdown_memory_provider_messages.py:122: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/gateway/test_shutdown_memory_provider_messages.py:38: in _make_runner
    from gateway.run import GatewayRunner
gateway/__init__.py:12: in <module>
    from .config import (
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """
    Gateway configuration management.
    
    Handles loading and validating configuration for:
    - Connected platforms (Telegram, Discord, WhatsApp, Weixin, and more)
    - Home channels for each platform
    - Session reset policies
    - Delivery preferences
    """
    
    import hashlib
    import io
    import logging
    import os
    import json
    import stat
    from pathlib import Path
    from dataclasses import dataclass, field
    from typing import Dict, List, Optional, Any, Callable, Mapping
    from enum import Enum
    
    import yaml
>   from dotenv import dotenv_values
E   ImportError: cannot import name 'dotenv_values' from 'dotenv' (unknown location)

gateway/config.py:23: ImportError
_______ TestCleanupAgentResourcesPassesMessages.test_none_agent_is_noop ________

self = <tests.gateway.test_shutdown_memory_provider_messages.TestCleanupAgentResourcesPassesMessages object at 0x79f78b808770>

    def test_none_agent_is_noop(self):
        """Defensive: None agent short-circuits (idle sweeps may
        observe a None entry in the cache during eviction races)."""
>       runner = _make_runner()
                 ^^^^^^^^^^^^^^

tests/gateway/test_shutdown_memory_provider_messages.py:135: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/gateway/test_shutdown_memory_provider_messages.py:38: in _make_runner
    from gateway.run import GatewayRunner
gateway/__init__.py:12: in <module>
    from .config import (
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """
    Gateway configuration management.
    
    Handles loading and validating configuration for:
    - Connected platforms (Telegram, Discord, WhatsApp, Weixin, and more)
    - Home channels for each platform
    - Session reset policies
    - Delivery preferences
    """
    
    import hashlib
    import io
    import logging
    import os
    import json
    import stat
    from pathlib import Path
    from dataclasses import dataclass, field
    from typing import Dict, List, Optional, Any, Callable, Mapping
    from enum import Enum
    
    import yaml
>   from dotenv import dotenv_values
E   ImportError: cannot import name 'dotenv_values' from 'dotenv' (unknown location)

gateway/config.py:23: ImportError
_ TestCleanupAgentResourcesPassesMessages.test_agent_without_shutdown_method_is_tolerated _

self = <tests.gateway.test_shutdown_memory_provider_messages.TestCleanupAgentResourcesPassesMessages object at 0x79f78b808bc0>

    def test_agent_without_shutdown_method_is_tolerated(self):
        """An agent without ``shutdown_memory_provider`` (old test
        stub, partial mock) must still have ``close()`` called."""
>       runner = _make_runner()
                 ^^^^^^^^^^^^^^

tests/gateway/test_shutdown_memory_provider_messages.py:142: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/gateway/test_shutdown_memory_provider_messages.py:38: in _make_runner
    from gateway.run import GatewayRunner
gateway/__init__.py:12: in <module>
    from .config import (
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """
    Gateway configuration management.
    
    Handles loading and validating configuration for:
    - Connected platforms (Telegram, Discord, WhatsApp, Weixin, and more)
    - Home channels for each platform
    - Session reset policies
    - Delivery preferences
    """
    
    import hashlib
    import io
    import logging
    import os
    import json
    import stat
    from pathlib import Path
    from dataclasses import dataclass, field
    from typing import Dict, List, Optional, Any, Callable, Mapping
    from enum import Enum
    
    import yaml
>   from dotenv import dotenv_values
E   ImportError: cannot import name 'dotenv_values' from 'dotenv' (unknown location)

gateway/config.py:23: ImportError
=========================== short test summary info ============================
FAILED tests/gateway/test_shutdown_memory_provider_messages.py::TestCleanupAgentResourcesPassesMessages::test_populated_messages_forwarded
FAILED tests/gateway/test_shutdown_memory_provider_messages.py::TestCleanupAgentResourcesPassesMessages::test_empty_list_still_forwarded
FAILED tests/gateway/test_shutdown_memory_provider_messages.py::TestCleanupAgentResourcesPassesMessages::test_missing_attribute_falls_back_to_no_arg
FAILED tests/gateway/test_shutdown_memory_provider_messages.py::TestCleanupAgentResourcesPassesMessages::test_non_list_attribute_falls_back_to_no_arg
FAILED tests/gateway/test_shutdown_memory_provider_messages.py::TestCleanupAgentResourcesPassesMessages::test_provider_exception_is_swallowed
FAILED tests/gateway/test_shutdown_memory_provider_messages.py::TestCleanupAgentResourcesPassesMessages::test_none_agent_is_noop
FAILED tests/gateway/test_shutdown_memory_provider_messages.py::TestCleanupAgentResourcesPassesMessages::test_agent_without_shutdown_method_is_tolerated
============================== 7 failed in 0.33s ===============================

=== 1 file with test failures (7 tests failed) ===
  tests/gateway/test_shutdown_memory_provider_messages.py  (7 tests failed)
