{"record":{"id":"5e2dab2f506ae239","repo":"astrid-runtime/astrid","slug":"var-key-was-supplied-more-than-once-5e2dab","errorCode":null,"errorMessage":"--var '{key}' was supplied more than once","messagePattern":"--var '(.+?)' was supplied more than once","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/astrid-cli/src/commands/capsule/install_daemon.rs","lineNumber":420,"sourceCode":"            .with_context(|| format!(\"read Capsule.toml from {}\", path.display()));\n    }\n    bail!(\"source path does not exist: {source}\")\n}\n\nfn validate_values(\n    manifest: &CapsuleManifest,\n    items: &[String],\n) -> anyhow::Result<Vec<DaemonEnvValue>> {\n    let mut parsed = HashMap::new();\n    for item in items {\n        let (key, value) = item\n            .split_once('=')\n            .ok_or_else(|| anyhow::anyhow!(\"--var must be KEY=VALUE (got {item:?})\"))?;\n        if key.is_empty() || key.contains('\\0') || key.contains(':') {\n            bail!(\"--var has an invalid key (got {key:?})\");\n        }\n        if parsed.insert(key.to_owned(), value.to_owned()).is_some() {\n            bail!(\"--var '{key}' was supplied more than once\");\n        }\n    }\n\n    let mut values = Vec::with_capacity(parsed.len());\n    for (key, value) in parsed {\n        let definition = manifest.env.get(&key).ok_or_else(|| {\n            anyhow::anyhow!(\n                \"--var names no [env] field in {}: {key}\",\n                manifest.package.name\n            )\n        })?;\n        let kind = if definition.env_type.eq_ignore_ascii_case(\"secret\") {\n            if value.len() > 64 * 1024 {\n                bail!(\"secret value for {key} exceeds 65536-byte limit\");\n            }\n            EnvValueKind::Secret\n        } else {\n            if value.len() > 1 << 20 {","sourceCodeStart":402,"sourceCodeEnd":438,"githubUrl":"https://github.com/astrid-runtime/astrid/blob/affd8760f44190dbdfbec23403f4c4b642c33112/crates/astrid-cli/src/commands/capsule/install_daemon.rs#L402-L438","documentation":"validate_values inserts each parsed key into a HashMap; if insert returns Some, the same key appeared in more than one --var flag. Duplicate keys are ambiguous, so the install bails instead of silently last-wins.","triggerScenarios":"Supplying the same env key twice, e.g. --var TOKEN=a --var TOKEN=b, to install_local_via_daemon_for_target_with_generation.","commonSituations":"Shell scripts appending --var flags in a loop over a list containing duplicate keys; combining a defaults file and explicit flags that both define the same key.","solutions":["Remove the duplicate --var occurrence, keeping only the intended value.","Deduplicate the key list in your script before building the command.","If you meant to override, decide which value wins and pass it once."],"exampleFix":"// before\n--var TOKEN=a --var TOKEN=b\n// after\n--var TOKEN=b","handlingStrategy":"validation","validationCode":"let seen = std::collections::HashSet::new();\nfor k in keys { assert!(seen.insert(k), \"duplicate --var key {k}\"); }","typeGuard":null,"tryCatchPattern":"on duplicate-key error, de-duplicate the argument list (last-wins intentionally) and re-run once.","preventionTips":["Build --var flags from a single source of truth (one map/file).","Deduplicate key lists before looping them into flags.","Avoid merging defaults and explicit flags without an override policy."],"tags":["cli","arguments","duplicate","env"],"backgroundTag":"conflicting-config-options","analyzedSha":"affd8760f44190dbdfbec23403f4c4b642c33112","analyzedAt":"2026-09-09T21:28:12.402Z","contentChangedAt":"2026-09-09T21:28:12.402Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}