{"record":{"id":"3092aca8a60710f0","repo":"tinyhumansai/openhuman","slug":"missing-key-parameter-3092ac","errorCode":null,"errorMessage":"Missing 'key' parameter","messagePattern":"Missing 'key' parameter","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/openhuman/memory/tools/store.rs","lineNumber":75,"sourceCode":"                },\n                \"category\": {\n                    \"type\": \"string\",\n                    \"description\": \"Memory category: 'core' (permanent), 'daily' (session), 'conversation' (chat), or a custom category name. Defaults to 'core'.\"\n                }\n            },\n            \"required\": [\"namespace\", \"key\", \"content\"]\n        })\n    }\n\n    async fn execute(&self, args: serde_json::Value) -> anyhow::Result<ToolResult> {\n        let namespace = args\n            .get(\"namespace\")\n            .and_then(|v| v.as_str())\n            .ok_or_else(|| anyhow::anyhow!(\"Missing 'namespace' parameter\"))?;\n        let key = args\n            .get(\"key\")\n            .and_then(|v| v.as_str())\n            .ok_or_else(|| anyhow::anyhow!(\"Missing 'key' parameter\"))?;\n\n        let content = args\n            .get(\"content\")\n            .and_then(|v| v.as_str())\n            .ok_or_else(|| anyhow::anyhow!(\"Missing 'content' parameter\"))?;\n\n        let category = match args.get(\"category\").and_then(|v| v.as_str()) {\n            Some(\"core\") | None => MemoryCategory::Core,\n            Some(\"daily\") => MemoryCategory::Daily,\n            Some(\"conversation\") => MemoryCategory::Conversation,\n            // Route custom categories through `FromStr` so a `custom:<name>`\n            // wire value — the form `memory_recall`/`Display` now emit — resolves\n            // back to `Custom(\"<name>\")` instead of `Custom(\"custom:<name>\")`\n            // (which would `Display` as `custom:custom:<name>` and stop matching\n            // the original category on recall/filter). Legacy bare names still\n            // parse to the same `Custom(name)`; an unparseable value falls back\n            // to the raw string. (review: prefixed-custom round-trip)\n            Some(other) => other","sourceCodeStart":57,"sourceCodeEnd":93,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/memory/tools/store.rs#L57-L93","documentation":"The memory store tool found `namespace` but no usable `key` string in the arguments. `key` is the second required argument and its absence is caught by the same sequential get/as_str guard, so the write cannot be addressed to a memory slot — the tool errors before reading `content` or running secret-safety checks.","triggerScenarios":"Thrown at src/openhuman/memory/tools/store.rs:75 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Provide `key` as a non-empty JSON string identifying the memory slot","Send namespace, key, and content together per the required list"],"exampleFix":null,"handlingStrategy":"validation","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-14T00:17:10.932Z"}