........................................................................ [ 0%] ........................................................................ [ 1%] ........................................................................ [ 2%] ........................................................................ [ 3%] ........................................................................ [ 4%] ........................................................................ [ 5%] ........................................................................ [ 6%] ........................................................................ [ 7%] ........................................................................ [ 7%] ........................................................................ [ 8%] ........................................................................ [ 9%] ........................................................................ [ 10%] ........................................................................ [ 11%] ........................................................................ [ 12%] ........................................................................ [ 13%] ........................................................................ [ 14%] ........................................................................ [ 14%] ........................................................................ [ 15%] ........................................................................ [ 16%] ........................................................................ [ 17%] ........................................................................ [ 18%] ........................................................................ [ 19%] ........................................................................ [ 20%] ........................................................................ [ 21%] ........................................................................ [ 21%] ........................................................................ [ 22%] ........................................................................ [ 23%] ........................................................................ [ 24%] ........................................................................ [ 25%] ...........................................ssssssssssssssssssssss....... [ 26%] sssssssssssssssssssssss................................................. [ 27%] ........................................................................ [ 28%] ........................................................................ [ 29%] ........................................................................ [ 29%] ........................................................................ [ 30%] ........................................................................ [ 31%] ........................................................................ [ 32%] ........................................................................ [ 33%] ........................................................................ [ 34%] ........................................................................ [ 35%] ........................................................................ [ 36%] ........................................................................ [ 36%] ........................................................................ [ 37%] ........................................................................ [ 38%] ........................................................................ [ 39%] ........................................................................ [ 40%] ........................................................................ [ 41%] ....................................................................s... [ 42%] s....................................................................... [ 43%] ........................................................................ [ 43%] ........................................................................ [ 44%] ........................................................................ [ 45%] ........................................................................ [ 46%] ........................................................................ [ 47%] ........................................................................ [ 48%] ........................................................................ [ 49%] ........................................................................ [ 50%] ........................................................................ [ 50%] ................ss..........................s........................... [ 51%] ........................................................................ [ 52%] .........sssssss........................................................ [ 53%] ........................................................................ [ 54%] ........................................................................ [ 55%] ........................................................................ [ 56%] ........................................................................ [ 57%] ........................................................................ [ 58%] ........................................................................ [ 58%] .........................................................F.............. [ 59%] ........................................................................ [ 60%] ........................................................................ [ 61%] ........................................................................ [ 62%] ........................................................................ [ 63%] ........................................................................ [ 64%] ........................................................................ [ 65%] ........................................................................ [ 65%] ........................................................................ [ 66%] ........................................................................ [ 67%] ........................................................................ [ 68%] ........................................................................ [ 69%] ........................................................................ [ 70%] ........................................................................ [ 71%] ........................................................................ [ 72%] ................F....................................................... [ 72%] ........................................................................ [ 73%] ........................................................................ [ 74%] ........................................................................ [ 75%] ........................................................................ [ 76%] ........................................................................ [ 77%] ........................................................................ [ 78%] ........................................................................ [ 79%] ........................................................................ [ 79%] ........................................................................ [ 80%] ........................................................................ [ 81%] ........................................................................ [ 82%] ........................................................................ [ 83%] ........................................................................ [ 84%] ........................................................................ [ 85%] ........................................................................ [ 86%] ........................................................................ [ 87%] ........................................................................ [ 87%] ........................................................................ [ 88%] ........................................................................ [ 89%] ........................................................................ [ 90%] ........................................................................ [ 91%] ........................................................................ [ 92%] ........................................................................ [ 93%] ........................................................................ [ 94%] ........................................................................ [ 94%] ........................................................................ [ 95%] ........................................................................ [ 96%] ........................................................................ [ 97%] ........................................................................ [ 98%] ........................................................................ [ 99%] ......................................................... [100%] =================================== FAILURES =================================== _______________ test_format_footer_skips_missing_context_length ________________ def test_format_footer_skips_missing_context_length(): out = format_runtime_footer( model="openai/gpt-5.4", context_tokens=500, context_length=None, cwd="/tmp/wd", fields=("model", "context_pct", "cwd"), ) # context_pct dropped silently; no "?%" artifact assert "%" not in out assert "gpt-5.4" in out > assert "/tmp/wd" in out E AssertionError: assert '/tmp/wd' in 'gpt-5.4 ยท ~/wd' tests/gateway/test_runtime_footer.py:84: AssertionError ____ TestGatewayPidState.test_get_running_pid_rejects_live_non_gateway_pid _____ self = tmp_path = PosixPath('/tmp/pytest-of-cube/pytest-0/test_get_running_pid_rejects_l0') monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7d2542312570> def test_get_running_pid_rejects_live_non_gateway_pid(self, tmp_path, monkeypatch): monkeypatch.setenv("HERMES_HOME", str(tmp_path)) pid_path = tmp_path / "gateway.pid" pid_path.write_text(str(os.getpid())) assert status.get_running_pid() is None # A legacy, world-readable PID is not trusted or removed by a status # probe; startup fails closed rather than touching an unsafe path. > assert pid_path.exists() E AssertionError: assert False E + where False = exists() E + where exists = PosixPath('/tmp/pytest-of-cube/pytest-0/test_get_running_pid_rejects_l0/gateway.pid').exists tests/gateway/test_status.py:60: AssertionError =============================== warnings summary =============================== tests/gateway/test_api_server.py: 105 warnings /home/cube/projects/richard/hermes-agent/tests/gateway/test_api_server.py:443: NotAppKeyWarning: It is recommended to use web.AppKey instances for keys. https://docs.aiohttp.org/en/stable/web_advanced.html#application-s-config app["api_server_adapter"] = adapter tests/gateway/test_api_server_bind_guard.py::TestConnectBindGuard::test_refuses_ipv4_wildcard_without_key tests/gateway/test_api_server_bind_guard.py::TestConnectBindGuard::test_refuses_ipv6_wildcard_without_key tests/gateway/test_api_server_bind_guard.py::TestConnectBindGuard::test_refuses_loopback_without_key tests/gateway/test_weak_credential_guard.py::TestAPIServerPlaceholderKeyGuard::test_refuses_wildcard_with_placeholder_key tests/gateway/test_weak_credential_guard.py::TestAPIServerPlaceholderKeyGuard::test_refuses_wildcard_with_asterisk_key /home/cube/projects/richard/hermes-agent/gateway/platforms/api_server.py:4293: NotAppKeyWarning: It is recommended to use web.AppKey instances for keys. https://docs.aiohttp.org/en/stable/web_advanced.html#application-s-config self._app["api_server_adapter"] = self tests/gateway/test_api_server_jobs.py: 40 warnings /home/cube/projects/richard/hermes-agent/tests/gateway/test_api_server_jobs.py:54: NotAppKeyWarning: It is recommended to use web.AppKey instances for keys. https://docs.aiohttp.org/en/stable/web_advanced.html#application-s-config app["api_server_adapter"] = adapter tests/gateway/test_api_server_multimodal.py::TestChatCompletionsMultimodalHTTP::test_inline_image_preserved_to_run_agent tests/gateway/test_api_server_multimodal.py::TestChatCompletionsMultimodalHTTP::test_text_only_array_collapses_to_string tests/gateway/test_api_server_multimodal.py::TestChatCompletionsMultimodalHTTP::test_file_part_returns_400 tests/gateway/test_api_server_multimodal.py::TestChatCompletionsMultimodalHTTP::test_non_image_data_url_returns_400 tests/gateway/test_api_server_multimodal.py::TestResponsesMultimodalHTTP::test_input_image_canonicalized_and_forwarded tests/gateway/test_api_server_multimodal.py::TestResponsesMultimodalHTTP::test_input_file_returns_400 /home/cube/projects/richard/hermes-agent/tests/gateway/test_api_server_multimodal.py:132: NotAppKeyWarning: It is recommended to use web.AppKey instances for keys. https://docs.aiohttp.org/en/stable/web_advanced.html#application-s-config app["api_server_adapter"] = adapter tests/gateway/test_api_server_runs.py: 22 warnings /home/cube/projects/richard/hermes-agent/tests/gateway/test_api_server_runs.py:46: NotAppKeyWarning: It is recommended to use web.AppKey instances for keys. https://docs.aiohttp.org/en/stable/web_advanced.html#application-s-config app["api_server_adapter"] = adapter tests/gateway/test_cron_fire_webhook.py::test_valid_token_accepts_and_fires tests/gateway/test_cron_fire_webhook.py::test_invalid_token_401_and_no_fire tests/gateway/test_cron_fire_webhook.py::test_missing_token_401 tests/gateway/test_cron_fire_webhook.py::test_missing_job_id_400 tests/gateway/test_cron_fire_webhook.py::test_fire_does_not_require_api_server_key /home/cube/projects/richard/hermes-agent/tests/gateway/test_cron_fire_webhook.py:28: NotAppKeyWarning: It is recommended to use web.AppKey instances for keys. https://docs.aiohttp.org/en/stable/web_advanced.html#application-s-config app["api_server_adapter"] = adapter tests/gateway/test_discord_race_polish.py::test_concurrent_joins_do_not_double_connect /home/cube/projects/richard/hermes-agent/plugins/platforms/discord/adapter.py:2520: RuntimeWarning: coroutine 'DiscordAdapter._voice_timeout_handler' was never awaited self._voice_timeout_tasks[guild_id] = asyncio.ensure_future( Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. tests/gateway/test_discord_race_polish.py::test_concurrent_joins_do_not_double_connect /home/cube/projects/richard/hermes-agent/plugins/platforms/discord/adapter.py:2379: RuntimeWarning: coroutine 'DiscordAdapter._voice_listen_loop' was never awaited self._voice_listen_tasks[guild_id] = asyncio.ensure_future( Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. tests/gateway/test_google_chat.py::TestOnPubsubMessage::test_callback_exception_does_not_escape /home/cube/miniconda3/lib/python3.12/unittest/mock.py:2217: RuntimeWarning: coroutine 'GoogleChatAdapter._dispatch_message' was never awaited def __init__(self, name, parent): Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. tests/gateway/test_google_chat.py::TestExtractMessagePayload::test_native_chat_api_format_drops_non_message_events /home/cube/projects/richard/hermes-agent/.venv/lib/python3.12/site-packages/psutil/__init__.py:999: RuntimeWarning: coroutine 'GoogleChatAdapter._dispatch_message' was never awaited reverse_ppid_map[ppid].append(pid) Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. tests/gateway/test_ntfy_plugin.py::TestOnMessage::test_duplicate_message_skipped tests/gateway/test_ntfy_plugin.py::TestEnvEnablement::test_home_channel_defaults_to_topic /home/cube/projects/richard/hermes-agent/.venv/lib/python3.12/site-packages/psutil/__init__.py:999: RuntimeWarning: coroutine 'BasePlatformAdapter._keep_typing' was never awaited reverse_ppid_map[ppid].append(pid) Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. tests/gateway/test_ntfy_plugin.py::TestOnMessage::test_title_not_used_as_user_id /home/cube/miniconda3/lib/python3.12/asyncio/base_events.py:2017: RuntimeWarning: coroutine 'BasePlatformAdapter._keep_typing' was never awaited def get_debug(self): Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. tests/gateway/test_nutrition_coaching.py::test_generation_card_updates_the_existing_owner_dm_message_after_terminal_repair /home/cube/miniconda3/lib/python3.12/unittest/mock.py:2217: RuntimeWarning: coroutine 'BasePlatformAdapter._keep_typing' was never awaited def __init__(self, name, parent): Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. tests/gateway/test_qqbot.py::TestDispatchPayload::test_op10_updates_heartbeat_interval /home/cube/projects/richard/hermes-agent/gateway/platforms/qqbot/adapter.py:833: RuntimeWarning: coroutine 'QQAdapter._send_identify' was never awaited self._create_task(self._send_identify()) Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. tests/gateway/test_qqbot.py::TestOp7ServerReconnect::test_op7_closes_websocket /home/cube/projects/richard/hermes-agent/gateway/platforms/qqbot/adapter.py:866: RuntimeWarning: coroutine 'TestOp7ServerReconnect.test_op7_closes_websocket..FakeWS.close' was never awaited self._create_task(self._ws.close()) Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. tests/gateway/test_qqbot.py::TestOp9InvalidSession::test_op9_not_resumable_clears_session /home/cube/projects/richard/hermes-agent/gateway/platforms/qqbot/adapter.py:883: RuntimeWarning: coroutine 'TestOp9InvalidSession.test_op9_not_resumable_clears_session..FakeWS.close' was never awaited self._create_task(self._ws.close()) Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. tests/gateway/test_qqbot.py::TestOp9InvalidSession::test_op9_resumable_preserves_session /home/cube/projects/richard/hermes-agent/gateway/platforms/qqbot/adapter.py:883: RuntimeWarning: coroutine 'TestOp9InvalidSession.test_op9_resumable_preserves_session..FakeWS.close' was never awaited self._create_task(self._ws.close()) Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. tests/gateway/test_slack.py: 27 warnings /home/cube/projects/richard/hermes-agent/gateway/platforms/slack.py:2787: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited user_name = await self._resolve_user_name(user_id, chat_id=channel_id) Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. tests/gateway/test_slack.py::TestBangPrefixCommands::test_bang_works_inside_thread /home/cube/miniconda3/lib/python3.12/unittest/mock.py:434: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited new = type(cls.__name__, bases, {'__doc__': cls.__doc__}) Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. tests/gateway/test_slack.py::TestBangPrefixCommands::test_bang_works_inside_thread tests/gateway/test_slack.py::TestThreadReplyHandling::test_thread_reply_without_mention_with_session_processed tests/gateway/test_slack.py::TestThreadReplyHandling::test_thread_reply_with_mention_strips_bot_id tests/gateway/test_slack.py::TestAssistantThreadLifecycle::test_message_uses_cached_assistant_thread_identity tests/gateway/test_slack_channel_session_scope.py::TestChannelSessionScopeShared::test_thread_reply_scopes_by_thread_even_when_shared tests/gateway/test_slack_channel_session_scope.py::TestThreadReplyAlwaysScopesByThread::test_thread_reply_keyed_by_thread_ts[True] tests/gateway/test_slack_channel_session_scope.py::TestThreadReplyAlwaysScopesByThread::test_thread_reply_keyed_by_thread_ts[False] /home/cube/projects/richard/hermes-agent/gateway/platforms/slack.py:2825: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited await self._fetch_thread_parent_text( Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. tests/gateway/test_slack.py::TestBangPrefixCommands::test_bang_works_inside_thread tests/gateway/test_slack.py::TestAssistantThreadLifecycle::test_message_uses_cached_assistant_thread_identity tests/gateway/test_slack_channel_session_scope.py::TestChannelSessionScopeShared::test_thread_reply_scopes_by_thread_even_when_shared tests/gateway/test_slack_channel_session_scope.py::TestThreadReplyAlwaysScopesByThread::test_thread_reply_keyed_by_thread_ts[True] tests/gateway/test_slack_channel_session_scope.py::TestThreadReplyAlwaysScopesByThread::test_thread_reply_keyed_by_thread_ts[False] /home/cube/projects/richard/hermes-agent/.venv/lib/python3.12/site-packages/_pytest/stash.py:108: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited del self._storage[key] Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. tests/gateway/test_slack_approval_buttons.py::TestSlackThreadContext::test_fetch_thread_context_includes_bot_parent tests/gateway/test_slack_approval_buttons.py::TestSlackThreadContext::test_fetch_thread_context_excludes_self_bot_replies tests/gateway/test_slack_approval_buttons.py::TestSlackThreadContext::test_fetch_thread_context_multi_workspace tests/gateway/test_slack_approval_buttons.py::TestSlackThreadContext::test_fetch_thread_parent_text_from_cache /home/cube/projects/richard/hermes-agent/gateway/platforms/slack.py:3421: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited name = await self._resolve_user_name(display_user, chat_id=channel_id) Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. tests/gateway/test_slack_plugin_action_handlers.py::TestSlackAdapterPluginActionWiring::test_plugin_exception_does_not_propagate_to_slack tests/gateway/test_slack_plugin_action_handlers.py::TestSlackAdapterPluginActionWiring::test_plugin_loader_failure_does_not_break_connect /home/cube/miniconda3/lib/python3.12/unittest/mock.py:2217: RuntimeWarning: coroutine 'SlackAdapter._socket_watchdog_loop' was never awaited def __init__(self, name, parent): Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. tests/gateway/test_sms.py::TestStartupGuard::test_insecure_flag_does_not_set_fatal_error tests/gateway/test_sms.py::TestStartupGuard::test_insecure_flag_does_not_set_fatal_error tests/gateway/test_sms.py::TestStartupGuard::test_insecure_flag_allows_start_without_url tests/gateway/test_sms.py::TestStartupGuard::test_insecure_flag_allows_start_without_url tests/gateway/test_sms.py::TestStartupGuard::test_webhook_url_allows_start tests/gateway/test_sms.py::TestStartupGuard::test_webhook_url_allows_start /home/cube/projects/richard/hermes-agent/.venv/lib/python3.12/site-packages/aiohttp/web_urldispatcher.py:192: DeprecationWarning: Bare functions are deprecated, use async ones warnings.warn( tests/gateway/test_telegram_polling_receipts_multiprocess.py::test_multiprocess_records_preserve_distinct_update_receipts tests/gateway/test_telegram_polling_receipts_multiprocess.py::test_multiprocess_records_preserve_distinct_update_receipts tests/gateway/test_telegram_polling_receipts_multiprocess.py::test_multiprocess_record_and_cleanup_preserve_serial_authority tests/gateway/test_telegram_polling_receipts_multiprocess.py::test_multiprocess_record_and_cleanup_preserve_serial_authority tests/gateway/test_telegram_polling_receipts_multiprocess.py::test_process_crash_while_holding_receipt_lock_does_not_deadlock_next_process tests/gateway/test_telegram_polling_receipts_multiprocess.py::test_process_crash_while_holding_receipt_lock_does_not_deadlock_next_process /home/cube/miniconda3/lib/python3.12/multiprocessing/popen_fork.py:66: DeprecationWarning: This process (pid=3937406) is multi-threaded, use of fork() may lead to deadlocks in the child. self.pid = os.fork() tests/gateway/test_telegram_reply_mode.py::TestEnvVarOverride::test_env_var_empty_value_ignored /home/cube/projects/richard/hermes-agent/.venv/lib/python3.12/site-packages/yaml/error.py:6: RuntimeWarning: coroutine 'SlackAdapter._socket_watchdog_loop' was never awaited def __init__(self, name, index, line, column, buffer, pointer): Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. tests/gateway/test_whatsapp_connect.py::TestBridgeRuntimeFailure::test_send_marks_retryable_fatal_when_managed_bridge_exits /home/cube/miniconda3/lib/python3.12/unittest/mock.py:472: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited __dict__['method_calls'] = _CallList() Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. tests/gateway/test_whatsapp_stale_bridge.py::TestStaleBridgeHandshake::test_restarts_bridge_on_hash_mismatch /home/cube/miniconda3/lib/python3.12/unittest/mock.py:2217: RuntimeWarning: coroutine 'WhatsAppAdapter._poll_messages' was never awaited def __init__(self, name, parent): Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info ============================ FAILED tests/gateway/test_runtime_footer.py::test_format_footer_skips_missing_context_length FAILED tests/gateway/test_status.py::TestGatewayPidState::test_get_running_pid_rejects_live_non_gateway_pid 2 failed, 8134 passed, 59 skipped, 256 warnings in 553.68s (0:09:13)