{"record":{"id":"9ca6fc88ca549b3e","repo":"tinyhumansai/openhuman","slug":"missing-content-parameter","errorCode":null,"errorMessage":"Missing 'content' parameter","messagePattern":"Missing 'content' parameter","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/openhuman/memory/tools/store.rs","lineNumber":80,"sourceCode":"            },\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\n                .parse()\n                .unwrap_or_else(|_| MemoryCategory::Custom(other.to_string())),\n        };\n\n        if let Err(error) = self","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/memory/tools/store.rs#L62-L98","documentation":"The memory store tool parsed `namespace` and `key` but the third required argument `content` is missing or not a string. Since content is the payload being remembered, the guard fires before the secret-likelihood check and the store write — nothing is persisted and no partial write occurs.","triggerScenarios":"Thrown at src/openhuman/memory/tools/store.rs:80 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Include `content` as a JSON string with the information to remember","Ensure content does not look like a secret, or the store will separately refuse it"],"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"}