{"record":{"id":"130cf40aab12ca03","repo":"BloopAI/vibe-kanban","slug":"provide-prompt-or-issue-id-that-has-a-non-emp","errorCode":null,"errorMessage":"Provide `prompt`, or `issue_id` that has a non-empty title/description.","messagePattern":"Provide `prompt`, or `issue_id` that has a non-empty title/description\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/mcp/src/task_server/tools/task_attempts.rs","lineNumber":172,"sourceCode":"                Ok(issue) => issue,\n                Err(e) => return Ok(Self::tool_error(e)),\n            };\n\n            (\n                Some(LinkedIssueInfo {\n                    remote_project_id: issue.project_id,\n                    issue_id,\n                }),\n                build_workspace_prompt_from_issue(&issue),\n            )\n        } else {\n            (None, None)\n        };\n\n        let workspace_prompt = match prompt.or(issue_prompt) {\n            Some(prompt) => prompt,\n            None => {\n                return Self::err(\n                    \"Provide `prompt`, or `issue_id` that has a non-empty title/description.\",\n                    None::<&str>,\n                );\n            }\n        };\n\n        let create_and_start_payload = CreateAndStartWorkspaceRequest {\n            name: Some(name.clone()),\n            repos: workspace_repos,\n            linked_issue,\n            executor_config: ExecutorConfig {\n                executor: base_executor,\n                variant,\n                model_id: None,\n                agent_id: None,\n                reasoning_id: None,\n                permission_policy: None,\n            },","sourceCodeStart":154,"sourceCodeEnd":190,"githubUrl":"https://github.com/BloopAI/vibe-kanban/blob/4deb7eca8f381f7cbc1f9d15515a9ab8f8009053/crates/mcp/src/task_server/tools/task_attempts.rs#L154-L190","documentation":"The MCP `start_workspace` tool requires an execution prompt. It accepts either an explicit `prompt` argument or an `issue_id` whose linked issue yields a non-empty prompt (built from the issue's title/description via `build_workspace_prompt_from_issue`). If both resolve to nothing — no prompt passed, no issue_id passed, or the issue's title/description are empty — the tool returns this error instead of starting a workspace.","triggerScenarios":"Calling start_workspace with neither `prompt` nor `issue_id`; calling with `issue_id` pointing to an issue whose title AND description are empty/whitespace so `build_workspace_prompt_from_issue` returns None; passing a whitespace-only `prompt` that trims to nothing.","commonSituations":"Agents/LLM clients invoking the MCP tool with only name/repositories filled in; automation scripts referencing issues created without descriptions; assuming any issue_id works when the issue is essentially blank.","solutions":["Pass a non-empty `prompt` argument describing the task to start_workspace.","If using `issue_id`, verify the issue has a non-empty title or description via GET /api/remote/issues/{issue_id} before calling.","Fill in the issue's title/description, or pass both prompt and issue_id so the prompt is always present."],"exampleFix":"// before\nstart_workspace({ name: \"fix-bug\", repositories: [{ repo_id: \"r1\" }] })\n\n// after\nstart_workspace({ name: \"fix-bug\", repositories: [{ repo_id: \"r1\" }], prompt: \"Fix the login redirect bug described in issue #42\" })","handlingStrategy":"validation","validationCode":"// Rust caller, before invoking start_workspace\nfn ensure_prompt(prompt: &Option<String>, issue: &Option<Issue>) -> Result<String, String> {\n    if let Some(p) = prompt {\n        if !p.trim().is_empty() { return Ok(p.clone()); }\n    }\n    if let Some(iss) = issue {\n        let derived = format!(\"{} {}\", iss.title, iss.description.as_deref().unwrap_or(\"\"));\n        if !derived.trim().is_empty() { return Ok(derived); }\n    }\n    Err(\"Provide a non-empty prompt, or an issue_id with non-empty title/description\".into())\n}","typeGuard":"fn has_prompt_input(prompt: &Option<String>, issue_title: &str, issue_desc: &str) -> bool {\n    prompt.as_deref().map(|p| !p.trim().is_empty()).unwrap_or(false)\n        || !issue_title.trim().is_empty()\n        || !issue_desc.trim().is_empty()\n}","tryCatchPattern":null,"preventionTips":["Always pass an explicit prompt when automating workspace starts via MCP.","Validate issue title/description non-empty before using issue_id-only calls.","Trim and check prompt strings client-side; empty/whitespace prompts are rejected."],"tags":["mcp","validation","missing-argument"],"backgroundTag":"missing-required-argument","analyzedSha":"4deb7eca8f381f7cbc1f9d15515a9ab8f8009053","analyzedAt":"2026-08-29T09:24:13.446Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}