{"record":{"id":"724f0778459e4188","repo":"jdx/mise","slug":"linux-release-targets-require-a-detected-libc-fami","errorCode":null,"errorMessage":"Linux release targets require a detected libc family","messagePattern":"Linux release targets require a detected libc family","errorType":"exception","errorClass":"eyre::Report","httpStatus":null,"severity":"error","filePath":"src/system/remote.rs","lineNumber":1100,"sourceCode":"        \"armv7\" => \"armv7\",\n        _ => {\n            bail!(\n                \"mise {} has no official precompiled artifact for {os}/{arch}; set mise_bin, remote_mise, or bootstrap_command\",\n                env!(\"CARGO_PKG_VERSION\")\n            )\n        }\n    };\n    let suffix = match os {\n        \"macos\" if matches!(arch, \"x86_64\" | \"aarch64\") => {\n            if libc.is_some() {\n                bail!(\"macOS release targets cannot declare a libc family\");\n            }\n            format!(\"macos-{release_arch}\")\n        }\n        \"linux\" if matches!(arch, \"x86_64\" | \"aarch64\" | \"armv7\") => match libc {\n            Some(LibcFlavor::Glibc) => format!(\"linux-{release_arch}\"),\n            Some(LibcFlavor::Musl) => format!(\"linux-{release_arch}-musl\"),\n            None => bail!(\"Linux release targets require a detected libc family\"),\n        },\n        _ => {\n            bail!(\n                \"mise {} has no official precompiled artifact for {os}/{arch}; set mise_bin, remote_mise, or bootstrap_command\",\n                env!(\"CARGO_PKG_VERSION\")\n            )\n        }\n    };\n    Ok(format!(\"mise-v{}-{suffix}\", env!(\"CARGO_PKG_VERSION\")))\n}\n\nfn official_release_assets(os: &str, arch: &str) -> Result<Vec<String>> {\n    match os {\n        \"linux\" => [LibcFlavor::Glibc, LibcFlavor::Musl]\n            .into_iter()\n            .map(|libc| release_asset_name(os, arch, Some(libc)))\n            .collect(),\n        \"macos\" => Ok(vec![release_asset_name(os, arch, None)?]),","sourceCodeStart":1082,"sourceCodeEnd":1118,"githubUrl":"https://github.com/jdx/mise/blob/6f52dcdf99e282ef7a7db68c81301fa4618d0f79/src/system/remote.rs#L1082-L1118","documentation":"Defensive invariant in release_asset_name: a Linux target was passed with libc None. Linux asset names must encode the libc family (linux-{arch} for glibc, linux-{arch}-musl for musl), so an unidentified family cannot produce a valid asset name. Today parse_remote_platform already bails with 'remote Linux libc family could not be identified' before libc can be None for Linux, and official_release_assets always passes Some(libc), so this arm guards future internal callers only.","triggerScenarios":"A Rust change constructs a Linux RemotePlatform without running libc detection, or calls release_asset_name(\"linux\", arch, None) directly (e.g. new code path that skips detect_remote_platform).","commonSituations":"Adding a new platform source (config-declared platform, cached platform) that forgets the libc field; refactors that drop the detection step.","solutions":["Run libc detection first (remote_platform_script via detect_remote_platform) and pass Some(glibc|musl) for Linux","If declaring a platform manually, resolve libc via ldd --version / getconf GNU_LIBC_VERSION / ld-musl loader presence, mirroring remote_platform_script"],"exampleFix":"// before\nlet platform = RemotePlatform { os: \"linux\".into(), arch: \"x86_64\".into(), libc: None };\nlet asset = platform.release_asset_name()?;\n\n// after\nlet platform = detect_remote_platform(&session)?; // libc detected as Some(Glibc|Musl)\nlet asset = platform.release_asset_name()?;","handlingStrategy":"validation","validationCode":"// Guard at the call site: linux requires a detected libc family\nif platform.os == \"linux\" && platform.libc.is_none() {\n    eyre::bail!(\"run detect_remote_platform first: linux needs libc detection\");\n}\nlet asset = platform.release_asset_name()?;","typeGuard":"fn valid_asset_request(os: &str, arch: &str, libc: Option<LibcFlavor>) -> bool {\n    match normalize_os(os).as_str() {\n        \"linux\" => libc.is_some() && matches!(normalize_arch(arch).as_str(), \"x86_64\" | \"aarch64\" | \"armv7\"),\n        \"macos\" => libc.is_none() && matches!(normalize_arch(arch).as_str(), \"x86_64\" | \"aarch64\"),\n        _ => false,\n    }\n}","tryCatchPattern":null,"preventionTips":["Never hand-construct a Linux RemotePlatform without libc","Route all platform acquisition through detect_remote_platform","Add a debug_assert!(os != \"linux\" || libc.is_some()) next to platform-producing code"],"tags":["mise","internal-invariant","linux","libc","release-artifact"],"backgroundTag":"invalid-parameter-combination","analyzedSha":"6f52dcdf99e282ef7a7db68c81301fa4618d0f79","analyzedAt":"2026-08-22T10:14:23.840Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}