tinyhumansai/openhuman · error

join error: {e}

Error message

join error: {e}

What it means

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.

Source

Thrown at src/openhuman/channels/providers/telegram/remote_control.rs:264

    let workspace_dir = ctx.workspace_dir.clone();
    let reply_target_owned = msg.reply_target.clone();
    let thread_id_owned = thread_id.clone();
    let sender_key_owned = sender_key.clone();
    let title_owned = title.clone();
    // Write-back path — use with_store (saves) wrapped in spawn_blocking.
    let bind_result = tokio::task::spawn_blocking(move || {
        with_store(&workspace_dir, |store| {
            store.set_binding(
                &reply_target_owned,
                thread_id_owned,
                sender_key_owned,
                Some(title_owned),
            );
            Ok(())
        })
    })
    .await
    .unwrap_or_else(|e| Err(anyhow::anyhow!("join error: {e}")));

    if let Err(error) = bind_result {
        tracing::warn!("{LOG_PREFIX} new: persist binding failed: {error}");
        return format!(
            "Created thread `{thread_id}` but failed to persist Telegram binding: {error}"
        );
    }

    crate::openhuman::web_chat::invalidate_thread_sessions(&thread_id).await;

    tracing::info!(
        "{LOG_PREFIX} new session thread_id={thread_id} reply_target={} sender_key={sender_key}",
        msg.reply_target
    );

    format!(
        "Started new session **{title}**.\n\
         Thread id: `{thread_id}`\n\

View on GitHub (pinned to 7491200858)

Solutions

  1. Check logs for the panic inside the blocking closure (store lock, serialize)
  2. Retry the binding write; a one-off panic is usually transient
  3. Investigate store corruption if the panic reproduces
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at src/openhuman/channels/providers/telegram/remote_control.rs:264 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of tinyhumansai/openhuman@7491200858 (2026-08-17). Data as JSON: /api/errors/a361e3995396c678. Report an issue: GitHub.