{"record":{"id":"cab4de7820a961ec","repo":"tinyhumansai/openhuman","slug":"memory-tools-put-no-tool-memory","errorCode":null,"errorMessage":"memory_tools_put: {NO_TOOL_MEMORY}","messagePattern":"memory_tools_put: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/openhuman/memory/tools/tool_memory/put.rs","lineNumber":110,"sourceCode":"            }\n        })\n    }\n\n    async fn execute(&self, args: serde_json::Value) -> anyhow::Result<ToolResult> {\n        let parsed: Args = serde_json::from_value(args)\n            .map_err(|e| anyhow::anyhow!(\"invalid arguments for memory_tools_put: {e}\"))?;\n        log::debug!(\n            \"[tool][memory_tools] put tool_name={} priority={:?} tags={}\",\n            parsed.tool_name,\n            parsed.priority,\n            parsed.tags.len()\n        );\n        let guard = active_memory_guard()\n            .await\n            .map_err(|e| anyhow::anyhow!(\"memory_tools_put: {e}\"))?;\n        let family = guard\n            .as_tool_memory()\n            .ok_or_else(|| anyhow::anyhow!(\"memory_tools_put: {NO_TOOL_MEMORY}\"))?;\n        let mut rule = ToolMemoryRule::new(\n            &parsed.tool_name,\n            &parsed.rule,\n            parse_priority(parsed.priority.as_deref()),\n            ToolMemorySource::UserExplicit,\n        );\n        rule.tags = parsed.tags;\n        let rule_id = rule.id.clone();\n        let tool_name = rule.tool_name.clone();\n        family\n            .put_tool_rule(rule)\n            .await\n            .map_err(|e| anyhow::anyhow!(\"memory_tools_put: {e}\"))?;\n        // `put_tool_rule` answers with unit; the tool's contract is the stored\n        // rule (normalised tool_name, preserved created_at, refreshed\n        // updated_at), so read it back by the id generated above.\n        let stored = family\n            .tool_rules(&tool_name)","sourceCodeStart":92,"sourceCodeEnd":128,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/memory/tools/tool_memory/put.rs#L92-L128","documentation":"The memory guard was acquired but the tool-memory capability family is absent (`NO_TOOL_MEMORY` sentinel). The pinned-rule store is only served by drivers implementing that family; with a null/fallback driver bound (no memory module), putting a tool rule is structurally unavailable and this guard reports it.","triggerScenarios":"Thrown at src/openhuman/memory/tools/tool_memory/put.rs:110 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Confirm the memory module is loaded with tool-memory support","Check the bound driver via memory status","Disable tool-rule pinning features in module-less configurations"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}