{"record":{"id":"523bbb4e3c1cec02","repo":"BoundaryML/baml","slug":"sdk-language-has-an-empty-registry-package-or-version","errorCode":null,"errorMessage":"sdk {language} has an empty registry, package, or version","messagePattern":"sdk (.+?) has an empty registry, package, or version","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"baml_language/crates/baml_release/src/manifest.rs","lineNumber":162,"sourceCode":"        anyhow::bail!(\"manifest for {version} has target set {actual:?}; expected {expected:?}\");\n    }\n    for (target, artifact) in artifacts {\n        validate_artifact(target, artifact)?;\n    }\n    Ok(())\n}\n\nfn validate_artifact(name: &str, artifact: &Artifact) -> anyhow::Result<()> {\n    if !artifact.url.starts_with(\"https://\") {\n        anyhow::bail!(\"artifact {name} URL must use HTTPS\");\n    }\n    validate_sha256(&artifact.sha256)?;\n    Ok(())\n}\n\nfn validate_sdk(language: &str, package: &SdkPackage) -> anyhow::Result<()> {\n    if package.registry.is_empty() || package.package.is_empty() || package.version.is_empty() {\n        anyhow::bail!(\"sdk {language} has an empty registry, package, or version\");\n    }\n    if let Some(digest) = &package.verified_package_sha256 {\n        validate_sha256(digest)\n            .map_err(|error| anyhow::anyhow!(\"sdk {language} package digest: {error}\"))?;\n    }\n    if language == \"csharp\" {\n        if package.registry != \"nuget\" || package.package != \"baml-bridge\" {\n            anyhow::bail!(\"sdk csharp must identify nuget/baml-bridge\");\n        }\n        if package.verified_package_sha256.is_none() {\n            anyhow::bail!(\"sdk csharp must record the verified NuGet package digest\");\n        }\n    }\n    if language == \"swift\" {\n        if package.registry != \"swiftpm\" || package.package != \"BoundaryML/baml-swift\" {\n            anyhow::bail!(\"sdk swift must identify swiftpm/BoundaryML/baml-swift\");\n        }\n        if package.verified_package_sha256.is_none() {","sourceCodeStart":144,"sourceCodeEnd":180,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/baml_language/crates/baml_release/src/manifest.rs#L144-L180","documentation":"validate_sdk checks that every SDK entry in the manifest has non-empty registry, package, and version fields. Any of these being empty means the SDK metadata is incomplete and the manifest is invalid.","triggerScenarios":"validate() encounters an SdkPackage where registry, package, or version is an empty string — typically a partially filled-in manifest entry for a language.","commonSituations":"Scaffolding a new SDK entry and forgetting the version; deleting a field during a rename; a template/generator emitting empty placeholders.","solutions":["Fill in the missing registry, package, and/or version fields for that language's SdkPackage","Verify against the actual published package (registry name, package id, released version)","Re-run validate() after completing the entry"],"exampleFix":"// before\n[sdk.python]\nregistry = \"pypi\"\npackage = \"baml-py\"\nversion = \"\"\n\n// after\n[sdk.python]\nregistry = \"pypi\"\npackage = \"baml-py\"\nversion = \"0.11.0\"","handlingStrategy":"validation","validationCode":"fn sdk_entry_complete(s: &SdkPackage) -> bool {\n    !s.registry.is_empty() && !s.package.is_empty() && !s.version.is_empty()\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Fill every field of a new SdkPackage before committing it","Use serde deny_unknown_fields/required fields so empty strings fail deserialization-time checks","Review manifest diffs for removed fields"],"tags":["manifest","validation","sdk"],"backgroundTag":"empty-required-field","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"}