{"record":{"id":"21d35d247cce3afe","repo":"tinyhumansai/openhuman","slug":"openclaw-workspace-not-found-at-provide-a-vali","errorCode":null,"errorMessage":"OpenClaw workspace not found at {}. Provide a valid source workspace.","messagePattern":"OpenClaw workspace not found at (.+?)\\. Provide a valid source workspace\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/openhuman/config/migration_helpers/core.rs","lineNumber":44,"sourceCode":"}\n\n#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct MigrationReport {\n    pub source_workspace: PathBuf,\n    pub target_workspace: PathBuf,\n    pub dry_run: bool,\n    pub stats: MigrationStats,\n    pub warnings: Vec<String>,\n}\n\npub async fn migrate_openclaw_memory(\n    config: &Config,\n    source_workspace: Option<PathBuf>,\n    dry_run: bool,\n) -> Result<MigrationReport> {\n    let source_workspace = resolve_openclaw_workspace(source_workspace)?;\n    if !source_workspace.exists() {\n        bail!(\n            \"OpenClaw workspace not found at {}. Provide a valid source workspace.\",\n            source_workspace.display()\n        );\n    }\n\n    if paths_equal(&source_workspace, &config.workspace_dir) {\n        bail!(\"Source workspace matches current OpenHuman workspace; refusing self-migration\");\n    }\n\n    let mut stats = MigrationStats::default();\n    let entries = collect_source_entries(&source_workspace, &mut stats)?;\n    let mut warnings = Vec::new();\n\n    if entries.is_empty() {\n        warnings.push(format!(\n            \"No importable memory found in {}\",\n            source_workspace.display()\n        ));","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/config/migration_helpers/core.rs#L26-L62","documentation":"`migrate_openclaw_memory` resolves the source workspace — the explicit `source_workspace` argument, else the default `~/.openclaw/workspace` — and refuses to run when that path does not exist. The importer will not fabricate an empty migration report from a missing source; the message echoes the resolved path so you can see which location was checked.","triggerScenarios":"Invoking the OpenClaw memory migration with no explicit source path on a machine where `~/.openclaw/workspace` does not exist, or with an explicit path that is wrong (typo, different user's home, unmounted volume).","commonSituations":"Running the migration on a machine where OpenClaw was never installed; running as a different user than the one owning the data; containerized cores where the OpenClaw dir is not mounted; typo'd custom source path.","solutions":["Pass the real source workspace path explicitly to the migration call.","Restore or mount the OpenClaw data at `~/.openclaw/workspace` (the default resolution) and retry.","Check the path exists before invoking; if OpenClaw was never installed, skip this migration entirely."],"exampleFix":"// before\nlet report = migrate_openclaw_memory(&config, None, false).await?;\n\n// after — explicit, verified source\nlet src = PathBuf::from(\"/data/openclaw-backup/workspace\");\nif !src.is_dir() { anyhow::bail!(\"no OpenClaw data at {}\", src.display()); }\nlet report = migrate_openclaw_memory(&config, Some(src), false).await?;","handlingStrategy":"validation","validationCode":"let src = source_path.unwrap_or_else(|| home.join(\".openclaw\").join(\"workspace\"));\nif !src.is_dir() {\n    // OpenClaw not present on this machine — skip the migration instead of calling it\n    return Ok(None);\n}\nlet report = migrate_openclaw_memory(&config, Some(src), dry_run).await?;","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Check the source path exists (and is a directory) before invoking the migration","Pass explicit source paths in automation instead of relying on the ~/.openclaw default","Skip the migration entirely when the source app was never installed"],"tags":["migration","openclaw","workspace","path-not-found"],"backgroundTag":"path-not-found","analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}