{"record":{"id":"825abf6536b263fa","repo":"nautechsystems/nautilus_trader","slug":"failed-to-register-polymarket-resolve-poll-e","errorCode":null,"errorMessage":"failed to register Polymarket resolve poll: {e}","messagePattern":"failed to register Polymarket resolve poll: (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/polymarket/src/data/lifecycle.rs","lineNumber":412,"sourceCode":"                            continue;\n                        }\n\n                        let _ = fetch_and_apply_resolutions_by_condition_ids(\n                            &gamma_client,\n                            &clob_public_client,\n                            &resolve_ctx,\n                            &selection.condition_ids,\n                            ResolveBatchErrorMode::Continue,\n                            false,\n                        )\n                        .await;\n                    }\n                }\n            }\n        };\n        self.tasks\n            .spawn(future)\n            .map_err(|e| anyhow::anyhow!(\"failed to register Polymarket resolve poll: {e}\"))?;\n        Ok(())\n    }\n\n    pub(super) async fn await_tasks_with_timeout(\n        &self,\n        timeout: tokio::time::Duration,\n    ) -> anyhow::Result<()> {\n        self.tasks.begin_shutdown();\n        let graceful_timeout = (timeout / 2).min(TASK_GRACEFUL_SHUTDOWN_TIMEOUT);\n        let abort_timeout = timeout.saturating_sub(graceful_timeout);\n        self.tasks\n            .finish_shutdown(graceful_timeout, abort_timeout)\n            .await\n            .map_err(|e| anyhow::anyhow!(\"Failed to terminate Polymarket data tasks: {e}\"))?;\n        Ok(())\n    }\n\n    pub(super) fn start_client(&mut self) {","sourceCodeStart":394,"sourceCodeEnd":430,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/polymarket/src/data/lifecycle.rs#L394-L430","documentation":"Thrown when tasks.spawn(future) fails while registering the resolve-poll background task in register_resolve_poll_task. The task group refused admission (closed/shutting down), so connect() aborts rather than run a data client missing resolution polling.","triggerScenarios":"tasks.spawn() returns Err during connect_client's registration phase — task group closed by concurrent shutdown or runtime teardown between spawner acquisition and spawn.","commonSituations":"Disconnect racing connect; process shutting down mid-connect; earlier registration failure closed the generation window.","solutions":["Serialize lifecycle calls; wait for disconnect to fully finish before reconnecting","Retry connect() so start_generation() reopens the task group","Verify the runtime is not being dropped during connect"],"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 resolve poll\") => {\n        // retry on a fresh generation\n        client.connect().await.context(\"resolve poll registration failed twice\")?;\n    }\n    r => r?,\n}","preventionTips":["Keep lifecycle calls serialized per client","Ensure the runtime is not shutting down during connect","If repeated, rebuild the client rather than reusing a wedged task group"],"tags":["rust","tokio","task-spawn","polymarket"],"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-14T00:17:10.932Z"}