{"record":{"id":"f2ebf004d210cc3e","repo":"tinyhumansai/openhuman","slug":"missing-action-parameter","errorCode":null,"errorMessage":"Missing 'action' parameter","messagePattern":"Missing 'action' parameter","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/openhuman/integrations/composio/tools/direct.rs","lineNumber":796,"sourceCode":"    fn external_effect_with_args(&self, args: &serde_json::Value) -> bool {\n        // `action=\"list\"` enumerates available Composio actions —\n        // a read-only catalog call. `action=\"connect\"` only returns\n        // an OAuth URL the user then visits manually; the\n        // subsequent OAuth handoff is its own consent flow so the\n        // tool call itself has no outbound side effect to gate.\n        // `action=\"execute\"` (or anything unknown / missing) is the\n        // write path and routes through the approval gate.\n        !matches!(\n            args.get(\"action\").and_then(|v| v.as_str()),\n            Some(\"list\") | Some(\"connect\")\n        )\n    }\n\n    async fn execute(&self, args: serde_json::Value) -> anyhow::Result<ToolResult> {\n        let action = args\n            .get(\"action\")\n            .and_then(|v| v.as_str())\n            .ok_or_else(|| anyhow::anyhow!(\"Missing 'action' parameter\"))?;\n\n        let entity_id = args\n            .get(\"entity_id\")\n            .and_then(|v| v.as_str())\n            .unwrap_or(self.default_entity_id.as_str());\n\n        match action {\n            \"list\" => {\n                let app = args.get(\"app\").and_then(|v| v.as_str());\n                match self.list_actions(app).await {\n                    Ok(actions) => {\n                        let summary: Vec<String> = actions\n                            .iter()\n                            .take(20)\n                            .map(|a| {\n                                format!(\n                                    \"- {} ({}): {}\",\n                                    a.name,","sourceCodeStart":778,"sourceCodeEnd":814,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/integrations/composio/tools/direct.rs#L778-L814","documentation":"Guard in the composio tool's argument dispatch: the 'action' argument is missing (or not a recognized string), so the tool cannot decide between list/connect/execute. Unknown or missing action deliberately routes to the write path and requires an explicit value.","triggerScenarios":"Thrown at src/openhuman/integrations/composio/tools/direct.rs:796 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Pass action as one of \"list\", \"connect\", or \"execute\"","Use the dedicated composio tools for each action instead of relying on the generic action switch"],"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"}