tinyhumansai/openhuman · error

memory driver `{driver_id}` is not the embedded TinyCortex d

Error message

memory driver `{driver_id}` is not the embedded TinyCortex driver, so `{invocation}` is unavailable: it operates on the local embedded store directly, and this configuration bound a different driver. Run `openhuman subsystems` to see the bound driver, or change `[subsystems.memory] driver` in your config.

What it means

The legacy-client gate rejected an invocation that operates directly on the local embedded memory store: it is only valid when the bound driver's class is Embedded (TinyCortex), and the current [subsystems.memory] binding resolved to a different class. Like the capability gate, it defaults OPEN — an unresolvable binding never reaches this rejection; it fires only after a real non-embedded driver answered. This guards legacy commands that assume the embedded store exists locally from silently acting on a machine whose memory is served elsewhere.

Source

Thrown at src/core/cli_capability.rs:214

    capability_verdict(&driver_id, advertised, Some(required), invocation)
}

/// The pure verdict for the legacy-client gate: does the bound driver class
/// permit commands that operate on the embedded store directly?
///
/// Mirrors [`capability_verdict`]'s default-OPEN posture — `None` from the
/// caller means "no legacy gate applies", and an unresolvable binding has
/// already been defaulted-OPEN upstream by the caller skipping this entirely.
pub fn legacy_client_verdict(driver_id: &str, class: DriverClass, invocation: &str) -> Result<()> {
    if class == DriverClass::Embedded {
        return Ok(());
    }
    log::warn!(
        "[cli][legacy-client-gate] rejected invocation='{invocation}' driver='{driver_id}' \
         class={} — not the embedded engine",
        class.as_str()
    );
    anyhow::bail!(legacy_client_unavailable_message(driver_id, invocation))
}

#[cfg(test)]
#[path = "cli_capability_tests.rs"]
mod tests;

View on GitHub (pinned to a221052e0d)

Solutions

  1. Run `openhuman subsystems` to confirm the bound driver and its class
  2. Change [subsystems.memory] driver back to the embedded TinyCortex driver for embedded-only commands
  3. Or replace the legacy command with the driver-appropriate equivalent for the bound driver

Example fix

# before
# config.toml: [subsystems.memory] driver = "remote"
openhuman memory <legacy-embedded-command>
# after
# config.toml: [subsystems.memory] driver = "embedded"
openhuman memory <legacy-embedded-command>
Defensive patterns

Strategy: validation

Validate before calling

# bash: confirm the embedded driver is bound before legacy embedded-store commands
openhuman subsystems 2>/dev/null | grep -q embedded \
  || { echo "legacy command needs the embedded memory driver — change [subsystems.memory] driver" >&2; exit 2; }
openhuman memory "$@"

Try / catch

if ! out=$(openhuman memory "$fn" 2>&1); then
  case "$out" in
    *"not the embedded TinyCortex driver"*) echo "'$fn' requires the embedded driver; current binding is non-embedded" >&2 ;;
    *) printf '%s\n' "$out" >&2 ;;
  esac
  exit 1
fi

Prevention

When it happens

Trigger: [subsystems.memory] driver set to a remote/non-embedded driver, then running a legacy embedded-store CLI command (one whose only implementation touches the local store directly).

Common situations: Old scripts kept running after the memory driver was reconfigured; a shared config rolled out to machines whose workflows still include embedded-only maintenance commands; evaluating a remote driver while testing with legacy tooling.

Related errors


AI-assisted analysis of tinyhumansai/openhuman@a221052e0d (2026-08-16). Data as JSON: /api/errors/228af153f7d8c79f. Report an issue: GitHub.