{"record":{"id":"595b3cb627f7a4e6","repo":"nautechsystems/nautilus_trader","slug":"failed-to-register-polymarket-message-handler-e","errorCode":null,"errorMessage":"failed to register Polymarket message handler: {e}","messagePattern":"failed to register Polymarket message handler: (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/polymarket/src/data/lifecycle.rs","lineNumber":154,"sourceCode":"                            Some(msg) => handle_ws_message(msg, &ctx),\n                            None => {\n                                log::debug!(\"WebSocket message channel closed\");\n                                break;\n                            }\n                        }\n                    }\n                    () = cancellation.cancelled() => {\n                        log::debug!(\"Polymarket message handler cancelled\");\n                        break;\n                    }\n                }\n            }\n\n            log::debug!(\"Polymarket message handler ended\");\n        };\n        self.tasks\n            .spawn(future)\n            .map_err(|e| anyhow::anyhow!(\"failed to register Polymarket message handler: {e}\"))?;\n        Ok(())\n    }\n\n    pub(super) fn register_resolve_poll_task(&self) -> anyhow::Result<()> {\n        let cancellation = self.cancellation_token.clone();\n        let gamma_client = self.provider.http_client().clone();\n        let clob_public_client = self.clob_public_client.clone();\n        let clock = self.clock;\n        let resolve_poll_enabled = self.config.resolve_poll_enabled;\n        let subscribe_new_markets = self.config.subscribe_new_markets;\n        let interval_secs = self.config.resolve_poll_interval_secs.max(1);\n        let grace_secs = self.config.resolve_poll_grace_secs;\n        let max_wait_secs = self.config.resolve_poll_max_wait_secs.max(grace_secs);\n        let instruments = self.instruments.clone();\n        let token_meta = self.token_meta.clone();\n        let order_books = self.order_books.clone();\n        let last_quotes = self.last_quotes.clone();\n        let active_quote_subs = self.active_quote_subs.clone();","sourceCodeStart":136,"sourceCodeEnd":172,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/polymarket/src/data/lifecycle.rs#L136-L172","documentation":"Thrown when tasks.spawn(future) fails after the WS message-handler loop closure was built, meaning the task group refused to register the background task that processes incoming WebSocket messages. Without this handler, no market data would flow, so connect() fails fast.","triggerScenarios":"tasks.spawn() returns Err during register_message_handler — typically because the task group is closed (shutdown started) or the runtime is terminating between obtaining the spawner and spawning the task.","commonSituations":"Disconnect racing connect; runtime dropped mid-connect; task group admission window closed by an earlier failed registration in the same connect sequence.","solutions":["Avoid concurrent disconnect during connect; await lifecycle calls sequentially","Retry connect(); a new task generation is started when the group is not open","Confirm the tokio runtime outlives the client connect call"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"match client.connect().await {\n    Err(e) if e.to_string().contains(\"failed to register Polymarket message handler\") => {\n        // generation was closed; rebuild or retry\n        client = build_client(cfg)?;\n        client.connect().await?;\n    }\n    r => r?,\n}","preventionTips":["One owner task should drive connect/disconnect (single lifecycle actor)","Do not drop the runtime while connect() futures are in flight","Treat any 'failed to register ...' error as a generation failure and retry from a clean state"],"tags":["rust","tokio","task-spawn","websocket"],"backgroundTag":"invalid-state-transition","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}