{"record":{"id":"a361e3995396c678","repo":"tinyhumansai/openhuman","slug":"join-error-e","errorCode":null,"errorMessage":"join error: {e}","messagePattern":"join error: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/openhuman/channels/providers/telegram/remote_control.rs","lineNumber":264,"sourceCode":"    let workspace_dir = ctx.workspace_dir.clone();\n    let reply_target_owned = msg.reply_target.clone();\n    let thread_id_owned = thread_id.clone();\n    let sender_key_owned = sender_key.clone();\n    let title_owned = title.clone();\n    // Write-back path — use with_store (saves) wrapped in spawn_blocking.\n    let bind_result = tokio::task::spawn_blocking(move || {\n        with_store(&workspace_dir, |store| {\n            store.set_binding(\n                &reply_target_owned,\n                thread_id_owned,\n                sender_key_owned,\n                Some(title_owned),\n            );\n            Ok(())\n        })\n    })\n    .await\n    .unwrap_or_else(|e| Err(anyhow::anyhow!(\"join error: {e}\")));\n\n    if let Err(error) = bind_result {\n        tracing::warn!(\"{LOG_PREFIX} new: persist binding failed: {error}\");\n        return format!(\n            \"Created thread `{thread_id}` but failed to persist Telegram binding: {error}\"\n        );\n    }\n\n    crate::openhuman::web_chat::invalidate_thread_sessions(&thread_id).await;\n\n    tracing::info!(\n        \"{LOG_PREFIX} new session thread_id={thread_id} reply_target={} sender_key={sender_key}\",\n        msg.reply_target\n    );\n\n    format!(\n        \"Started new session **{title}**.\\n\\\n         Thread id: `{thread_id}`\\n\\","sourceCodeStart":246,"sourceCodeEnd":282,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/channels/providers/telegram/remote_control.rs#L246-L282","documentation":"A spawn_blocking task that persists a Telegram remote-control thread binding (set_binding on the channel store) failed at join: the blocking task panicked or was cancelled, so the binding write never completed or its result is unknowable. Distinct from a store error, which would surface through the Result inside the closure.","triggerScenarios":"Thrown at src/openhuman/channels/providers/telegram/remote_control.rs:264 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Check logs for the panic inside the blocking closure (store lock, serialize)","Retry the binding write; a one-off panic is usually transient","Investigate store corruption if the panic reproduces"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}