{"record":{"id":"09492fffd7815583","repo":"tinyhumansai/openhuman","slug":"missing-message-parameter-09492f","errorCode":null,"errorMessage":"Missing 'message' parameter","messagePattern":"Missing 'message' parameter","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/openhuman/tools/impl/system/pushover.rs","lineNumber":146,"sourceCode":"    // generating ghost approvals.\n\n    async fn execute(&self, args: serde_json::Value) -> anyhow::Result<ToolResult> {\n        if !self.security.can_act() {\n            return Ok(ToolResult::error(\n                \"[policy-blocked] Action blocked: autonomy is read-only\",\n            ));\n        }\n\n        if !self.security.record_action() {\n            return Ok(ToolResult::error(\"Action blocked: rate limit exceeded\"));\n        }\n\n        let message = args\n            .get(\"message\")\n            .and_then(|v| v.as_str())\n            .map(str::trim)\n            .filter(|v| !v.is_empty())\n            .ok_or_else(|| anyhow::anyhow!(\"Missing 'message' parameter\"))?\n            .to_string();\n\n        let title = args.get(\"title\").and_then(|v| v.as_str()).map(String::from);\n\n        let priority = match args.get(\"priority\").and_then(|v| v.as_i64()) {\n            Some(value) if (-2..=2).contains(&value) => Some(value),\n            Some(value) => {\n                return Ok(ToolResult::error(format!(\n                    \"Invalid 'priority': {value}. Expected integer in range -2..=2\"\n                )))\n            }\n            None => None,\n        };\n\n        let sound = args.get(\"sound\").and_then(|v| v.as_str()).map(String::from);\n\n        let (token, user_key) = self.get_credentials().await?;\n","sourceCodeStart":128,"sourceCodeEnd":164,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/tools/impl/system/pushover.rs#L128-L164","documentation":"pushover's execute validates 'message' after the read-only and rate-limit gates pass; the value must be a string that trims to non-empty. This fires on missing, non-string, or whitespace-only message, before credentials are loaded.","triggerScenarios":"Thrown at src/openhuman/tools/impl/system/pushover.rs:146 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Include a non-empty \"message\" string in the notification arguments"],"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-14T05:17:10.506Z"}