{"record":{"id":"3f5a01d0b3fe7ee6","repo":"warpdotdev/warp","slug":"multiple-runners-match-name-specify-the-runne","errorCode":null,"errorMessage":"Multiple runners match '{name}'; specify the runner by UID","messagePattern":"Multiple runners match '(.+?)'; specify the runner by UID","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"app/src/ai/agent_sdk/runner.rs","lineNumber":245,"sourceCode":"    id: Option<&str>,\n    name: Option<&str>,\n) -> Result<&'a Runner> {\n    if let Some(id) = id {\n        return runners\n            .iter()\n            .find(|runner| runner.uid.inner() == id)\n            .ok_or_else(|| anyhow!(\"Runner '{id}' not found\"));\n    }\n\n    let name = name.ok_or_else(|| anyhow!(\"A runner UID or --name is required\"))?;\n    let matches: Vec<&Runner> = runners\n        .iter()\n        .filter(|runner| runner.config.name == name)\n        .collect();\n    match matches.as_slice() {\n        [] => Err(anyhow!(\"Runner '{name}' not found\")),\n        [runner] => Ok(runner),\n        _ => Err(anyhow!(\n            \"Multiple runners match '{name}'; specify the runner by UID\"\n        )),\n    }\n}\n\n/// Build the [`RunnerInput`] for a create operation.\nfn build_create_input(args: CreateRunnerArgs, owner: GqlOwner) -> UpsertRunnerInput {\n    let os = os_to_gql(args.os);\n    let (linux, mac) = match args.os {\n        RunnerOsArg::Linux => (\n            args.docker_image\n                .map(|docker_image| LinuxConfigInput { docker_image }),\n            None,\n        ),\n        RunnerOsArg::Macos => (\n            None,\n            Some(MacOsConfigInput {\n                version: args.macos_version.map(macos_version_to_gql),","sourceCodeStart":227,"sourceCodeEnd":263,"githubUrl":"https://github.com/warpdotdev/warp/blob/e72fd7aacbbb2236d9b3be2aad7e7178fe94b4bc/app/src/ai/agent_sdk/runner.rs#L227-L263","documentation":"Ambiguity branch of the same runner-by-name resolver: filtering the fetched runners by config.name yielded two or more entries. Runner names are not unique server-side, so a name alone cannot identify which runner to mutate and the command refuses to guess. The message tells you to disambiguate with the runner UID.","triggerScenarios":"Two or more runners visible to the current owner share the same config.name (e.g. created independently in different teams), and a runner command is invoked with --name only.","commonSituations":"Provisioning templates that create runners with a fixed name run in multiple teams; duplicates after a team merge or rename; shared org-wide runner names.","solutions":["Get the UID of the intended runner from the runner list and pass it instead of --name","Rename the duplicate runners so names are unique within the visible set","Scope the command to the owning team so only one match is visible, if the CLI supports owner selection"],"exampleFix":"// before\noz runner update --name build --memory-gb 8\n# Error: Multiple runners match 'build'; specify the runner by UID\n\n// after\noz runner list                 # two rows named 'build'; pick the right UID\noz runner update --uid rnr_abc123 --memory-gb 8","handlingStrategy":"validation","validationCode":"let matches: Vec<_> = runners.iter().filter(|r| r.config.name == name).collect();\nif matches.len() != 1 {\n    anyhow::bail!(\"expected exactly one runner named '{name}', found {}\", matches.len());\n}\nupdate_runner(matches[0].uid.clone(), input).await?;","typeGuard":"fn unique_runner_by_name<'a>(runners: &'a [Runner], name: &str) -> Option<&'a Runner> {\n    let m: Vec<_> = runners.iter().filter(|r| r.config.name == name).collect();\n    (m.len() == 1).then(|| m[0])\n}","tryCatchPattern":null,"preventionTips":["Adopt UIDs as the canonical identifier in automation","Make runner names unique per team/org by convention (e.g. prefix with team)","Check match count before mutating when looping over named runners"],"tags":["agent-sdk","runner","cli","ambiguity","validation"],"backgroundTag":null,"analyzedSha":"e72fd7aacbbb2236d9b3be2aad7e7178fe94b4bc","analyzedAt":"2026-08-16T08:27:25.381Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}