{"record":{"id":"15cf727a91dcda0b","repo":"jdx/mise","slug":"github-com-repo-has-no-release-carrying-asse","errorCode":null,"errorMessage":"github.com/{repo} has no release {} carrying {asset_name}; mise installs from a packslip and does not guess at release assets","messagePattern":"github\\.com/(.+?) has no release (.+?) carrying (.+?); mise installs from a packslip and does not guess at release assets","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/backend/packslip.rs","lineNumber":863,"sourceCode":"        pin: &Pin,\n        opts: &PackslipOptions<'_>,\n    ) -> Result<Located> {\n        if let Some(located) = self.vendor_entry(project, tv, pin, opts).await? {\n            return Ok(located);\n        }\n        // No signed list names the manifest, so the release asset is the\n        // only place left to find it. Only a GitHub project gets here.\n        let asset_name = bundle_name(project);\n        let repo = Self::repo(project)\n            .ok_or_else(|| eyre!(\"packslip:{project} publishes no signed release list\"))?;\n        let releases = github::list_releases_including_prereleases(&repo).await?;\n        let found = releases.iter().find_map(|r| {\n            let asset = r.assets.iter().find(|a| a.name == asset_name)?;\n            (tag_version(&r.tag_name, project).as_deref() == Some(tv.version.as_str()))\n                .then_some(asset)\n        });\n        let Some(asset) = found else {\n            bail!(\n                \"github.com/{repo} has no release {} carrying {asset_name}; mise installs from a packslip and does not guess at release assets\",\n                tv.version\n            );\n        };\n        Ok(Located {\n            // A private repository serves nothing at the browser URL, and the\n            // asset's API endpoint is already in hand here.\n            url: github::pick_reachable_asset_url(&asset.browser_download_url, &asset.url).await,\n            digest: None,\n        })\n    }\n\n    /// Fetch and verify the release manifest without downloading its artifact.\n    /// Lock generation uses this to learn artifact URLs and signed digests for\n    /// any target platform, while latest-version selection uses the same policy\n    /// path to decide whether a candidate is eligible.\n    async fn verified_release(\n        &self,","sourceCodeStart":845,"sourceCodeEnd":881,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/backend/packslip.rs#L845-L881","documentation":"mise located the requested version's tag in the GitHub repo but no release carries the asset file name expected from the packslip. Because packslip installs strictly from a signed manifest, mise will not guess among release assets and fails instead.","triggerScenarios":"locate_bundle (via verified_release/install_payload) scanning releases for r.assets matching asset_name at exactly tv.version, and no release at that tag contains an asset with that exact name — asset renamed, not attached, or wrong platform/file mapping in the manifest.","commonSituations":"Vendor renamed release assets (e.g. added/removed a target triple suffix); asset missing for the user's platform; vendor forgot to attach the file to the GitHub release; user is on an OS/arch the vendor does not publish.","solutions":["Check the GitHub release for that version and confirm the exact asset file name the packslip expects exists","Report/fix the asset name mismatch in the packslip manifest so it matches the actual release asset","Install a version/platform the vendor actually publishes (mise ls-remote or the release page)"],"exampleFix":"// before (manifest asset name)\nasset = 'ripgrep-14.1.0-x86_64-linux.tar.gz'\n// after — match the actual uploaded asset\nasset = 'ripgrep-14.1.0-x86_64-unknown-linux-musl.tar.gz'","handlingStrategy":"fallback","validationCode":"gh release view <version> --repo <owner>/<repo> --json assets -q '.assets[].name'  # confirm the expected asset exists before installing","typeGuard":"null","tryCatchPattern":"// catch and surface the missing asset to the user with the release URL\nmatch install {\n    Err(e) if e.to_string().contains(\"carrying\") => eprintln!(\"asset missing; see https://github.com/{repo}/releases/tag/v{version}\"),\n    other => other?,\n}","preventionTips":["As a vendor, verify every platform asset is attached before publishing the release","Test install on each supported OS/arch after renaming assets","Keep asset naming stable; if renaming, republish the packslip"],"tags":["packslip","github-release","asset-missing","platform"],"backgroundTag":"resource-not-found","analyzedSha":"533346cc374382b41ec5ff70536252b2e96e725c","analyzedAt":"2026-09-17T13:35:38.149Z","contentChangedAt":"2026-09-17T13:35:38.149Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}