tinyhumansai/openhuman · error

join: {e}

Error message

join: {e}

What it means

The spawn_blocking task that opens the diff Ledger over workspace_dir and iterates sources returned an Err (ledger open failure or per-source read failure). The join result is unwrapped and prefixed with join:.

Source

Thrown at src/openhuman/memory/tools/diff.rs:150

        let workspace_dir = config.workspace_dir.clone();
        let source_ids: Vec<(String, String, String)> = sources
            .iter()
            .filter(|s| s.enabled)
            .map(|s| (s.id.clone(), s.label.clone(), s.kind.as_str().to_string()))
            .collect();

        let counts: Vec<(String, String, String, usize)> =
            tokio::task::spawn_blocking(move || -> anyhow::Result<_> {
                let ledger = tinycortex::memory::diff::Ledger::open(&workspace_dir)?;
                let mut out = Vec::new();
                for (sid, label, kind) in &source_ids {
                    let count = ledger.snapshot_count_for_source(sid)?;
                    out.push((sid.clone(), label.clone(), kind.clone(), count));
                }
                Ok(out)
            })
            .await
            .map_err(|e| anyhow::anyhow!("join: {e}"))?
            .map_err(|e: anyhow::Error| anyhow::anyhow!("{e:#}"))?;

        let mut md = String::from("## Memory Sources (snapshot status)\n\n");
        if counts.is_empty() {
            md.push_str("No enabled memory sources configured.\n");
        } else {
            for (sid, label, kind, count) in &counts {
                md.push_str(&format!(
                    "- **{label}** ({kind}) — {count} snapshot(s) | source_id: `{sid}`\n"
                ));
            }
            md.push_str(
                "\nCall with `source_id` to see what changed since the last sync, \
                 or `checkpoint_id` for cross-source diffs.\n",
            );
        }

        Ok(ToolResult::success(md))

View on GitHub (pinned to 7491200858)

Solutions

  1. Check the workspace memory diff ledger files are readable and not locked
  2. Retry — the blocking task can fail under concurrent writes
  3. Inspect the chained error for the offending source
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at src/openhuman/memory/tools/diff.rs:150 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/eb6c7d01fca1c357. Report an issue: GitHub.