{"record":{"id":"228af153f7d8c79f","repo":"tinyhumansai/openhuman","slug":"memory-driver-driver-id-is-not-the-embedded-ti","errorCode":null,"errorMessage":"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.","messagePattern":"memory driver `(.+?)` is not the embedded TinyCortex driver, so `(.+?)` 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\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/core/cli_capability.rs","lineNumber":214,"sourceCode":"    capability_verdict(&driver_id, advertised, Some(required), invocation)\n}\n\n/// The pure verdict for the legacy-client gate: does the bound driver class\n/// permit commands that operate on the embedded store directly?\n///\n/// Mirrors [`capability_verdict`]'s default-OPEN posture — `None` from the\n/// caller means \"no legacy gate applies\", and an unresolvable binding has\n/// already been defaulted-OPEN upstream by the caller skipping this entirely.\npub fn legacy_client_verdict(driver_id: &str, class: DriverClass, invocation: &str) -> Result<()> {\n    if class == DriverClass::Embedded {\n        return Ok(());\n    }\n    log::warn!(\n        \"[cli][legacy-client-gate] rejected invocation='{invocation}' driver='{driver_id}' \\\n         class={} — not the embedded engine\",\n        class.as_str()\n    );\n    anyhow::bail!(legacy_client_unavailable_message(driver_id, invocation))\n}\n\n#[cfg(test)]\n#[path = \"cli_capability_tests.rs\"]\nmod tests;\n","sourceCodeStart":196,"sourceCodeEnd":220,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/a221052e0df5b1f7598fceba7329fd1af95d6699/src/core/cli_capability.rs#L196-L220","documentation":"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.","triggerScenarios":"[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).","commonSituations":"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.","solutions":["Run `openhuman subsystems` to confirm the bound driver and its class","Change [subsystems.memory] driver back to the embedded TinyCortex driver for embedded-only commands","Or replace the legacy command with the driver-appropriate equivalent for the bound driver"],"exampleFix":"# before\n# config.toml: [subsystems.memory] driver = \"remote\"\nopenhuman memory <legacy-embedded-command>\n# after\n# config.toml: [subsystems.memory] driver = \"embedded\"\nopenhuman memory <legacy-embedded-command>","handlingStrategy":"validation","validationCode":"# bash: confirm the embedded driver is bound before legacy embedded-store commands\nopenhuman subsystems 2>/dev/null | grep -q embedded \\\n  || { echo \"legacy command needs the embedded memory driver — change [subsystems.memory] driver\" >&2; exit 2; }\nopenhuman memory \"$@\"","typeGuard":null,"tryCatchPattern":"if ! out=$(openhuman memory \"$fn\" 2>&1); then\n  case \"$out\" in\n    *\"not the embedded TinyCortex driver\"*) echo \"'$fn' requires the embedded driver; current binding is non-embedded\" >&2 ;;\n    *) printf '%s\\n' \"$out\" >&2 ;;\n  esac\n  exit 1\nfi","preventionTips":["Treat legacy embedded-store commands as embedded-driver-only and gate them in wrappers on the subsystems output","When migrating [subsystems.memory] driver, inventory existing scripts for embedded-only commands first","The rejection only fires when a non-embedded driver actually resolved — an unreadable config skips the gate (default-OPEN), so verify bindings explicitly"],"tags":["configuration","capability-gate","memory","cli"],"backgroundTag":null,"analyzedSha":"a221052e0df5b1f7598fceba7329fd1af95d6699","analyzedAt":"2026-08-16T12:47:06.542Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}