{"record":{"id":"fc651d36ae9146d1","repo":"BoundaryML/baml","slug":"value-metadata-omitted-availability","errorCode":null,"errorMessage":"value metadata omitted availability","messagePattern":"value metadata omitted availability","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"baml_language/crates/bex_events/src/value/record.rs","lineNumber":168,"sourceCode":"\n    fn try_from(metadata: crate::value::pb::ValueMetadataV1) -> Result<Self, Self::Error> {\n        let codec = match metadata.codec() {\n            crate::value::pb::ValueCodec::BamlOutboundValue => ValueCodec::BamlOutboundValue,\n            crate::value::pb::ValueCodec::Unspecified => {\n                return Err(io::Error::new(\n                    io::ErrorKind::InvalidData,\n                    \"value metadata omitted codec\",\n                ));\n            }\n        };\n        let availability = match metadata.availability() {\n            crate::value::pb::ValueAvailability::Pending => ValueAvailability::Pending,\n            crate::value::pb::ValueAvailability::Available => ValueAvailability::Available,\n            crate::value::pb::ValueAvailability::Missing => ValueAvailability::Missing,\n            crate::value::pb::ValueAvailability::Omitted => ValueAvailability::Omitted,\n            crate::value::pb::ValueAvailability::Lost => ValueAvailability::Lost,\n            crate::value::pb::ValueAvailability::Unspecified => {\n                return Err(io::Error::new(\n                    io::ErrorKind::InvalidData,\n                    \"value metadata omitted availability\",\n                ));\n            }\n        };\n        Ok(Self {\n            id: metadata.id,\n            codec,\n            availability,\n            original_size_bytes: metadata\n                .original_size_bytes\n                .map(usize::try_from)\n                .transpose()\n                .map_err(|_| {\n                    io::Error::new(\n                        io::ErrorKind::InvalidData,\n                        \"original size does not fit usize\",\n                    )","sourceCodeStart":150,"sourceCodeEnd":186,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/baml_language/crates/bex_events/src/value/record.rs#L150-L186","documentation":"ValueMetadataV1.protobuf carried availability == Unspecified, i.e. the writer did not record whether the value payload is Pending/Available/Missing/Omitted/Lost. The TryFrom conversion for the internal record requires an explicit availability to correctly interpret payload presence, so Unspecified yields io::ErrorKind::InvalidData.","triggerScenarios":"Decoding a ValueMetadataV1 where the availability field was never set by the producer, or was reset when the message was rebuilt/copied by intermediate code.","commonSituations":"Older writers predating the availability field, hand-built protos in tests/tools missing the setter, or schema migrations that defaulted new fields to Unspecified.","solutions":["Fix the producer to always set an explicit availability before serializing","When constructing pb::ValueMetadataV1 manually, set availability (e.g. Available) explicitly","Apply a backward-compat default (map Unspecified to Missing/Available per your data contract) at decode time","Check writer/consumer version skew and add a migration step for legacy streams"],"exampleFix":"// before\nlet md = pb::ValueMetadataV1 { codec: ..., ..Default::default() };\n// after\nlet md = pb::ValueMetadataV1 { codec: ..., availability: pb::ValueAvailability::Available as i32, ..Default::default() };","handlingStrategy":"validation","validationCode":"if md.availability() == pb::ValueAvailability::Unspecified { return Err(\"availability unset\"); }","typeGuard":"fn has_availability(md: &pb::ValueMetadataV1) -> bool { md.availability() != pb::ValueAvailability::Unspecified }","tryCatchPattern":"ValueRecord::try_from(md).map_err(|e| if e.to_string().contains(\"availability\") { supply_default_availability(md) } else { e })","preventionTips":["Set availability explicitly on every ValueMetadataV1","Test that enum fields survive proto rebuilds/copies","Document required enum fields in the schema contract"],"tags":["rust","protobuf","deserialization","enum"],"backgroundTag":"invalid-enum-value","analyzedSha":"bd85ce9dee1463ff04d27efd20531013a4ff46c1","analyzedAt":"2026-09-12T03:38:25.718Z","contentChangedAt":"2026-09-12T03:38:25.718Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}