{"record":{"id":"995c4d9a20b22a13","repo":"windmill-labs/windmill","slug":"oneof-definition-has-a-duplicate-variant-variant","errorCode":null,"errorMessage":"oneOf definition has a duplicate variant `{variant_label}`","messagePattern":"oneOf definition has a duplicate variant `(.+?)`","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"backend/windmill-common/src/schema.rs","lineNumber":106,"sourceCode":"                    let mut rules_map: HashMap<String, Vec<SchemaValidationRule>> = HashMap::new();\n\n                    for variant in one_of {\n                        let variant_label = variant\n                            .get(\"title\")\n                            .ok_or(anyhow!(\n                                \"oneOf variant definition should have a `title` field\"\n                            ))?\n                            .as_str()\n                            .ok_or(anyhow!(\n                                \"oneOf variant definition `title` field should be a string\"\n                            ))?;\n                        if !rules_map.contains_key(variant_label) {\n                            rules_map.insert(\n                                variant_label.to_string(),\n                                SchemaValidationRule::from_value(variant)?,\n                            );\n                        } else {\n                            return Err(anyhow!(\n                                \"oneOf definition has a duplicate variant `{variant_label}`\"\n                            ));\n                        }\n                    }\n\n                    schema_rules.push(SchemaValidationRule::IsOneOf(rules_map))\n                } else {\n                    let is_resource = val\n                        .get(\"format\")\n                        .and_then(|f| f.as_str())\n                        .map(|f| f.starts_with(\"resource\"))\n                        .unwrap_or(false);\n                    if !is_resource {\n                        return Err(anyhow!(\n                        \"Object type should have a `properties` or `anyOf` field, or be a resource\"\n                        ));\n                    }\n                }","sourceCodeStart":88,"sourceCodeEnd":124,"githubUrl":"https://github.com/windmill-labs/windmill/blob/e474e8803ce2ff5c2df09a58dab51d45f5c922ca/backend/windmill-common/src/schema.rs#L88-L124","documentation":"Windmill keys `oneOf` variants by their `title`; when two variants in the same `oneOf` array share the same title, the second would silently overwrite the first in the rules map. Instead, parsing aborts with this error naming the duplicated variant.","triggerScenarios":"A `oneOf` array containing two or more variant schemas whose `title` strings are identical, encountered while parsing the object schema.","commonSituations":"Duplicating a variant block and forgetting to rename its title; generator templates emitting the same default title; merging schemas from multiple sources.","solutions":["Rename each variant's `title` to a unique string.","Deduplicate variants that are truly identical (keep one).","Add a deployment-time JSON Schema check to catch duplicate titles early."],"exampleFix":"// before\n{ \"oneOf\": [ { \"title\": \"A\", \"type\": \"string\" }, { \"title\": \"A\", \"type\": \"number\" } ] }\n// after\n{ \"oneOf\": [ { \"title\": \"A (string)\", \"type\": \"string\" }, { \"title\": \"A (number)\", \"type\": \"number\" } ] }","handlingStrategy":"validation","validationCode":"const s = JSON.parse(schemaRaw);\nif (Array.isArray(s.oneOf)) {\n  const titles = s.oneOf.map(v => v?.title);\n  const dupes = titles.filter((t, i) => titles.indexOf(t) !== i);\n  if (dupes.length) throw new Error(`Duplicate oneOf titles: ${[...new Set(dupes)]}`);\n}","typeGuard":"function hasUniqueVariantTitles(s) {\n  if (!Array.isArray(s.oneOf)) return true;\n  const titles = s.oneOf.map(v => v?.title);\n  return new Set(titles).size === titles.length;\n}","tryCatchPattern":"try {\n  await deploy(schema);\n} catch (e) {\n  const m = String(e.message).match(/duplicate variant `(.*?)`/);\n  if (m) throw new Error(`Rename the duplicated variant title \"${m[1]}\"`);\n  throw e;\n}","preventionTips":["After copying a variant block, immediately rename its title.","Add a CI check for duplicate titles across oneOf variants.","Generate titles programmatically (suffix with index) when templating variants."],"tags":["json-schema","oneof","duplicate","windmill"],"backgroundTag":"schema-validation-failed","analyzedSha":"e474e8803ce2ff5c2df09a58dab51d45f5c922ca","analyzedAt":"2026-09-03T12:38:19.024Z","contentChangedAt":"2026-09-03T12:38:19.024Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}