Discovered 376 test files (0 tests) under ['tests/gateway']; running with -j 12
[  0.0% |     0/0 | ✓4 | ✗0] ✓ tests/gateway/relay/test_relay_interrupt.py (4✓, 1.0s)
[  0.0% |     0/0 | ✓9 | ✗0] ✓ tests/gateway/relay/test_descriptor.py (5✓, 1.0s)
[  0.0% |     0/0 | ✓11 | ✗ 0] ✓ tests/gateway/platforms/test_yuanbao_recall_db_only.py (2✓, 1.0s)
[  0.0% |     0/0 | ✓17 | ✗ 0] ✓ tests/gateway/relay/test_relay_roundtrip_telegram.py (6✓, 1.1s)
[  0.0% |     0/0 | ✓28 | ✗ 0] ✓ tests/gateway/relay/test_relay_adapter.py (11✓, 1.1s)
[  0.0% |     0/0 | ✓32 | ✗ 0] ✓ tests/gateway/relay/test_relay_follow_up.py (4✓, 1.1s)
[  0.0% |     0/0 | ✓36 | ✗ 0] ✓ tests/gateway/relay/test_descriptor_from_entry.py (4✓, 1.1s)
[  0.0% |     0/0 | ✓44 | ✗ 0] ✓ tests/gateway/relay/test_contract_doc_conformance.py (8✓, 1.1s)
[  0.0% |     0/0 | ✓61 | ✗ 0] ✓ tests/gateway/relay/test_auth.py (17✓, 1.1s)
[  0.0% |     0/0 | ✓62 | ✗ 0] ✓ tests/gateway/relay/test_no_stub_leak.py (1✓, 1.2s)
[  0.0% |     0/0 | ✓67 | ✗ 0] ✓ tests/gateway/relay/test_relay_roundtrip.py (5✓, 1.4s)
[  0.0% |     0/0 | ✓73 | ✗ 0] ✓ tests/gateway/relay/test_relay_registration.py (6✓, 1.4s)
[  0.0% |     0/0 | ✓82 | ✗ 0] ✓ tests/gateway/test_7100_transient_failure_transcript.py (9✓, 1.1s)
[  0.0% |     0/0 | ✓94 | ✗ 0] ✓ tests/gateway/relay/test_self_provision.py (12✓, 1.2s)
[  0.0% |     0/0 | ✓101 | ✗  0] ✓ tests/gateway/relay/test_ws_transport.py (7✓, 1.2s)
[  0.0% |     0/0 | ✓104 | ✗  0] ✓ tests/gateway/relay/test_relay_sheds_crypto.py (3✓, 1.3s)
[  0.0% |     0/0 | ✓104 | ✗  0] ✗ tests/gateway/test_api_server.py (1e, 1.0s)

  ╔╍ Failed: tests/gateway/test_api_server.py ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍
  ║ 
  ║ ==================================== ERRORS ====================================
  ║ ______________ ERROR collecting tests/gateway/test_api_server.py _______________
  ║ ImportError while importing test module '/home/cube/projects/richard/hermes-agent/tests/gateway/test_api_server.py'.
  ║ Hint: make sure your test modules/packages have valid Python names.
  ║ Traceback:
  ║ ../../../miniconda3/lib/python3.12/importlib/__init__.py:90: in import_module
  ║     return _bootstrap._gcd_import(name[level:], package, level)
  ║            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  ║ tests/gateway/test_api_server.py:24: in <module>
  ║     from aiohttp import web
  ║ E   ModuleNotFoundError: No module named 'aiohttp'
  ║ =========================== short test summary info ============================
  ║ ERROR tests/gateway/test_api_server.py
  ║ !!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!
  ║ 1 error in 0.14s
  ║
  ║  Repro: python -m pytest tests/gateway/test_api_server.py --quiet
  ╚╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍

[  0.0% |     0/0 | ✓108 | ✗  0] ✓ tests/gateway/test_allowlist_startup_check.py (4✓, 1.0s)
[  0.0% |     0/0 | ✓112 | ✗  0] ✓ tests/gateway/test_35809_auto_reset_clean_context.py (4✓, 1.4s)
[  0.0% |     0/0 | ✓116 | ✗  0] ✓ tests/gateway/test_42039_duplicate_user_message.py (4✓, 1.8s)
[  0.0% |     0/0 | ✓116 | ✗  0] ✗ tests/gateway/test_api_server_multimodal.py (1e, 0.9s)

  ╔╍ Failed: tests/gateway/test_api_server_multimodal.py ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍
  ║ 
  ║ ==================================== ERRORS ====================================
  ║ _________ ERROR collecting tests/gateway/test_api_server_multimodal.py _________
  ║ ImportError while importing test module '/home/cube/projects/richard/hermes-agent/tests/gateway/test_api_server_multimodal.py'.
  ║ Hint: make sure your test modules/packages have valid Python names.
  ║ Traceback:
  ║ ../../../miniconda3/lib/python3.12/importlib/__init__.py:90: in import_module
  ║     return _bootstrap._gcd_import(name[level:], package, level)
  ║            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  ║ tests/gateway/test_api_server_multimodal.py:13: in <module>
  ║     from aiohttp import web
  ║ E   ModuleNotFoundError: No module named 'aiohttp'
  ║ =========================== short test summary info ============================
  ║ ERROR tests/gateway/test_api_server_multimodal.py
  ║ !!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!
  ║ 1 error in 0.11s
  ║
  ║  Repro: python -m pytest tests/gateway/test_api_server_multimodal.py --quiet
  ╚╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍

[  0.0% |     0/0 | ✓116 | ✗  0] ✗ tests/gateway/test_api_server_jobs.py (1e, 1.0s)

  ╔╍ Failed: tests/gateway/test_api_server_jobs.py ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍
  ║ 
  ║ ==================================== ERRORS ====================================
  ║ ____________ ERROR collecting tests/gateway/test_api_server_jobs.py ____________
  ║ ImportError while importing test module '/home/cube/projects/richard/hermes-agent/tests/gateway/test_api_server_jobs.py'.
  ║ Hint: make sure your test modules/packages have valid Python names.
  ║ Traceback:
  ║ ../../../miniconda3/lib/python3.12/importlib/__init__.py:90: in import_module
  ║     return _bootstrap._gcd_import(name[level:], package, level)
  ║            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  ║ tests/gateway/test_api_server_jobs.py:17: in <module>
  ║     from aiohttp import web
  ║ E   ModuleNotFoundError: No module named 'aiohttp'
  ║ =========================== short test summary info ============================
  ║ ERROR tests/gateway/test_api_server_jobs.py
  ║ !!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!
  ║ 1 error in 0.12s
  ║
  ║  Repro: python -m pytest tests/gateway/test_api_server_jobs.py --quiet
  ╚╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍

[  0.0% |     0/0 | ✓133 | ✗  0] ✓ tests/gateway/test_api_server_bind_guard.py (17✓, 1.0s)
[  0.0% |     0/0 | ✓160 | ✗  0] ✓ tests/gateway/test_allowed_channels_widening.py (27✓, 2.1s)
[  0.0% |     0/0 | ✓160 | ✗  0] ✗ tests/gateway/test_api_server_runs.py (1e, 1.0s)

  ╔╍ Failed: tests/gateway/test_api_server_runs.py ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍
  ║ 
  ║ ==================================== ERRORS ====================================
  ║ ____________ ERROR collecting tests/gateway/test_api_server_runs.py ____________
  ║ ImportError while importing test module '/home/cube/projects/richard/hermes-agent/tests/gateway/test_api_server_runs.py'.
  ║ Hint: make sure your test modules/packages have valid Python names.
  ║ Traceback:
  ║ ../../../miniconda3/lib/python3.12/importlib/__init__.py:90: in import_module
  ║     return _bootstrap._gcd_import(name[level:], package, level)
  ║            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  ║ tests/gateway/test_api_server_runs.py:16: in <module>
  ║     from aiohttp import web
  ║ E   ModuleNotFoundError: No module named 'aiohttp'
  ║ =========================== short test summary info ============================
  ║ ERROR tests/gateway/test_api_server_runs.py
  ║ !!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!
  ║ 1 error in 0.12s
  ║
  ║  Repro: python -m pytest tests/gateway/test_api_server_runs.py --quiet
  ╚╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍

[  0.0% |     0/0 | ✓175 | ✗  0] ✓ tests/gateway/test_active_session_text_merge.py (15✓, 2.3s)
[  0.0% |     0/0 | ✓193 | ✗  0] ✓ tests/gateway/test_api_server_normalize.py (18✓, 1.2s)
[  0.0% |     0/0 | ✓196 | ✗  0] ✓ tests/gateway/test_auth_fallback.py (3✓, 1.0s)
[  0.0% |     0/0 | ✓208 | ✗  0] ✓ tests/gateway/test_auto_continue.py (12✓, 1.0s)
[  0.0% |     0/0 | ✓220 | ✗  0] ✓ tests/gateway/test_api_server_toolset.py (12✓, 1.8s)
[  0.0% |     0/0 | ✓224 | ✗  0] ✓ tests/gateway/test_bundles_command.py (4✓, 1.0s)
[  0.0% |     0/0 | ✓226 | ✗  0] ✓ tests/gateway/test_auto_voice_reply_format.py (2✓, 1.4s)
[  0.0% |     0/0 | ✓236 | ✗  0] ✓ tests/gateway/test_base_topic_sessions.py (10✓, 1.2s)
[  0.0% |     0/0 | ✓257 | ✗  0] ✓ tests/gateway/test_approve_deny_commands.py (21✓, 2.5s)
[  0.0% |     0/0 | ✓261 | ✗  0] ✓ tests/gateway/test_busy_session_auth_bypass.py (4✓, 1.0s)
[  0.0% |     0/0 | ✓292 | ✗  0] ✓ tests/gateway/test_background_process_notifications.py (31✓, 1.8s)
[  0.0% |     0/0 | ✓348 | ✗  0] ✓ tests/gateway/test_bluebubbles.py (56✓, 1.7s)
[  0.0% |     0/0 | ✓351 | ✗  0] ✓ tests/gateway/test_cached_agent_max_iterations.py (3✓, 1.0s)
[  0.0% |     0/0 | ✓369 | ✗  0] ✓ tests/gateway/test_busy_session_ack.py (18✓, 1.3s)
[  0.0% |     0/0 | ✓391 | ✗  0] ✓ tests/gateway/test_background_command.py (22✓, 2.4s)
[  0.0% |     0/0 | ✓394 | ✗  0] ✓ tests/gateway/test_cancel_background_drain.py (3✓, 1.2s)
[  0.0% |     0/0 | ✓401 | ✗  0] ✓ tests/gateway/test_clean_shutdown_marker.py (7✓, 1.2s)
[  0.0% |     0/0 | ✓441 | ✗  0] ✓ tests/gateway/test_channel_directory.py (40✓, 1.3s)
[  0.0% |     0/0 | ✓456 | ✗  1] ✗ tests/gateway/test_commit_observer.py (15✓ 1✗, 1.1s)

  ╔╍ Failed: tests/gateway/test_commit_observer.py ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍
  ║         observer, watched, _receipts = _observer(tmp_path)
  ║         sibling = _private_file(watched.parent / "unrelated.json", b"before")
  ║         with observer:
  ║             _arm(observer, watched)
  ║             trigger = threading.Event()
  ║     
  ║             def mutate() -> None:
  ║                 assert trigger.wait(timeout=1.0)
  ║                 sibling.write_bytes(b"unrelated-change")
  ║                 os.chmod(sibling, 0o600)
  ║                 watched.write_bytes(b"authoritative-change")
  ║                 os.chmod(watched, 0o600)
  ║     
  ║             with ThreadPoolExecutor(max_workers=1) as pool:
  ║                 completed = pool.submit(mutate)
  ║                 trigger.set()
  ║                 event = observer.observe(sequence=41, timeout=1.0)
  ║                 completed.result(timeout=2.0)
  ║     
  ║         assert event["path"] == str(watched)
  ║ >       assert event["commit_byte_hash"] == hashlib.sha256(b"authoritative-change").hexdigest()
  ║ E       AssertionError: assert 'e3b0c44298fc...5991b7852b855' == '5bfd52af178f...96811518d9e75'
  ║ E         
  ║ E         - 5bfd52af178fb17e990390a3f209fa7f5b5d796b783abadf6c796811518d9e75
  ║ E         + e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
  ║ 
  ║ tests/gateway/test_commit_observer.py:244: AssertionError
  ║ =========================== short test summary info ============================
  ║ FAILED tests/gateway/test_commit_observer.py::test_unrelated_sibling_notification_cannot_satisfy_observe
  ║ 1 failed, 15 passed in 0.25s
  ║
  ║  Repro: python -m pytest tests/gateway/test_commit_observer.py --quiet
  ╚╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍

[  0.0% |     0/0 | ✓471 | ✗  1] ✓ tests/gateway/test_complete_path_at_filter.py (15✓, 1.1s)
[  0.0% |     0/0 | ✓511 | ✗  1] ✓ tests/gateway/test_command_bypass_active_session.py (40✓, 1.4s)
[  0.0% |     0/0 | ✓515 | ✗  1] ✓ tests/gateway/test_compress_command.py (4✓, 1.7s)
[  0.0% |     0/0 | ✓517 | ✗  1] ✓ tests/gateway/test_compress_focus.py (2✓, 1.7s)
[  0.0% |     0/0 | ✓519 | ✗  1] ✓ tests/gateway/test_compress_plugin_engine.py (2✓, 1.7s)
[  0.0% |     0/0 | ✓543 | ✗  1] ✓ tests/gateway/test_config_cwd_bridge.py (24✓, 1.0s)
[  0.0% |     0/0 | ✓544 | ✗  1] ✓ tests/gateway/test_compression_failure_session_sync.py (1✓, 1.5s)
[  0.0% |     0/0 | ✓548 | ✗  1] ✓ tests/gateway/test_compression_session_id_persistence.py (4✓, 1.6s)
[  0.0% |     0/0 | ✓593 | ✗  1] ✓ tests/gateway/test_config_driven_access_policy.py (45✓, 1.4s)
[  0.0% |     0/0 | ✓595 | ✗  1] ✓ tests/gateway/test_debug_command.py (2✓, 1.0s)
[  0.0% |     0/0 | ✓618 | ✗  1] ✓ tests/gateway/test_delivery.py (23✓, 1.0s)
[  0.0% |     0/0 | ✓656 | ✗  1] ✓ tests/gateway/test_delivery_silence_filter.py (38✓, 1.0s)
[  0.0% |     0/0 | ✓661 | ✗  1] ✓ tests/gateway/test_cron_fire_webhook.py (5✓, 1.4s)
[  0.0% |     0/0 | ✓667 | ✗  1] ✓ tests/gateway/test_destructive_slash_confirm.py (6✓, 1.1s)
[  0.0% |     0/0 | ✓673 | ✗  1] ✓ tests/gateway/test_config_env_bridge_authority.py (6✓, 2.2s)
[  0.0% |     0/0 | ✓741 | ✗  1] ✓ tests/gateway/test_agent_cache.py (68✓, 7.6s)
[  0.0% |     0/0 | ✓756 | ✗  1] ✓ tests/gateway/test_discord_allowed_channels.py (15✓, 0.9s)
[  0.0% |     0/0 | ✓824 | ✗  1] ✓ tests/gateway/test_dingtalk.py (68✓, 1.4s)
[  0.0% |     0/0 | ✓843 | ✗  1] ✓ tests/gateway/test_discord_allowed_mentions.py (19✓, 0.9s)
[  0.0% |     0/0 | ✓906 | ✗  1] ✓ tests/gateway/test_diagnostic_isolation.py (63✓, 1.8s)
[  0.0% |     0/0 | ✓914 | ✗  1] ✓ tests/gateway/test_discord_bot_filter.py (8✓, 0.9s)
[  0.0% |     0/0 | ✓928 | ✗  1] ✓ tests/gateway/test_discord_attachment_download.py (14✓, 1.1s)
[  0.0% |     0/0 | ✓937 | ✗  1] ✓ tests/gateway/test_discord_bot_auth_bypass.py (9✓, 1.0s)
[  0.0% |     0/0 | ✓1004 | ✗   1] ✓ tests/gateway/test_config.py (67✓, 3.7s)
[  0.0% |     0/0 | ✓1010 | ✗   1] ✓ tests/gateway/test_discord_channel_skills.py (6✓, 0.9s)
[  0.0% |     0/0 | ✓1030 | ✗   1] ✓ tests/gateway/test_discord_clarify_buttons.py (20✓, 1.0s)
[  0.0% |     0/0 | ✓1058 | ✗   1] ✓ tests/gateway/test_discord_component_auth.py (28✓, 1.0s)
[  0.0% |     0/0 | ✓1068 | ✗   1] ✓ tests/gateway/test_discord_channel_prompts.py (10✓, 1.4s)
[  0.0% |     0/0 | ✓1069 | ✗   1] ✓ tests/gateway/test_discord_imports.py (1✓, 0.9s)
[  0.0% |     0/0 | ✓1083 | ✗   1] ✓ tests/gateway/test_discord_channel_controls.py (14✓, 1.5s)
[  0.0% |     0/0 | ✓1126 | ✗   1] ✓ tests/gateway/test_discord_free_response.py (43✓, 1.1s)
[  0.0% |     0/0 | ✓1128 | ✗   1] ✓ tests/gateway/test_discord_lazy_install_views.py (2✓, 0.9s)
[  0.0% |     0/0 | ✓1129 | ✗   1] ✓ tests/gateway/test_discord_media_metadata.py (1✓, 0.9s)
[  0.0% |     0/0 | ✓1131 | ✗   1] ✓ tests/gateway/test_compression_concurrent_sessions.py (2✓, 5.2s)
[  0.0% |     0/0 | ✓1135 | ✗   1] ✓ tests/gateway/test_discord_opus.py (4✓, 0.9s)
[  0.0% |     0/0 | ✓1155 | ✗   1] ✓ tests/gateway/test_discord_document_handling.py (20✓, 1.7s)
[  0.0% |     0/0 | ✓1156 | ✗   1] ✓ tests/gateway/test_discord_race_polish.py (1✓, 0.9s)
[  0.0% |     0/0 | ✓1163 | ✗   1] ✓ tests/gateway/test_discord_reactions.py (7✓, 0.9s)
[  0.0% |     0/0 | ✓1181 | ✗   1] ✓ tests/gateway/test_discord_connect.py (18✓, 1.9s)
[  0.0% |     0/0 | ✓1193 | ✗   1] ✓ tests/gateway/test_discord_roles_dm_scope.py (12✓, 0.9s)
[  0.0% |     0/0 | ✓1211 | ✗   1] ✓ tests/gateway/test_discord_send.py (18✓, 1.3s)
[  0.0% |     0/0 | ✓1219 | ✗   1] ✓ tests/gateway/test_discord_system_messages.py (8✓, 0.8s)
[  0.0% |     0/0 | ✓1221 | ✗   1] ✓ tests/gateway/test_discord_model_picker.py (2✓, 1.7s)
[  0.0% |     0/0 | ✓1221 | ✗   1] ✓ tests/gateway/test_discord_voice_mixer.py (1s, 0.8s)
[  0.0% |     0/0 | ✓1229 | ✗   1] ✓ tests/gateway/test_discord_thread_persistence.py (8✓, 0.9s)
[  0.0% |     0/0 | ✓1261 | ✗   1] ✓ tests/gateway/test_discord_slash_auth.py (32✓, 1.3s)
[  0.0% |     0/0 | ✓1294 | ✗   1] ✓ tests/gateway/test_discord_reply_mode.py (33✓, 2.0s)
[  0.0% |     0/0 | ✓1334 | ✗   1] ✓ tests/gateway/test_display_config.py (40✓, 1.2s)
[  0.0% |     0/0 | ✓1366 | ✗   1] ✓ tests/gateway/test_document_cache.py (32✓, 1.0s)
[  0.0% |     0/0 | ✓1402 | ✗   1] ✓ tests/gateway/test_dm_topics.py (36✓, 1.2s)
[  0.0% |     0/0 | ✓1415 | ✗   1] ✓ tests/gateway/test_dualcoach_tasks21_25_controller.py (13✓, 0.9s)
[  0.0% |     0/0 | ✓1422 | ✗   1] ✓ tests/gateway/test_dualcoach_activation_cutover.py (7✓, 1.1s)
[  0.0% |     0/0 | ✓1456 | ✗   1] ✓ tests/gateway/test_discord_slash_commands.py (34✓, 2.1s)
[  0.0% |     0/0 | ✓1464 | ✗   1] ✓ tests/gateway/test_document_context_note.py (8✓, 1.4s)
[  0.0% |     0/0 | ✓1468 | ✗   1] ✓ tests/gateway/test_fallback_eviction.py (4✓, 0.8s)
[  0.0% |     0/0 | ✓1492 | ✗   1] ✓ tests/gateway/test_duplicate_reply_suppression.py (24✓, 1.3s)
[  0.0% |     0/0 | ✓1506 | ✗   1] ✓ tests/gateway/test_ephemeral_reply.py (14✓, 0.9s)
[  0.0% |     0/0 | ✓1554 | ✗   1] ✓ tests/gateway/test_extract_local_files.py (48✓, 1.2s)
[  0.0% |     0/0 | ✓1563 | ✗   1] ✓ tests/gateway/test_empty_model_recovery.py (9✓, 1.7s)
[  0.0% |     0/0 | ✓1596 | ✗   1] ✓ tests/gateway/test_dualcoach_admin_provider_auth.py (33✓, 2.4s)
[  0.0% |     0/0 | ✓1616 | ✗   1] ✓ tests/gateway/test_feishu_comment.py (20✓, 1.0s)
[  0.0% |     0/0 | ✓1622 | ✗   1] ✓ tests/gateway/test_feishu_bot_auth_bypass.py (6✓, 1.1s)
[  0.0% |     0/0 | ✓1626 | ✗   1] ✓ tests/gateway/test_fast_command.py (4✓, 1.5s)
[  0.0% |     0/0 | ✓1656 | ✗   1] ✓ tests/gateway/test_feishu_comment_rules.py (30✓, 1.1s)
[  0.0% |     0/0 | ✓1694 | ✗   1] ✓ tests/gateway/test_feishu_approval_buttons.py (38✓, 1.3s)
[  0.0% |     0/0 | ✓1762 | ✗   1] ✓ tests/gateway/test_email.py (68✓, 2.3s)
[  0.0% |     0/0 | ✓1822 | ✗   1] ✓ tests/gateway/test_feishu_bot_admission.py (60✓, 1.4s)
[  0.0% |     0/0 | ✓1831 | ✗   1] ✓ tests/gateway/test_feishu_meeting_invite.py (9✓, 1.3s)
[  0.0% |     0/0 | ✓1840 | ✗   1] ✓ tests/gateway/test_fresh_reset_skill_injection.py (9✓, 0.9s)
[  0.0% |     0/0 | ✓1867 | ✗   1] ✓ tests/gateway/test_feishu_onboard.py (27✓, 1.1s)
[  0.0% |     0/0 | ✓1892 | ✗   1] ✓ tests/gateway/test_gateway_command_line_matcher.py (25✓, 0.9s)
[  0.0% |     0/0 | ✓2052 | ✗   1] ✓ tests/gateway/test_feishu.py (160✓ 45s, 2.3s)
[  0.0% |     0/0 | ✓2056 | ✗   1] ✓ tests/gateway/test_gateway_command_help.py (4✓, 1.1s)
[  0.0% |     0/0 | ✓2057 | ✗   1] ✓ tests/gateway/test_goal_max_turns_config.py (1✓, 1.2s)
[  0.0% |     0/0 | ✓2060 | ✗   1] ✓ tests/gateway/test_goal_status_notice.py (3✓, 1.3s)
[  0.0% |     0/0 | ✓2065 | ✗   1] ✓ tests/gateway/test_goal_verdict_send.py (5✓, 1.1s)
[  0.0% |     0/0 | ✓2071 | ✗   1] ✓ tests/gateway/test_gateway_silence_tokens.py (6✓, 1.7s)
[  0.0% |     0/0 | ✓2092 | ✗   1] ✓ tests/gateway/test_hooks.py (21✓, 0.9s)
[  0.0% |     0/0 | ✓2104 | ✗   1] ✓ tests/gateway/test_insights_unicode_flags.py (12✓, 0.8s)
[  0.0% |     0/0 | ✓2111 | ✗   1] ✓ tests/gateway/test_home_target_env_var.py (7✓, 1.4s)
[  0.0% |     0/0 | ✓2122 | ✗   1] ✓ tests/gateway/test_installed_golden_path_provenance.py (11✓, 1.0s)
[  0.0% |     0/0 | ✓2167 | ✗   1] ✓ tests/gateway/test_homeassistant.py (45✓, 1.4s)
[  0.0% |     0/0 | ✓2173 | ✗   1] ✓ tests/gateway/test_interrupt_key_match.py (6✓, 0.9s)
[  0.0% |     0/0 | ✓2177 | ✗   1] ✓ tests/gateway/test_kanban_watchers_mixin.py (4✓, 0.8s)
[  0.0% |     0/0 | ✓2185 | ✗   1] ✓ tests/gateway/test_internal_event_bypass_pairing.py (8✓, 1.6s)
[  0.0% |     0/0 | ✓2188 | ✗   1] ✓ tests/gateway/test_kanban_notifier_watcher_dispatch_gate.py (3✓, 1.3s)
[  0.0% |     0/0 | ✓2194 | ✗   1] ✓ tests/gateway/test_kanban_notifier.py (6✓, 1.3s)
[  0.0% |     0/0 | ✓2354 | ✗   1] ✓ tests/gateway/test_google_chat.py (160✓, 2.4s)
[  0.0% |     0/0 | ✓2430 | ✗   1] ✓ tests/gateway/test_line_plugin.py (76✓, 1.0s)
[  0.0% |     0/0 | ✓2515 | ✗   1] ✓ tests/gateway/test_korean_humanizer.py (85✓, 1.5s)
[  0.0% |     0/0 | ✓2516 | ✗   1] ✓ tests/gateway/test_load_transcript_db_only.py (1✓, 0.7s)
[  0.0% |     0/0 | ✓2518 | ✗   1] ✓ tests/gateway/test_matrix_exec_approval.py (2✓, 0.7s)
[  0.0% |     0/0 | ✓2522 | ✗   1] ✓ tests/gateway/test_matrix_approval_reaction_fail_closed.py (4✓, 0.8s)
[  0.0% |     0/0 | ✓2536 | ✗   1] ✓ tests/gateway/test_loop_exception_handler.py (14✓, 1.2s)
[  0.0% |     0/0 | ✓2536 | ✗   1] ✓ tests/gateway/test_matrix_voice.py (1s, 0.7s)
[  0.0% |     0/0 | ✓2555 | ✗   1] ✓ tests/gateway/test_matrix_project_context_isolation.py (19✓, 0.9s)
[  0.0% |     0/0 | ✓2607 | ✗   1] ✓ tests/gateway/test_matrix_mention.py (52✓, 1.1s)
[  0.0% |     0/0 | ✓2651 | ✗   1] ✓ tests/gateway/test_irc_adapter.py (44✓, 3.1s)
[  0.0% |     0/0 | ✓2656 | ✗   1] ✓ tests/gateway/test_max_concurrent_sessions.py (5✓, 1.4s)
[  0.0% |     0/0 | ✓2662 | ✗   1] ✓ tests/gateway/test_max_tokens_propagation.py (6✓, 1.0s)
[  0.0% |     0/0 | ✓2675 | ✗   1] ✓ tests/gateway/test_media_extraction.py (13✓, 0.8s)
[  0.0% |     0/0 | ✓2733 | ✗   1] ✓ tests/gateway/test_mattermost.py (58✓, 1.8s)
[  0.0% |     0/0 | ✓2769 | ✗   1] ✓ tests/gateway/test_media_download_retry.py (36✓, 1.1s)
[  0.0% |     0/0 | ✓2772 | ✗   1] ✓ tests/gateway/test_mcp_reload_refreshes_cached_agents.py (3✓, 1.4s)
[  0.0% |     0/0 | ✓2786 | ✗   1] ✓ tests/gateway/test_media_metadata_contract.py (14✓ 2s, 1.2s)
[  0.0% |     0/0 | ✓2794 | ✗   1] ✓ tests/gateway/test_message_deduplicator.py (8✓, 0.8s)
[  0.0% |     0/0 | ✓2809 | ✗   1] ✓ tests/gateway/test_mirror.py (15✓, 0.9s)
[  0.0% |     0/0 | ✓2819 | ✗   1] ✓ tests/gateway/test_memory_monitor.py (10✓, 1.3s)
[  0.0% |     0/0 | ✓3049 | ✗   1] ✓ tests/gateway/test_matrix.py (230✓, 3.5s)
[  0.0% |     0/0 | ✓3057 | ✗   1] ✓ tests/gateway/test_message_timestamps.py (8✓, 1.5s)
[  0.0% |     0/0 | ✓3058 | ✗   1] ✓ tests/gateway/test_model_command_custom_providers.py (1✓, 1.4s)
[  0.0% |     0/0 | ✓3062 | ✗   1] ✓ tests/gateway/test_model_command_expensive_confirm.py (4✓, 1.4s)
[  0.0% |     0/0 | ✓3071 | ✗   1] ✓ tests/gateway/test_model_switch_persistence.py (9✓, 0.8s)
[  0.0% |     0/0 | ✓3074 | ✗   1] ✓ tests/gateway/test_model_picker_persist.py (3✓, 1.2s)
[  0.0% |     0/0 | ✓3079 | ✗   1] ✓ tests/gateway/test_model_command_flat_string_config.py (5✓, 1.6s)
[  0.0% |     0/0 | ✓3086 | ✗   1] ✓ tests/gateway/test_multiplex_credential_isolation.py (7✓, 0.8s)
[  0.0% |     0/0 | ✓3095 | ✗   1] ✓ tests/gateway/test_multiplex_adapter_registry.py (9✓, 1.2s)
[  0.0% |     0/0 | ✓3122 | ✗   1] ✓ tests/gateway/test_msgraph_webhook.py (27✓, 1.4s)
[  0.0% |     0/0 | ✓3127 | ✗   1] ✓ tests/gateway/test_multiplex_lifecycle.py (5✓, 0.8s)
[  0.0% |     0/0 | ✓3134 | ✗   1] ✓ tests/gateway/test_multiplex_http_routing.py (7✓, 1.0s)
[  0.0% |     0/0 | ✓3159 | ✗   1] ✓ tests/gateway/test_multiplex_phase0.py (25✓, 0.8s)
[  0.0% |     0/0 | ✓3161 | ✗   1] ✓ tests/gateway/test_native_image_buffer_isolation.py (2✓, 1.1s)
[  0.0% |     0/0 | ✓3164 | ✗   1] ✓ tests/gateway/test_notice_delivery.py (3✓, 1.1s)
[  0.0% |     0/0 | ✓3246 | ✗   1] ✓ tests/gateway/test_ntfy_plugin.py (82✓, 1.1s)
[  0.0% |     0/0 | ✓3255 | ✗   1] ✓ tests/gateway/test_notice_rendering.py (9✓, 1.2s)
[  0.0% |     0/0 | ✓3328 | ✗   1] ✓ tests/gateway/test_nutrition_coaching_judgment.py (73✓, 1.0s)
[  0.0% |     0/0 | ✓3342 | ✗   1] ✓ tests/gateway/test_nutrition_onboarding_clarification_policy.py (14✓, 1.2s)
[  0.0% |     0/0 | ✓3385 | ✗   1] ✓ tests/gateway/test_pairing.py (43✓, 0.9s)
[  0.0% |     0/0 | ✓3415 | ✗   1] ✓ tests/gateway/test_nutrition_onboarding_reconciliation.py (30✓, 1.2s)
[  0.0% |     0/0 | ✓3420 | ✗   1] ✓ tests/gateway/test_keep_typing_timeout.py (5✓, 7.4s)
[  0.0% |     0/0 | ✓3423 | ✗   1] ✓ tests/gateway/test_pending_drain_race.py (3✓, 0.8s)
[  0.0% |     0/0 | ✓3429 | ✗   1] ✓ tests/gateway/test_pending_event_none.py (6✓, 1.1s)
[  0.0% |     0/0 | ✓3445 | ✗   1] ✓ tests/gateway/test_pii_redaction.py (16✓, 0.8s)
[  0.0% |     0/0 | ✓3449 | ✗   1] ✓ tests/gateway/test_per_platform_streaming_defaults.py (4✓, 1.3s)
[  0.0% |     0/0 | ✓3483 | ✗   1] ✓ tests/gateway/test_platform_connected_checkers.py (34✓ 1s, 0.9s)
[  0.0% |     0/0 | ✓3490 | ✗   1] ✓ tests/gateway/test_platform_http_client_limits.py (7✓, 1.0s)
[  0.0% |     0/0 | ✓3638 | ✗   1] ✓ tests/gateway/test_platform_base.py (148✓ 2s, 1.3s)
[  0.0% |     0/0 | ✓3638 | ✗   1] ✓ tests/gateway/test_plugin_platform_interface.py (7s, 0.6s)
[  0.0% |     0/0 | ✓3645 | ✗   1] ✓ tests/gateway/test_platform_reconnect_fd_leak.py (7✓, 1.2s)
[  0.0% |     0/0 | ✓3654 | ✗   1] ✓ tests/gateway/test_post_delivery_callback_chaining.py (9✓, 0.8s)
[  0.0% |     0/0 | ✓3823 | ✗   1] ✓ tests/gateway/test_nutrition_coaching.py (169✓, 3.8s)
[  0.0% |     0/0 | ✓3828 | ✗   1] ✓ tests/gateway/test_pre_gateway_dispatch.py (5✓, 1.0s)
[  0.0% |     0/0 | ✓3839 | ✗   1] ✓ tests/gateway/test_planned_stop_watcher.py (11✓, 2.7s)
[  0.0% |     0/0 | ✓3889 | ✗   1] ✓ tests/gateway/test_platform_registry.py (50✓, 2.0s)
[  0.0% |     0/0 | ✓3919 | ✗   1] ✓ tests/gateway/test_platform_reconnect.py (30✓, 2.4s)
[  0.0% |     0/0 | ✓3933 | ✗   1] ✓ tests/gateway/test_queue_consumption.py (14✓, 1.3s)
[  0.0% |     0/0 | ✓3949 | ✗   1] ✓ tests/gateway/test_raft_adapter.py (16✓, 1.0s)
[  0.0% |     0/0 | ✓3971 | ✗   1] ✓ tests/gateway/test_proxy_mode.py (22✓, 1.7s)
[  0.0% |     0/0 | ✓3975 | ✗   1] ✓ tests/gateway/test_relay_capability_surface.py (4✓, 0.8s)
[  0.0% |     0/0 | ✓3979 | ✗   1] ✓ tests/gateway/test_reload_skills_command.py (4✓, 1.0s)
[  0.0% |     0/0 | ✓3984 | ✗   1] ✓ tests/gateway/test_reload_skills_discord_resync.py (5✓, 1.0s)
[  0.0% |     0/0 | ✓3987 | ✗   1] ✓ tests/gateway/test_response_filters.py (3✓, 0.8s)
[  0.0% |     0/0 | ✓4005 | ✗   1] ✓ tests/gateway/test_reasoning_command.py (18✓, 1.7s)
[  0.0% |     0/0 | ✓4014 | ✗   1] ✓ tests/gateway/test_read_only_preflight_config.py (9✓, 2.2s)
[  0.0% |     0/0 | ✓4030 | ✗   1] ✓ tests/gateway/test_replay_entry_fields.py (16✓, 1.3s)
[  0.0% |     0/0 | ✓4036 | ✗   1] ✓ tests/gateway/test_reply_to_injection.py (6✓, 1.3s)
[  0.0% |     0/0 | ✓4041 | ✗   1] ✓ tests/gateway/test_pending_drain_no_recursion.py (5✓, 5.4s)
[  0.0% |     0/0 | ✓4202 | ✗   1] ✓ tests/gateway/test_qqbot.py (161✓, 3.4s)
[  0.0% |     0/0 | ✓4221 | ✗   1] ✓ tests/gateway/test_restart_drain.py (19✓, 1.6s)
[  0.0% |     0/0 | ✓4238 | ✗   1] ✓ tests/gateway/test_resume_command.py (17✓, 1.1s)
[  0.0% |     0/0 | ✓4265 | ✗   1] ✓ tests/gateway/test_restart_notification.py (27✓, 1.4s)
[  0.0% |     0/0 | ✓4274 | ✗   1] ✓ tests/gateway/test_restart_redelivery_dedup.py (9✓, 1.3s)
[  0.0% |     0/0 | ✓4276 | ✗   1] ✓ tests/gateway/test_retry_replacement.py (2✓, 1.2s)
[  0.0% |     0/0 | ✓4278 | ✗   1] ✓ tests/gateway/test_retry_response.py (2✓, 1.2s)
[  0.0% |     0/0 | ✓4309 | ✗   1] ✓ tests/gateway/test_run_tool_media_re.py (31✓, 0.8s)
[  0.0% |     0/0 | ✓4314 | ✗   1] ✓ tests/gateway/test_running_agent_session_toggles.py (5✓, 0.9s)
[  0.0% |     0/0 | ✓4323 | ✗   1] ✓ tests/gateway/test_runtime_config_env_expansion.py (9✓, 1.2s)
[  0.0% |     0/0 | ✓4326 | ✗   1] ✓ tests/gateway/test_runner_fatal_adapter.py (3✓, 1.7s)
[  0.0% |     0/0 | ✓4328 | ✗   1] ✓ tests/gateway/test_run_progress_interrupt.py (2✓, 2.0s)
[  0.0% |     0/0 | ✓4353 | ✗   1] ✓ tests/gateway/test_runtime_footer.py (25✓, 0.9s)
[  0.0% |     0/0 | ✓4373 | ✗   1] ✓ tests/gateway/test_gateway_shutdown.py (20✓, 17.1s)
[  0.0% |     0/0 | ✓4376 | ✗   1] ✓ tests/gateway/test_runtime_env_reload_config_authority.py (3✓, 1.3s)
[  0.0% |     0/0 | ✓4380 | ✗   1] ✓ tests/gateway/test_safe_adapter_disconnect.py (4✓, 1.1s)
[  0.0% |     0/0 | ✓4403 | ✗   1] ✓ tests/gateway/test_send_image_file.py (23✓, 1.1s)
[  0.0% |     0/0 | ✓4422 | ✗   1] ✓ tests/gateway/test_send_multiple_images.py (19✓, 1.2s)
[  0.0% |     0/0 | ✓4457 | ✗   1] ✓ tests/gateway/test_send_retry.py (35✓, 0.9s)
[  0.0% |     0/0 | ✓4462 | ✗   1] ✓ tests/gateway/test_run_cleanup_progress.py (5✓, 3.9s)
[  0.0% |     0/0 | ✓4464 | ✗   1] ✓ tests/gateway/test_send_voice_reply_notify.py (2✓, 1.2s)
[  0.0% |     0/0 | ✓4543 | ✗   1] ✓ tests/gateway/test_session.py (79✓, 1.2s)
[  0.0% |     0/0 | ✓4555 | ✗   1] ✓ tests/gateway/test_session_api.py (12✓, 1.1s)
[  0.0% |     0/0 | ✓4566 | ✗   1] ✓ tests/gateway/test_runner_startup_failures.py (11✓, 3.5s)
[  0.0% |     0/0 | ✓4576 | ✗   1] ✓ tests/gateway/test_session_dm_thread_seeding.py (10✓, 0.8s)
[  0.0% |     0/0 | ✓4581 | ✗   1] ✓ tests/gateway/test_session_boundary_security_state.py (5✓, 0.8s)
[  0.0% |     0/0 | ✓4585 | ✗   1] ✓ tests/gateway/test_session_list_allowed_sources.py (4✓, 0.8s)
[  0.0% |     0/0 | ✓4608 | ✗   1] ✓ tests/gateway/test_session_hygiene.py (23✓, 1.1s)
[  0.0% |     0/0 | ✓4622 | ✗   1] ✓ tests/gateway/test_session_env.py (14✓, 1.4s)
[  0.0% |     0/0 | ✓4625 | ✗   1] ✓ tests/gateway/test_session_model_reset.py (3✓, 0.8s)
[  0.0% |     0/0 | ✓4629 | ✗   1] ✓ tests/gateway/test_session_override_thread_recovery.py (4✓, 1.2s)
[  0.0% |     0/0 | ✓4633 | ✗   1] ✓ tests/gateway/test_session_model_override_routing.py (4✓, 1.4s)
[  0.0% |     0/0 | ✓4642 | ✗   1] ✓ tests/gateway/test_session_info.py (9✓, 2.0s)
[  0.0% |     0/0 | ✓4658 | ✗   1] ✓ tests/gateway/test_session_reset_notify.py (16✓, 0.9s)
[  0.0% |     0/0 | ✓4670 | ✗   1] ✓ tests/gateway/test_session_state_cleanup.py (12✓, 0.9s)
[  0.0% |     0/0 | ✓4688 | ✗   1] ✓ tests/gateway/test_session_store_prune.py (18✓, 0.9s)
[  0.0% |     0/0 | ✓4701 | ✗   1] ✓ tests/gateway/test_session_split_brain_11016.py (13✓, 1.4s)
[  0.0% |     0/0 | ✓4715 | ✗   1] ✓ tests/gateway/test_setup_feishu.py (14✓, 1.0s)
[  0.0% |     0/0 | ✓4717 | ✗   1] ✓ tests/gateway/test_shared_group_sender_prefix.py (2✓, 1.0s)
[  0.0% |     0/0 | ✓4724 | ✗   1] ✓ tests/gateway/test_shutdown_memory_provider_messages.py (7✓, 0.8s)
[  0.0% |     0/0 | ✓4732 | ✗   1] ✓ tests/gateway/test_shutdown_cache_cleanup.py (8✓, 1.3s)
[  0.0% |     0/0 | ✓4740 | ✗   1] ✓ tests/gateway/test_gateway_inactivity_timeout.py (8✓, 21.7s)
[  0.0% |     0/0 | ✓4770 | ✗   1] ✓ tests/gateway/test_shutdown_forensics.py (30✓, 1.5s)
[  0.0% |     0/0 | ✓4824 | ✗   1] ✓ tests/gateway/test_signal_format.py (54✓, 1.0s)
[  0.0% |     0/0 | ✓4842 | ✗   1] ✓ tests/gateway/test_signal_rate_limit.py (18✓, 0.8s)
[  0.0% |     0/0 | ✓4849 | ✗   1] ✓ tests/gateway/test_slack_channel_session_scope.py (7✓, 0.8s)
[  0.0% |     0/0 | ✓4875 | ✗   1] ✓ tests/gateway/test_slack_approval_buttons.py (26✓, 1.1s)
[  0.0% |     0/0 | ✓5001 | ✗   1] ✓ tests/gateway/test_signal.py (126✓, 1.9s)
[  0.0% |     0/0 | ✓5012 | ✗   1] ✓ tests/gateway/test_slack_channel_skills.py (11✓, 0.9s)
[  0.0% |     0/0 | ✓5042 | ✗   1] ✓ tests/gateway/test_simplex_plugin.py (30✓, 1.5s)
[  0.0% |     0/0 | ✓5063 | ✗   1] ✓ tests/gateway/test_slash_access.py (21✓, 0.9s)
[  0.0% |     0/0 | ✓5077 | ✗   1] ✓ tests/gateway/test_slack_plugin_action_handlers.py (14✓, 1.1s)
[  0.0% |     0/0 | ✓5083 | ✗   1] ✓ tests/gateway/test_session_boundary_hooks.py (6✓, 6.0s)
[  0.0% |     0/0 | ✓5138 | ✗   1] ✓ tests/gateway/test_slack_mention.py (55✓, 1.8s)
[  0.0% |     0/0 | ✓5177 | ✗   1] ✓ tests/gateway/test_sms.py (39✓, 1.5s)
[  0.0% |     0/0 | ✓5195 | ✗   1] ✓ tests/gateway/test_slash_access_dispatch.py (18✓, 1.6s)
[  0.0% |     0/0 | ✓5198 | ✗   1] ✓ tests/gateway/test_ssl_certs.py (3✓, 0.8s)
[  0.0% |     0/0 | ✓5200 | ✗   1] ✓ tests/gateway/test_ssl_cert_detection.py (2✓, 0.9s)
[  0.0% |     0/0 | ✓5206 | ✗   1] ✓ tests/gateway/test_sse_agent_cancel.py (6✓, 1.1s)
[  0.0% |     0/0 | ✓5279 | ✗   1] ✓ tests/gateway/test_status.py (73✓, 1.2s)
[  0.0% |     0/0 | ✓5284 | ✗   1] ✓ tests/gateway/test_steer_command.py (5✓, 1.0s)
[  0.0% |     0/0 | ✓5480 | ✗   1] ✓ tests/gateway/test_slack.py (196✓, 3.8s)
[  0.0% |     0/0 | ✓5497 | ✗   1] ✓ tests/gateway/test_sticker_cache.py (17✓, 0.9s)
[  0.0% |     0/0 | ✓5514 | ✗   1] ✓ tests/gateway/test_status_command.py (17✓, 1.3s)
[  0.0% |     0/0 | ✓5518 | ✗   1] ✓ tests/gateway/test_step_callback_compat.py (4✓, 1.1s)
[  0.0% |     0/0 | ✓5537 | ✗   1] ✓ tests/gateway/test_session_race_guard.py (19✓, 6.6s)
[  0.0% |     0/0 | ✓5544 | ✗   1] ✓ tests/gateway/test_stop_thread_sibling.py (7✓, 1.3s)
[  0.0% |     0/0 | ✓5590 | ✗   1] ✓ tests/gateway/test_source_golden_path_verifier.py (46✓, 3.4s)
[  0.0% |     0/0 | ✓5603 | ✗   1] ✓ tests/gateway/test_stream_events.py (13✓, 0.9s)
[  0.0% |     0/0 | ✓5612 | ✗   1] ✓ tests/gateway/test_stream_consumer_thread_routing.py (9✓, 1.0s)
[  0.0% |     0/0 | ✓5619 | ✗   1] ✓ tests/gateway/test_stt_config.py (7✓, 1.1s)
[  0.0% |     0/0 | ✓5637 | ✗   1] ✓ tests/gateway/test_stream_consumer_draft.py (18✓, 1.5s)
[  0.0% |     0/0 | ✓5646 | ✗   1] ✓ tests/gateway/test_stuck_loop.py (9✓, 1.3s)
[  0.0% |     0/0 | ✓5650 | ✗   1] ✓ tests/gateway/test_task26_final_authority.py (4✓, 0.8s)
[  0.0% |     0/0 | ✓5678 | ✗   1] ✓ tests/gateway/test_stream_consumer_fresh_final.py (28✓, 1.9s)
[  0.0% |     0/0 | ✓5695 | ✗   1] ✓ tests/gateway/test_subagent_protection_30170.py (17✓, 1.5s)
[  0.0% |     0/0 | ✓5728 | ✗   1] ✓ tests/gateway/test_run_progress_topics.py (33✓, 13.1s)
[  0.0% |     0/0 | ✓5765 | ✗   1] ✓ tests/gateway/test_task7_generation_hardening.py (37✓, 1.5s)
[  0.0% |     0/0 | ✓5770 | ✗   1] ✓ tests/gateway/test_telegram_audio_vs_voice.py (5✓, 0.9s)
[  0.0% |     0/0 | ✓5827 | ✗   1] ✓ tests/gateway/test_teams.py (57✓, 1.4s)
[  0.0% |     0/0 | ✓5834 | ✗   1] ✓ tests/gateway/test_teams_pipeline_runtime_wiring.py (7✓, 1.4s)
[  0.0% |     0/0 | ✓5844 | ✗   1] ✓ tests/gateway/test_telegram_activation_notice.py (10✓, 1.1s)
[  0.0% |     0/0 | ✓5847 | ✗   1] ✓ tests/gateway/test_task26_final_state.py (3✓, 2.0s)
[  0.0% |     0/0 | ✓5852 | ✗   1] ✓ tests/gateway/test_telegram_callback_auth_fail_closed.py (5✓, 1.0s)
[  0.0% |     0/0 | ✓5872 | ✗   1] ✓ tests/gateway/test_telegram_approval_buttons.py (20✓, 1.4s)
[  0.0% |     0/0 | ✓5885 | ✗   1] ✓ tests/gateway/test_telegram_caption_merge.py (13✓, 1.0s)
[  0.0% |     0/0 | ✓5888 | ✗   1] ✓ tests/gateway/test_telegram_channel_posts.py (3✓, 1.3s)
[  0.0% |     0/0 | ✓5894 | ✗   1] ✓ tests/gateway/test_telegram_customer_bootstrap.py (6✓, 1.2s)
[  0.0% |     0/0 | ✓5906 | ✗   1] ✓ tests/gateway/test_telegram_clarify_buttons.py (12✓, 1.3s)
[  0.0% |     0/0 | ✓5925 | ✗   1] ✓ tests/gateway/test_telegram_customer_surface_receipts.py (19✓, 1.3s)
[  0.0% |     0/0 | ✓5930 | ✗   1] ✓ tests/gateway/test_telegram_forum_commands.py (5✓, 1.1s)
[  0.0% |     0/0 | ✓5940 | ✗   1] ✓ tests/gateway/test_telegram_conflict.py (10✓, 2.0s)
[  0.0% |     0/0 | ✓5943 | ✗   1] ✓ tests/gateway/test_telegram_mock_bootstrap.py (3✓, 0.7s)
[  0.0% |     0/0 | ✓6044 | ✗   1] ✓ tests/gateway/test_telegram_format.py (101✓, 1.7s)
[  0.0% |     0/0 | ✓6047 | ✗   1] ✓ tests/gateway/test_telegram_max_doc_bytes.py (3✓, 1.0s)
[  0.0% |     0/0 | ✓6066 | ✗   1] ✓ tests/gateway/test_telegram_mention_boundaries.py (19✓, 1.0s)
[  0.0% |     0/0 | ✓6072 | ✗   1] ✓ tests/gateway/test_telegram_model_picker.py (6✓, 1.5s)
[  0.0% |     0/0 | ✓6092 | ✗   1] ✓ tests/gateway/test_telegram_nutrition_addresses.py (20✓, 0.9s)
[  0.0% |     0/0 | ✓6187 | ✗   1] ✓ tests/gateway/test_telegram_group_gating.py (95✓, 2.3s)
[  0.0% |     0/0 | ✓6202 | ✗   1] ✓ tests/gateway/test_telegram_network_reconnect.py (15✓, 1.1s)
[  0.0% |     0/0 | ✓6248 | ✗   1] ✓ tests/gateway/test_telegram_network.py (46✓, 1.7s)
[  0.0% |     0/0 | ✓6323 | ✗   1] ✓ tests/gateway/test_restart_resume_pending.py (75✓, 17.7s)
[  0.0% |     0/0 | ✓6329 | ✗   1] ✓ tests/gateway/test_telegram_noise_filter.py (6✓, 1.3s)
[  0.0% |     0/0 | ✓6344 | ✗   1] ✓ tests/gateway/test_telegram_nutrition_onboarding_callback_observability.py (15✓, 1.3s)
[  0.0% |     0/0 | ✓6357 | ✗   1] ✓ tests/gateway/test_telegram_nutrition_onboarding_copy.py (13✓, 0.9s)
[  0.0% |     0/0 | ✓6362 | ✗   1] ✓ tests/gateway/test_telegram_nutrition_onboarding_direct_entry.py (5✓, 1.2s)
[  0.0% |     0/0 | ✓6366 | ✗   1] ✓ tests/gateway/test_telegram_overflow_partial.py (4✓, 1.0s)
[  0.0% |     0/0 | ✓6374 | ✗   1] ✓ tests/gateway/test_telegram_nutrition_onboarding_preview.py (8✓, 1.3s)
[  0.0% |     0/0 | ✓6415 | ✗   1] ✓ tests/gateway/test_telegram_documents.py (41✓, 4.1s)
[  0.0% |     0/0 | ✓6424 | ✗   1] ✓ tests/gateway/test_telegram_nutrition_onboarding_preview_runtime.py (9✓, 1.4s)
[  0.0% |     0/0 | ✓6486 | ✗   1] ✓ tests/gateway/test_telegram_nutrition_onboarding.py (62✓, 2.4s)
[  0.0% |     0/0 | ✓6499 | ✗   1] ✓ tests/gateway/test_telegram_nutrition_operator_console.py (13✓, 1.4s)
[  0.0% |     0/0 | ✓6592 | ✗   1] ✓ tests/gateway/test_stream_consumer.py (93✓, 7.9s)
[  0.0% |     0/0 | ✓6593 | ✗   1] ✓ tests/gateway/test_telegram_photo_interrupts.py (1✓, 1.5s)
[  0.0% |     0/0 | ✓6610 | ✗   1] ✓ tests/gateway/test_telegram_polling_receipts.py (17✓, 1.3s)
[  0.0% |     0/0 | ✓6613 | ✗   1] ✓ tests/gateway/test_telegram_polling_receipts_multiprocess.py (3✓, 0.9s)
[  0.0% |     0/0 | ✓6635 | ✗   1] ✓ tests/gateway/test_telegram_progress_edit_transient.py (22✓, 0.9s)
[  0.0% |     0/0 | ✓6639 | ✗   1] ✓ tests/gateway/test_telegram_reply_quote.py (4✓, 0.9s)
[  0.0% |     0/0 | ✓6642 | ✗   1] ✓ tests/gateway/test_telegram_send_draft_format.py (3✓, 1.0s)
[  0.0% |     0/0 | ✓6770 | ✗   1] ✓ tests/gateway/test_telegram_physique_checkin.py (128✓, 2.2s)
[  0.0% |     0/0 | ✓6774 | ✗   1] ✓ tests/gateway/test_telegram_room_bootstrap_adversarial.py (4✓, 1.3s)
[  0.0% |     0/0 | ✓6829 | ✗   1] ✓ tests/gateway/test_telegram_rich_messages.py (55✓, 1.4s)
[  0.0% |     0/0 | ✓6850 | ✗   1] ✓ tests/gateway/test_telegram_reactions.py (21✓, 1.6s)
[  0.0% |     0/0 | ✓6861 | ✗   1] ✓ tests/gateway/test_telegram_staff_membership_gate.py (11✓, 0.8s)
[  0.0% |     0/0 | ✓6864 | ✗   1] ✓ tests/gateway/test_telegram_slash_confirm.py (3✓, 1.1s)
[  0.0% |     0/0 | ✓6866 | ✗   1] ✓ tests/gateway/test_telegram_staff_membership_polling.py (2✓, 1.0s)
[  0.0% |     0/0 | ✓6875 | ✗   1] ✓ tests/gateway/test_telegram_status_indicator.py (9✓, 1.0s)
[  0.0% |     0/0 | ✓6915 | ✗   1] ✓ tests/gateway/test_telegram_reply_mode.py (40✓, 2.1s)
[  0.0% |     0/0 | ✓6920 | ✗   1] ✓ tests/gateway/test_telegram_status_update.py (5✓, 0.9s)
[  0.0% |     0/0 | ✓6932 | ✗   1] ✓ tests/gateway/test_telegram_text_batch_perf.py (12✓, 0.9s)
[  0.0% |     0/0 | ✓6937 | ✗   1] ✓ tests/gateway/test_telegram_webhook_secret.py (5✓, 0.8s)
[  0.0% |     0/0 | ✓6945 | ✗   1] ✓ tests/gateway/test_tool_response_drop_recovery.py (8✓, 0.8s)
[  0.0% |     0/0 | ✓6947 | ✗   1] ✓ tests/gateway/test_telegram_voice_v0_regressions.py (2✓, 1.4s)
[  0.0% |     0/0 | ✓6991 | ✗   1] ✓ tests/gateway/test_telegram_topic_mode.py (44✓, 1.5s)
[  0.0% |     0/0 | ✓7007 | ✗   1] ✓ tests/gateway/test_title_command.py (16✓, 1.1s)
[  0.0% |     0/0 | ✓7015 | ✗   1] ✓ tests/gateway/test_transcript_offset.py (8✓, 1.0s)
[  0.0% |     0/0 | ✓7021 | ✗   1] ✓ tests/gateway/test_trainer_free_v1_contract.py (6✓, 1.2s)
[  0.0% |     0/0 | ✓7028 | ✗   1] ✓ tests/gateway/test_tts_media_routing.py (7✓, 1.2s)
[  0.0% |     0/0 | ✓7034 | ✗   1] ✓ tests/gateway/test_telegram_text_batching.py (6✓, 2.1s)
[  0.0% |     0/0 | ✓7039 | ✗   1] ✓ tests/gateway/test_unavailable_skill_hint.py (5✓, 0.8s)
[  0.0% |     0/0 | ✓7045 | ✗   1] ✓ tests/gateway/test_undo_rewind_session.py (6✓, 0.7s)
[  0.0% |     0/0 | ✓7078 | ✗   1] ✓ tests/gateway/test_unauthorized_dm_behavior.py (33✓, 0.9s)
[  0.0% |     0/0 | ✓7079 | ✗   1] ✓ tests/gateway/test_video_context_note.py (1✓, 0.7s)
[  0.0% |     0/0 | ✓7090 | ✗   1] ✓ tests/gateway/test_unknown_command.py (11✓, 1.4s)
[  0.0% |     0/0 | ✓7098 | ✗   1] ✓ tests/gateway/test_usage_command.py (8✓, 1.0s)
[  0.0% |     0/0 | ✓7099 | ✗   1] ✓ tests/gateway/test_version_command.py (1✓, 0.8s)
[  0.0% |     0/0 | ✓7102 | ✗   1] ✓ tests/gateway/test_vision_memory_leak.py (3✓, 0.8s)
[  0.0% |     0/0 | ✓7137 | ✗   1] ✓ tests/gateway/test_update_command.py (35✓, 1.6s)
[  0.0% |     0/0 | ✓7145 | ✗   1] ✓ tests/gateway/test_verbose_command.py (8✓, 1.4s)
[  0.0% |     0/0 | ✓7156 | ✗   1] ✓ tests/gateway/test_weak_credential_guard.py (11✓, 1.0s)
[  0.0% |     0/0 | ✓7166 | ✗   1] ✓ tests/gateway/test_voice_mode_platform_isolation.py (10✓, 1.2s)
[  0.0% |     0/0 | ✓7180 | ✗   1] ✓ tests/gateway/test_webhook_deliver_only.py (14✓, 1.0s)
[  0.0% |     0/0 | ✓7193 | ✗   1] ✓ tests/gateway/test_webhook_dynamic_routes.py (13✓, 0.9s)
[  0.0% |     0/0 | ✓7261 | ✗   1] ✓ tests/gateway/test_webhook_adapter.py (68✓, 1.3s)
[  0.0% |     0/0 | ✓7265 | ✗   1] ✓ tests/gateway/test_webhook_integration.py (4✓, 1.0s)
[  0.0% |     0/0 | ✓7268 | ✗   1] ✓ tests/gateway/test_telegram_send_path_health.py (3✓, 5.8s)
[  0.0% |     0/0 | ✓7271 | ✗   1] ✓ tests/gateway/test_webhook_signature_rate_limit.py (3✓, 0.9s)
[  0.0% |     0/0 | ✓7283 | ✗   1] ✓ tests/gateway/test_wecom_callback.py (12✓, 1.0s)
[  0.0% |     0/0 | ✓7329 | ✗   1] ✓ tests/gateway/test_wecom.py (46✓, 1.1s)
[  0.0% |     0/0 | ✓7342 | ✗   1] ✓ tests/gateway/test_weixin_typing.py (13✓, 0.9s)
[  0.0% |     0/0 | ✓7447 | ✗   1] ✓ tests/gateway/test_whatsapp_cloud.py (105✓, 1.4s)
[  0.0% |     0/0 | ✓7458 | ✗   1] ✓ tests/gateway/test_whatsapp_stale_bridge.py (11✓, 0.9s)
[  0.0% |     0/0 | ✓7484 | ✗   1] ✓ tests/gateway/test_whatsapp_group_gating.py (26✓, 1.3s)
[  0.0% |     0/0 | ✓7492 | ✗   1] ✓ tests/gateway/test_whatsapp_reply_prefix.py (8✓, 1.3s)
[  0.0% |     0/0 | ✓7519 | ✗   1] ✓ tests/gateway/test_whatsapp_connect.py (27✓, 2.0s)
[  0.0% |     0/0 | ✓7542 | ✗   1] ✓ tests/gateway/test_text_batching.py (23✓, 6.8s)
[  0.0% |     0/0 | ✓7548 | ✗   1] ✓ tests/gateway/test_whatsapp_text_batching.py (6✓, 1.1s)
[  0.0% |     0/0 | ✓7554 | ✗   1] ✓ tests/gateway/test_ws_auth_retry.py (6✓, 0.9s)
[  0.0% |     0/0 | ✓7623 | ✗   1] ✓ tests/gateway/test_weixin.py (69✓, 2.9s)
[  0.0% |     0/0 | ✓7807 | ✗   1] ✓ tests/gateway/test_voice_command.py (184✓, 4.3s)
[  0.0% |     0/0 | ✓7808 | ✗   1] ✓ tests/gateway/test_yolo_command.py (1✓, 1.0s)
[  0.0% |     0/0 | ✓7835 | ✗   1] ✓ tests/gateway/test_whatsapp_formatting.py (27✓, 3.0s)
[  0.0% |     0/0 | ✓7856 | ✗   1] ✓ tests/gateway/test_update_streaming.py (21✓, 8.4s)
[  0.0% |     0/0 | ✓7902 | ✗   1] ✓ tests/gateway/test_telegram_thread_fallback.py (46✓, 18.8s)
[  0.0% |     0/0 | ✓8064 | ✗   1] ✓ tests/gateway/test_adaptive_nutrition.py (162✓, 332.5s)

=== Summary: 376 files, 8064 tests passed, 1 failed (0% complete) in 333.6s (12 workers) ===
  Durations cached to test_durations.json (376 files)

=== Per-file subprocess time distribution ===
  Files:   376
  Total subprocess CPU-wall: 959.3s  (runner wall: 333.6s, parallelism: 12x)
  P50: 1.17s  P90: 2.33s  P95: 3.94s  P99: 17.74s  Max: 332.46s
  <1s: 112 files (30%)  <2s: 326 files (87%)
  Top 10 slowest:
    332.46s  tests/gateway/test_adaptive_nutrition.py
     21.71s  tests/gateway/test_gateway_inactivity_timeout.py
     18.81s  tests/gateway/test_telegram_thread_fallback.py
     17.74s  tests/gateway/test_restart_resume_pending.py
     17.11s  tests/gateway/test_gateway_shutdown.py
     13.14s  tests/gateway/test_run_progress_topics.py
      8.39s  tests/gateway/test_update_streaming.py
      7.88s  tests/gateway/test_stream_consumer.py
      7.55s  tests/gateway/test_agent_cache.py
      7.37s  tests/gateway/test_keep_typing_timeout.py

=== Failure output ===

--- tests/gateway/test_api_server.py ---

==================================== ERRORS ====================================
______________ ERROR collecting tests/gateway/test_api_server.py _______________
ImportError while importing test module '/home/cube/projects/richard/hermes-agent/tests/gateway/test_api_server.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../../../miniconda3/lib/python3.12/importlib/__init__.py:90: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
tests/gateway/test_api_server.py:24: in <module>
    from aiohttp import web
E   ModuleNotFoundError: No module named 'aiohttp'
=========================== short test summary info ============================
ERROR tests/gateway/test_api_server.py
!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!
1 error in 0.14s

--- tests/gateway/test_api_server_multimodal.py ---

==================================== ERRORS ====================================
_________ ERROR collecting tests/gateway/test_api_server_multimodal.py _________
ImportError while importing test module '/home/cube/projects/richard/hermes-agent/tests/gateway/test_api_server_multimodal.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../../../miniconda3/lib/python3.12/importlib/__init__.py:90: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
tests/gateway/test_api_server_multimodal.py:13: in <module>
    from aiohttp import web
E   ModuleNotFoundError: No module named 'aiohttp'
=========================== short test summary info ============================
ERROR tests/gateway/test_api_server_multimodal.py
!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!
1 error in 0.11s

--- tests/gateway/test_api_server_jobs.py ---

==================================== ERRORS ====================================
____________ ERROR collecting tests/gateway/test_api_server_jobs.py ____________
ImportError while importing test module '/home/cube/projects/richard/hermes-agent/tests/gateway/test_api_server_jobs.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../../../miniconda3/lib/python3.12/importlib/__init__.py:90: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
tests/gateway/test_api_server_jobs.py:17: in <module>
    from aiohttp import web
E   ModuleNotFoundError: No module named 'aiohttp'
=========================== short test summary info ============================
ERROR tests/gateway/test_api_server_jobs.py
!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!
1 error in 0.12s

--- tests/gateway/test_api_server_runs.py ---

==================================== ERRORS ====================================
____________ ERROR collecting tests/gateway/test_api_server_runs.py ____________
ImportError while importing test module '/home/cube/projects/richard/hermes-agent/tests/gateway/test_api_server_runs.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../../../miniconda3/lib/python3.12/importlib/__init__.py:90: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
tests/gateway/test_api_server_runs.py:16: in <module>
    from aiohttp import web
E   ModuleNotFoundError: No module named 'aiohttp'
=========================== short test summary info ============================
ERROR tests/gateway/test_api_server_runs.py
!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!
1 error in 0.12s

--- tests/gateway/test_commit_observer.py ---
..........F.....                                                         [100%]
=================================== FAILURES ===================================
__________ test_unrelated_sibling_notification_cannot_satisfy_observe __________

tmp_path = PosixPath('/tmp/pytest-of-cube/pytest-444/test_unrelated_sibling_notific0')

    def test_unrelated_sibling_notification_cannot_satisfy_observe(tmp_path: Path) -> None:
        observer, watched, _receipts = _observer(tmp_path)
        sibling = _private_file(watched.parent / "unrelated.json", b"before")
        with observer:
            _arm(observer, watched)
            trigger = threading.Event()
    
            def mutate() -> None:
                assert trigger.wait(timeout=1.0)
                sibling.write_bytes(b"unrelated-change")
                os.chmod(sibling, 0o600)
                watched.write_bytes(b"authoritative-change")
                os.chmod(watched, 0o600)
    
            with ThreadPoolExecutor(max_workers=1) as pool:
                completed = pool.submit(mutate)
                trigger.set()
                event = observer.observe(sequence=41, timeout=1.0)
                completed.result(timeout=2.0)
    
        assert event["path"] == str(watched)
>       assert event["commit_byte_hash"] == hashlib.sha256(b"authoritative-change").hexdigest()
E       AssertionError: assert 'e3b0c44298fc...5991b7852b855' == '5bfd52af178f...96811518d9e75'
E         
E         - 5bfd52af178fb17e990390a3f209fa7f5b5d796b783abadf6c796811518d9e75
E         + e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

tests/gateway/test_commit_observer.py:244: AssertionError
=========================== short test summary info ============================
FAILED tests/gateway/test_commit_observer.py::test_unrelated_sibling_notification_cannot_satisfy_observe
1 failed, 15 passed in 0.25s

=== 1 file with test failures (1 test failed) ===
  tests/gateway/test_commit_observer.py  (1 test failed)
=== 4 files where no tests ran (collection/import error, timeout before collection, etc.) ===
  tests/gateway/test_api_server.py
  tests/gateway/test_api_server_multimodal.py
  tests/gateway/test_api_server_jobs.py
  tests/gateway/test_api_server_runs.py
EXIT=1
