{"record":{"id":"b6cd4265fa8bbac9","repo":"Hmbown/CodeWhale","slug":"no-release-source-publishes-an-asset-for-this-plat","errorCode":null,"errorMessage":"no release source publishes an asset for this platform","messagePattern":"no release source publishes an asset for this platform","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/cli/src/update.rs","lineNumber":895,"sourceCode":"            MANIFEST_PROBE_TIMEOUT,\n        )\n    })\n}\n\n/// Probe every candidate at once and take the first one that answers with a\n/// usable manifest.\n///\n/// \"First\" means first to *return*, not first in the list and not whichever one\n/// survives a timeout: a source that is slow or unreachable simply loses, and a\n/// source that answers with a manifest that does not cover this platform's\n/// binary loses too. Once a winner is chosen its receiver is dropped, so a\n/// straggler's result has nowhere to land and is ignored.\nfn select_release_source(\n    candidates: Vec<ReleaseSourceCandidate>,\n    fetch_manifest: Arc<ManifestFetcher>,\n) -> Result<DownloadPlan> {\n    if candidates.is_empty() {\n        bail!(\"no release source publishes an asset for this platform\");\n    }\n\n    let (result_tx, result_rx) = mpsc::channel();\n    for candidate in candidates {\n        let result_tx = result_tx.clone();\n        let fetch_manifest = Arc::clone(&fetch_manifest);\n        thread::spawn(move || {\n            let outcome = probe_release_source(&candidate, &*fetch_manifest);\n            let _ = result_tx.send((candidate, outcome));\n        });\n    }\n    drop(result_tx);\n\n    let mut failures = Vec::new();\n    while let Ok((candidate, outcome)) = result_rx.recv() {\n        match outcome {\n            Ok(checksums) => {\n                return Ok(DownloadPlan {","sourceCodeStart":877,"sourceCodeEnd":913,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/0c42157ee52f9d55af2b506d71b46249910f77d3/crates/cli/src/update.rs#L877-L913","documentation":"select_release_source was called with zero candidate release sources, meaning no configured source publishes an asset matching this platform (OS/arch combination). There is nothing to probe, so the update cannot proceed.","triggerScenarios":"Running self-update on a platform outside the release matrix: the OS/arch pair matches no release asset name, so no ReleaseSourceCandidate is built (note this path is separate from the explicit riscv64 refusal in ensure_supported_release_target).","commonSituations":"Niche or newly added architectures, renamed asset naming schemes, or a release cycle where assets for that platform were dropped.","solutions":["Check docs/INSTALL.md for the currently supported platform matrix","Build the CLI from source for your platform instead of self-updating","Request platform support in the issue tracker with your OS/arch","If assets were expected, verify the latest release actually published files for your target"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"fn platform_has_release_assets() -> bool {\n    let (os, arch) = (std::env::consts::OS, std::env::consts::ARCH);\n    // mirror docs/INSTALL.md's matrix\n    matches!((os, arch),\n        (\"linux\", \"x86_64\") | (\"linux\", \"aarch64\")\n        | (\"macos\", \"x86_64\") | (\"macos\", \"aarch64\")\n        | (\"windows\", \"x86_64\") | (\"android\", \"aarch64\"))\n        && !matches!((os, arch), (\"linux\", \"riscv64\"))\n}\n\nif !platform_has_release_assets() {\n    eprintln!(\"no release assets for {}/{}; build from source\", std::env::consts::OS, std::env::consts::ARCH);\n}","typeGuard":null,"tryCatchPattern":"Catch the empty-candidates error and branch to a from-source build path or a clear 'unsupported platform' message instead of retrying.","preventionTips":["Check the platform matrix in docs/INSTALL.md before enabling self-update","Gate update UI on supported OS/arch pairs","Track release notes for platform additions/drops"],"tags":["release","platform","self-update"],"backgroundTag":"no-release-asset-for-platform","analyzedSha":"0c42157ee52f9d55af2b506d71b46249910f77d3","analyzedAt":"2026-08-20T21:50:45.477Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}