tinyhumansai/openhuman · error

Hermes workspace not found at {}. Provide a valid source wor

Error message

Hermes workspace not found at {}. Provide a valid source workspace.

What it means

`migrate_hermes_memory` resolves the Hermes source workspace — explicit argument, else `~/.hermes` (`%LOCALAPPDATA%\hermes` on Windows) — and refuses to run when the path does not exist. Like the OpenClaw guard, it will not fabricate an empty migration from a missing source; the message echoes the resolved path.

Source

Thrown at src/openhuman/config/migration_helpers/core.rs:319

            "hermes_user_profile",
            MemoryCategory::Custom("user_profile".to_string()),
        ),
        (
            "SOUL.md",
            "hermes_persona",
            MemoryCategory::Custom("persona".to_string()),
        ),
    ]
}

pub async fn migrate_hermes_memory(
    config: &Config,
    source_workspace: Option<PathBuf>,
    dry_run: bool,
) -> Result<MigrationReport> {
    let source_workspace = resolve_hermes_workspace(source_workspace)?;
    if !source_workspace.exists() {
        bail!(
            "Hermes workspace not found at {}. Provide a valid source workspace.",
            source_workspace.display()
        );
    }

    if paths_equal(&source_workspace, &config.workspace_dir) {
        bail!("Source workspace matches current OpenHuman workspace; refusing self-migration");
    }

    let mut stats = MigrationStats::default();
    let mut warnings = Vec::new();
    let mut entries = Vec::new();

    for (filename, key, category) in hermes_file_mappings() {
        let path = source_workspace.join(filename);
        if !path.exists() {
            warnings.push(format!(
                "{filename} not found in {}",

View on GitHub (pinned to 7491200858)

Solutions

  1. Pass the correct Hermes data directory explicitly to the migration call.
  2. Restore or mount the Hermes data at the default location and retry.
  3. Skip the migration when Hermes was never installed on this machine.

Example fix

// before
let report = migrate_hermes_memory(&config, None, false).await?;

// after — explicit, verified source
let src = PathBuf::from("/data/hermes");
if !src.is_dir() { anyhow::bail!("no Hermes data at {}", src.display()); }
let report = migrate_hermes_memory(&config, Some(src), false).await?;
Defensive patterns

Strategy: validation

Validate before calling

let src = source_path.unwrap_or_else(|| hermes_default_path()); // ~/.hermes or %LOCALAPPDATA%/hermes
if !src.is_dir() {
    // Hermes not present on this machine — skip the migration instead of calling it
    return Ok(None);
}
let report = migrate_hermes_memory(&config, Some(src), dry_run).await?;

Prevention

When it happens

Trigger: Running the Hermes migration on a machine where Hermes is not installed at the default location, or with an explicit path that is wrong, on an unmounted volume, or owned by a different user.

Common situations: Migration offered or run on machines that never had Hermes installed; wrong user account (home differs); data on an unmounted or container-uncmounted volume.

Related errors


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