{"record":{"id":"7e6ceccdc247fc94","repo":"tinyhumansai/openhuman","slug":"memory-driver-driver-id-does-not-advertise-the","errorCode":null,"errorMessage":"memory driver `{driver_id}` does not advertise the `{cap}` capability, so `{invocation}` is unavailable in this configuration. Run `openhuman subsystems` to see the bound driver and the families it advertises, or change `[subsystems.memory] driver` in your config.","messagePattern":"memory driver `(.+?)` does not advertise the `(.+?)` capability, so `(.+?)` is unavailable in this configuration\\. Run `openhuman subsystems` to see the bound driver and the families it advertises, or change `\\[subsystems\\.memory\\] driver` in your config\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/core/cli_capability.rs","lineNumber":111,"sourceCode":"/// with the RPC registry about what is gated.\npub fn capability_verdict(\n    driver_id: &str,\n    advertised: Capabilities,\n    required: Option<Capability>,\n    invocation: &str,\n) -> Result<()> {\n    let Some(capability) = required else {\n        return Ok(());\n    };\n    if advertised.contains(capability) {\n        return Ok(());\n    }\n    log::warn!(\n        \"[cli][capability-gate] rejected invocation='{invocation}' driver='{driver_id}' \\\n         capability={} — not advertised by the bound driver\",\n        capability.as_str()\n    );\n    anyhow::bail!(capability_unavailable_message(\n        driver_id, capability, invocation\n    ))\n}\n\n/// The driver bound for this machine's configured workspace:\n/// `(id, class, advertised)`.\n///\n/// `None` means \"could not resolve\" — a missing or unreadable config, or a\n/// workspace that will not bind. **The caller then skips the gate entirely**,\n/// matching [`crate::core::all::capability_allowed`]'s default-OPEN posture:\n/// denying is only ever correct after a driver has actually answered\n/// `capabilities()`. A CLI that refused commands because it could not read\n/// config would be strictly worse than one that lets the command run and fail\n/// on its own terms.\npub async fn bound_memory_driver() -> Option<(String, DriverClass, Capabilities)> {\n    let config = match crate::openhuman::config::Config::load_or_init().await {\n        Ok(config) => config,\n        Err(err) => {","sourceCodeStart":93,"sourceCodeEnd":129,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/core/cli_capability.rs#L93-L129","documentation":"The CLI capability gate rejected an invocation because the memory driver bound for this workspace does not advertise the required capability. Denial is only possible because driver resolution succeeded - the gate is deliberately default-OPEN and skips entirely when the binding cannot be resolved. The message names the bound driver id and the missing capability, and points at `openhuman subsystems` for diagnosis and `[subsystems.memory] driver` for reconfiguration.","triggerScenarios":"Config binds a module-backed or otherwise non-embedded memory driver, then a CLI invocation runs that requires a capability only the embedded TinyCortex driver advertises (e.g. diff/tree families); or the backing module failed to load so the bound driver advertises fewer families than expected.","commonSituations":"Switching memory backends for a workspace; kernel or slim builds where the module providing a capability is absent; drift between the configured driver and the installed module set.","solutions":["Run `openhuman subsystems` to see the bound driver id, class, and the capability families it advertises.","Either change `[subsystems.memory] driver` to a driver that advertises the required capability, or use a different invocation.","If a module should have provided the capability, check module load status and the compiled-in registry.","Note that this denial proves resolution succeeded - an unreadable config would have skipped the gate (default-OPEN), so do not suspect config readability here."],"exampleFix":"# before\n[subsystems]\nmemory.driver = \"module\"\n# then: openhuman memory-diff ... -> capability error\n\n# after\n[subsystems]\nmemory.driver = \"embedded\"   # advertises diff/tree/recall","handlingStrategy":"validation","validationCode":"let (driver_id, _class, advertised) = resolve_bound_driver() // same source cli_capability uses\n    .expect(\"gate skipped when unresolvable\");\nif !advertised.contains(&required_capability) {\n    // pick a driver that advertises it, or a different invocation - do not call","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Check `openhuman subsystems` output after any driver switch and before scripted invocations.","Encode required capabilities per CLI command so scripts can pre-flight the bound driver.","Remember the gate is default-OPEN on unresolvable bindings - a silent skip means config problems, not a pass."],"tags":["capability-gate","memory","driver","config","cli"],"backgroundTag":"driver-capability-missing","analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}