{"record":{"id":"8f6e89cd52d1bea1","repo":"tinyhumansai/openhuman","slug":"missing-required-string-argument-workflow-id","errorCode":null,"errorMessage":"missing required string argument `workflow_id`","messagePattern":"missing required string argument `workflow_id`","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src/openhuman/skills/tools.rs","lineNumber":53,"sourceCode":"use super::ops_types::WorkflowScope;\nuse super::registry::get_workflow_with_profile;\nuse super::run_log::{read_run_log_slice, scan_runs};\n\nfn read_required_str(args: &serde_json::Value, key: &str) -> anyhow::Result<String> {\n    args.get(key)\n        .and_then(serde_json::Value::as_str)\n        .map(str::trim)\n        .filter(|s| !s.is_empty())\n        .map(str::to_string)\n        .ok_or_else(|| anyhow::anyhow!(\"missing required string argument `{key}`\"))\n}\n\n/// Read the target workflow id, accepting the legacy `skill_id` key as an\n/// alias for `workflow_id` so callers from before the rename still work.\nfn read_workflow_id(args: &serde_json::Value) -> anyhow::Result<String> {\n    read_required_str(args, \"workflow_id\")\n        .or_else(|_| read_required_str(args, \"skill_id\"))\n        .map_err(|_| anyhow::anyhow!(\"missing required string argument `workflow_id`\"))\n}\n\n/// Skill/workflow allowlist applied per agent profile. `None` = all skills are\n/// visible (the default). `Some(set)` restricts to the named `dir_name` slugs.\ntype SkillAllowlist = Option<std::collections::HashSet<String>>;\n\n/// Whether `dir_name` passes the optional per-profile skill allowlist.\nfn skill_allowed(allowlist: &SkillAllowlist, dir_name: &str) -> bool {\n    match allowlist {\n        None => true,\n        Some(set) => set.contains(dir_name),\n    }\n}\n\n/// Whether `skill_id` is usable given the profile's allowlist AND its private\n/// skills. A profile's own (profile-local) skills are implicitly allowed for\n/// their owner — they bypass the `allowed_skills` allowlist, mirroring\n/// `list_workflows`. `profile_local_ids` is empty for the profile-less session","sourceCodeStart":35,"sourceCodeEnd":71,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/skills/tools.rs#L35-L71","documentation":"The workflow-id reader found neither `workflow_id` nor the legacy `skill_id` alias in the tool arguments. This dedicated helper exists for rename back-compat, so this fires only when both keys are missing/empty — the caller used neither the current nor the pre-rename name for the workflow reference.","triggerScenarios":"Thrown at src/openhuman/skills/tools.rs:53 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Pass `workflow_id` (or legacy `skill_id`) as a non-empty string","Copy the id from the workflow listing output"],"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"}