{"record":{"id":"963d13acc9c195f9","repo":"jdx/mise","slug":"brew-cask-unsupported-kind-context-field-963d13","errorCode":null,"errorMessage":"brew-cask:{}: unsupported {kind} {context} field {}","messagePattern":"brew-cask:(.+?): unsupported (.+?) (.+?) field (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/system/packages/brew/cask/artifacts.rs","lineNumber":1048,"sourceCode":"    reject_unsupported_flight_fields(cask, kind, field, object, &[\"base\", \"path\"])?;\n    parse_context_flight_path(cask, kind, field, object)\n}\n\npub(super) fn reject_unsupported_flight_fields(\n    cask: &Cask,\n    kind: &str,\n    context: &str,\n    object: &serde_json::Map<String, Value>,\n    allowed: &[&str],\n) -> Result<()> {\n    let mut unsupported = object\n        .keys()\n        .filter(|key| !allowed.contains(&key.as_str()))\n        .cloned()\n        .collect::<Vec<_>>();\n    unsupported.sort();\n    if !unsupported.is_empty() {\n        bail!(\n            \"brew-cask:{}: unsupported {kind} {context} field {}\",\n            cask.token,\n            unsupported.join(\", \")\n        );\n    }\n    Ok(())\n}\n\npub(super) fn parse_flight_path(\n    cask: &Cask,\n    kind: &str,\n    field: &str,\n    value: Option<&Value>,\n) -> Result<FlightPath> {\n    let object = value.and_then(Value::as_object).ok_or_else(|| {\n        eyre!(\n            \"brew-cask:{}: unsupported {kind} {field} metadata format\",\n            cask.token","sourceCodeStart":1030,"sourceCodeEnd":1066,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/system/packages/brew/cask/artifacts.rs#L1030-L1066","documentation":"The cask stanza parser uses an allowlist for the keys it understands in each artifact/guard/path object (e.g. run guards allow condition, value, base, path, id). If the object contains any key outside the allowlist for that `{kind}`/`{context}`, this error lists the offending keys. This prevents silently ignoring stanza fields whose semantics might change behavior.","triggerScenarios":"A cask's flight/guard/path object contains unknown keys, e.g. a guard with `arch`, `args`, or `stdin` fields, or a renamed key like `conditions` instead of `condition`. The error names all unexpected keys, sorted and comma-joined.","commonSituations":"Casks using newer Homebrew DSL features (extra stanza fields) not yet supported, custom-tap casks with nonstandard keys, typos like `paths` instead of `path`, and machine-generated cask JSON with extra metadata.","solutions":["Remove the listed unsupported keys from the stanza object, or move them into a supported key's value.","Fix typos so keys match the allowlist exactly (check the error message: it lists exactly which keys were rejected).","Update the cask/tap to a revision whose stanza uses only supported fields.","If a genuinely new DSL field is needed, remove the affected artifact or ask upstream to support the field."],"exampleFix":"// before\n{ \"condition\": \"on\", \"value\": \"macos\", \"arch\": \"arm64\" }\n// after\n{ \"condition\": \"on\", \"value\": \"macos\" }","handlingStrategy":"validation","validationCode":"function hasOnlyAllowedKeys(obj, allowed) {\n  return Object.keys(obj).every(k => allowed.includes(k));\n}\n// e.g. for run guards:\n// hasOnlyAllowedKeys(guard, [\"condition\",\"value\",\"base\",\"path\",\"id\"])","typeGuard":"function isKnownKey<K extends string>(k: string, allowed: readonly K[]): k is K {\n  return (allowed as readonly string[]).includes(k);\n}","tryCatchPattern":"try {\n  installCask(token);\n} catch (e) {\n  const m = String(e).match(/unsupported \\S+ \\S+ field (.+)/);\n  if (m) {\n    console.warn(`Cask has unsupported fields: ${m[1]} — strip them or update the tool`);\n  } else throw e;\n}","preventionTips":["Keep cask stanzas to documented DSL fields only","Run a stanza linter that diffs keys against the allowlist per artifact type","Update this tool when Homebrew adds new stanza fields","Watch for typos: the error lists exact rejected keys"],"tags":["homebrew","cask","parsing","schema-validation","allowlist"],"backgroundTag":"schema-validation-failed","analyzedSha":"afd2eddd3a50c16190efc1c7e94404b48f72af57","analyzedAt":"2026-09-09T01:38:25.179Z","contentChangedAt":"2026-09-09T01:38:25.179Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}