{"record":{"id":"31b4fa6f4c5611a3","repo":"BoundaryML/baml","slug":"no-assets-in-release-metadata","errorCode":null,"errorMessage":"No assets in release metadata","messagePattern":"No assets in release metadata","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"engine/playground-server/src/server.rs","lineNumber":161,"sourceCode":"            .await\n            .unwrap_or_else(|_| \"Failed to read response body\".to_string());\n        return Err(anyhow::anyhow!(\n            \"GitHub API request failed with status {}: {}\",\n            status,\n            body\n        ));\n    }\n\n    tracing::info!(\"Parsing JSON response...\");\n    let release: serde_json::Value = resp\n        .json()\n        .await\n        .map_err(|e| anyhow::anyhow!(\"Failed to parse JSON response: {e}\"))?;\n\n    // Find the main asset\n    let assets = release[\"assets\"]\n        .as_array()\n        .ok_or_else(|| anyhow::anyhow!(\"No assets in release metadata\"))?;\n    let asset = assets\n        .iter()\n        .find(|a| a[\"name\"].as_str() == Some(&web_panel_asset_name))\n        .ok_or_else(|| anyhow::anyhow!(\"No asset named '{}' in release\", web_panel_asset_name))?;\n    let download_url = asset[\"browser_download_url\"]\n        .as_str()\n        .ok_or_else(|| anyhow::anyhow!(\"No download URL for asset\"))?;\n\n    // Find the checksum asset\n    let checksum_asset = assets\n        .iter()\n        .find(|a| a[\"name\"].as_str() == Some(&checksum_asset_name))\n        .ok_or_else(|| {\n            anyhow::anyhow!(\n                \"No checksum asset named '{}' in release\",\n                checksum_asset_name\n            )\n        })?;","sourceCodeStart":143,"sourceCodeEnd":179,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/engine/playground-server/src/server.rs#L143-L179","documentation":"After parsing the release metadata, get_playground_dist accesses release[\"assets\"].as_array(). If the JSON has no \"assets\" key or it is not an array (e.g. GitHub returned an error object or a message payload), this error is thrown. It is a structural guard ensuring release metadata looks like a normal GitHub release response.","triggerScenarios":"The parsed JSON lacks an assets array — e.g. GitHub returned {\"message\": \"Not Found\"} with a 200 from a cache, a draft release with no assets, or an unexpected API response shape.","commonSituations":"Querying a draft release (assets not visible via the public API); an unexpected API payload version; a release published without uploading the playground binaries.","solutions":["Verify the GitHub release actually exists and is published (not draft) and has uploaded assets.","Check the API URL / release tag being requested points to the correct release.","Log the full release JSON to confirm the payload shape and update the parsing logic if GitHub changed the schema."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// preflight: confirm the release is published and has assets\nlet v: serde_json::Value = reqwest::get(&api_url).await?.json().await?;\nif v[\"assets\"].as_array().map_or(true, |a| a.is_empty()) {\n    eprintln!(\"Release has no assets (draft or empty?) — abort early\");\n}","typeGuard":"// check release payload shape\nfn has_assets(release: &serde_json::Value) -> bool {\n    release.get(\"assets\").and_then(|a| a.as_array()).map_or(false, |a| !a.is_empty())\n}","tryCatchPattern":"match get_playground_dist().await {\n    Err(e) if e.to_string().contains(\"No assets in release metadata\") => {\n        eprintln!(\"Draft or asset-less release; pin a published release\");\n    }\n    other => other?,\n}","preventionTips":["Only query published releases with uploaded assets","Pin to a known-good release tag","Validate release payload shape before parsing","Keep release CI uploading all required binaries"],"tags":["github-api","json","unexpected-response","rust"],"backgroundTag":"unexpected-api-response-shape","analyzedSha":"bd85ce9dee1463ff04d27efd20531013a4ff46c1","analyzedAt":"2026-09-12T03:38:25.718Z","contentChangedAt":"2026-09-12T03:38:25.718Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}