From 7bc6de5032e9bc4d11279106a6d3fab2c7eee65b Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Fri, 25 Sep 2026 17:03:41 -0500 Subject: [PATCH] test(serve): expect the dual ready-token announcement in the discovery-after-bind suite The headless serve path now writes HERMES_BACKEND_READY then HERMES_DASHBOARD_READY (#60772); update the sentinel-count assertions in test_serve_mcp_discovery_after_bind.py to match, for both the discovery-armed and plain headless start_server calls. --- .../test_serve_mcp_discovery_after_bind.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/tests/hermes_cli/test_serve_mcp_discovery_after_bind.py b/tests/hermes_cli/test_serve_mcp_discovery_after_bind.py index 4e319427f3..8a67b75a2e 100644 --- a/tests/hermes_cli/test_serve_mcp_discovery_after_bind.py +++ b/tests/hermes_cli/test_serve_mcp_discovery_after_bind.py @@ -41,20 +41,24 @@ def test_desktop_serve_arms_mcp_discovery_only_after_ready_sentinel(monkeypatch) host="127.0.0.1", port=0, open_browser=False, headless=True, start_mcp_discovery_after_bind=True, ) + # A headless `serve` announces BOTH ready tokens — neutral first, legacy + # second (#60772) — so the sentinel writer fires exactly twice before the + # deferred discovery timer is armed. timer = mcp_startup._mcp_discovery_deferred - assert order == ["sentinel"] and isinstance(timer, threading.Timer) + assert order == ["sentinel", "sentinel"] and isinstance(timer, threading.Timer) timer.cancel() # An agent build inside the delay window pulls discovery forward itself. mcp_startup.wait_for_mcp_discovery(timeout=0) - assert order == ["sentinel", "discovery:dashboard-mcp-discovery"] + assert order == ["sentinel", "sentinel", "discovery:dashboard-mcp-discovery"] assert mcp_startup._mcp_discovery_deferred is None - # Without the flag (dashboard / non-Desktop serve) start_server does not - # start discovery itself — cmd_dashboard's pre-import path still owns it. + # Without the flag (any headless serve) start_server does not start + # discovery itself — cmd_dashboard's pre-import path still owns it. The + # dual-token announcement is headless-wide, not discovery-specific. order.clear() _reset_discovery_state(monkeypatch) web_server.start_server(host="127.0.0.1", port=0, open_browser=False, headless=True) - assert order == ["sentinel"] and mcp_startup._mcp_discovery_deferred is None + assert order == ["sentinel", "sentinel"] and mcp_startup._mcp_discovery_deferred is None def test_deferred_discovery_fires_once_and_is_idempotent(monkeypatch):