{"record":{"id":"0af9d45fd46c2b73","repo":"astrid-runtime/astrid","slug":"release-resolved-ref-of-org-repo-ships-no-c-0af9d4","errorCode":null,"errorMessage":"release {resolved_ref} of {org}/{repo} ships no .capsule asset — seal requires pre-built release artifacts","messagePattern":"release (.+?) of (.+?)/(.+?) ships no \\.capsule asset — seal requires pre-built release artifacts","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/astrid-cli/src/commands/capsule/install.rs","lineNumber":457,"sourceCode":"        .send()\n        .await\n        .context(\"failed to fetch release metadata\")?;\n    if !response.status().is_success() {\n        bail!(\n            \"GitHub API returned {} fetching release {resolved_ref} of {org}/{repo}\",\n            response.status()\n        );\n    }\n    let json: serde_json::Value = response.json().await.context(\"invalid release metadata\")?;\n    let assets = json\n        .get(\"assets\")\n        .and_then(serde_json::Value::as_array)\n        .map(Vec::as_slice)\n        .unwrap_or_default();\n    let candidates = capsule_assets(assets);\n    let names: Vec<&str> = candidates.iter().map(|(n, _)| n.as_str()).collect();\n    let Some(idx) = pick_capsule(&names, name_hint)? else {\n        bail!(\n            \"release {resolved_ref} of {org}/{repo} ships no .capsule asset — \\\n             seal requires pre-built release artifacts\"\n        );\n    };\n    let (_, download_url) = &candidates[idx];\n\n    download_capsule_asset(&client, download_url, dest_path).await?;\n    Ok(resolved_ref)\n}\n\n/// Download a single `.capsule` asset (streamed, 50 MB cap) and install it.\n/// Returns the installed capsule id.\nasync fn download_and_unpack(\n    client: &reqwest::Client,\n    name: &str,\n    download_url: &str,\n    context: InstallContext<'_>,\n) -> anyhow::Result<InstalledCapsuleOutcome> {","sourceCodeStart":439,"sourceCodeEnd":475,"githubUrl":"https://github.com/astrid-runtime/astrid/blob/affd8760f44190dbdfbec23403f4c4b642c33112/crates/astrid-cli/src/commands/capsule/install.rs#L439-L475","documentation":"This error is thrown by `resolve_capsule_to_file` in astrid-cli when a GitHub release of a capsule repository contains no `.capsule` asset. Capsule installation from GitHub releases only consumes pre-built release artifacts; `capsule_assets(assets)` filters the release asset list and `pick_capsule` selects a matching one, and if no candidate survives the filter, installation cannot proceed. The library deliberately does not fall back to building from source in this path.","triggerScenarios":"Calling capsule install from GitHub with a source-repo/release path where the resolved release (tag, branch, or latest) has zero assets matching the `.capsule` pattern — e.g. the maintainer published a release with only source archives (Source code zip/tar.gz) and no pre-built `.capsule` file, or the asset has a different extension.","commonSituations":"Developer pins an older release tag from before the project started attaching `.capsule` artifacts; a CI pipeline failed to upload the built capsule asset; the repo ships releases for a different artifact convention; a typo'd ref resolves to a release without assets.","solutions":["Check the release page for {org}/{repo} at the resolved ref and confirm a `.capsule` asset exists; pick a different tag/ref that has one","Upgrade or change the requested ref to a release where CI successfully uploaded the `.capsule` artifact","Re-run the project's release pipeline (or manually attach the built `.capsule` file to the release) so the asset exists","Use the from-source installation path (`clone_and_build` via install from GitHub source mode) which clones and runs `astrid-build` instead of consuming release assets"],"exampleFix":"// before: installing a tag with no pre-built asset\nastrid capsule install github:org/repo@v0.1.0\n// after: use a release that ships .capsule artifacts, or build from source\nastrid capsule install github:org/repo@v0.2.1","handlingStrategy":"validation","validationCode":"// Check the release has a .capsule asset before installing\nlet assets = fetch_release_assets(org, repo, resolved_ref)?;\nlet has_capsule = capsule_assets(&assets).len() > 0;\nif !has_capsule {\n    eprintln!(\"release {resolved_ref} of {org}/{repo} has no .capsule asset; pick another ref or build from source\");\n}","typeGuard":null,"tryCatchPattern":"match resolve_capsule_to_file(...) {\n    Ok(path) => proceed(path),\n    Err(e) if e.to_string().contains(\"ships no .capsule asset\") => {\n        // fall back to source build path or prompt user for another ref\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Before pinning a ref, inspect the GitHub release page and confirm a `.capsule` asset is attached","Prefer the latest stable release over old tags when installing, since older releases may predate `.capsule` uploads","Verify the release CI pipeline uploads the built `.capsule` artifact before publishing tags","If maintainership allows, use the from-source install mode for repos that don't ship release artifacts"],"tags":["github","release","capsule","missing-asset"],"backgroundTag":"resource-not-found","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"}