{"record":{"id":"c2d1d9d5f9a5ff47","repo":"HKUDS/Vibe-Trading","slug":"signal-cli-daemon-check-returned-status-response","errorCode":null,"errorMessage":"signal-cli daemon check returned status {response.status_code}","messagePattern":"signal-cli daemon check returned status (.+?)","errorType":"error_code","errorClass":"ConnectionRefusedError","httpStatus":null,"severity":"critical","filePath":"agent/src/channels/signal.py","lineNumber":477,"sourceCode":"        reconnect_delay_s = 1.0\n        max_reconnect_delay_s = 30.0\n\n        while self._running:\n            try:\n                self.logger.info(\"Connecting to signal-cli daemon at {}...\", base_url)\n\n                # Create HTTP client\n                self._http = httpx.AsyncClient(\n                    timeout=self._HTTP_TIMEOUT_SECONDS, base_url=base_url\n                )\n\n                # Test connection\n                try:\n                    response = await self._http.get(\"/api/v1/check\")\n                    if response.status_code == 200:\n                        self.logger.info(\"Connected to signal-cli daemon\")\n                    else:\n                        raise ConnectionRefusedError(\n                            f\"signal-cli daemon check returned status {response.status_code}\"\n                        )\n                except Exception as e:\n                    raise ConnectionRefusedError(f\"signal-cli daemon not responding: {e}\")\n\n                # Reset reconnect delay after successful connection check.\n                reconnect_delay_s = 1.0\n\n                # Ensure account-level typing indicators are enabled.\n                await self._ensure_typing_indicators_enabled()\n\n                # Start SSE receiver and supervise it. If it exits while we're still\n                # running, treat it as a disconnect and reconnect.\n                self._sse_task = asyncio.create_task(self._sse_receive_loop())\n                await self._sse_task\n                if self._running:\n                    raise ConnectionError(\"Signal SSE stream ended unexpectedly\")\n","sourceCodeStart":459,"sourceCodeEnd":495,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/channels/signal.py#L459-L495","documentation":"The Signal HTTP-mode connector polls signal-cli's /api/v1/check endpoint at startup; a non-200 status means the daemon answered but is unhealthy.","triggerScenarios":"Calling start() on the Signal channel in HTTP mode when signal-cli's REST API returns 4xx/5xx (e.g. unregistered number, wrong port serving something else).","commonSituations":"signal-cli running without an account registered, api mode not enabled (signal-cli -o json rest), or the URL pointing at a different service.","solutions":["Verify signal-cli REST API: curl http://host:8080/api/v1/check","Ensure signal-cli was started with 'signal-cli --config ... rest' and an account is registered","Check signal_endpoint config points to the correct host:port"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"import httpx\nasync with httpx.AsyncClient() as c:\n    r = await c.get(f\"{endpoint}/api/v1/check\")\n    assert r.status_code == 200, f'signal-cli check: {r.status_code}'","typeGuard":null,"tryCatchPattern":"try:\n    await signal_channel.start()\nexcept ConnectionRefusedError as e:\n    # includes both 201 and 202 messages\n    log_and_alert(e); await asyncio.sleep(backoff); retry","preventionTips":["Add a readiness probe for signal-cli before app start","Run signal-cli under a supervisor (systemd/docker restart)"],"tags":["signal","network","startup"],"backgroundTag":"service-health-check-failed","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}