{"record":{"id":"10e6e1cc7e5f84f8","repo":"BoundaryML/baml","slug":"run-completed-record-omitted-status","errorCode":null,"errorMessage":"run completed record omitted status","messagePattern":"run completed record omitted status","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"baml_language/crates/bex_events/src/value/record.rs","lineNumber":466,"sourceCode":"    }\n}\n\nimpl TryFrom<crate::value::pb::RunCompletedV1> for RunCompletedRecord {\n    type Error = io::Error;\n\n    fn try_from(value: crate::value::pb::RunCompletedV1) -> Result<Self, Self::Error> {\n        let status = match value.status() {\n            crate::value::pb::RunStatus::Pending => RunStatus::Pending,\n            crate::value::pb::RunStatus::Running => RunStatus::Running,\n            crate::value::pb::RunStatus::WaitingForInput => RunStatus::WaitingForInput,\n            crate::value::pb::RunStatus::WaitingForEnv => RunStatus::WaitingForEnv,\n            crate::value::pb::RunStatus::Cancelling => RunStatus::Cancelling,\n            crate::value::pb::RunStatus::Succeeded => RunStatus::Succeeded,\n            crate::value::pb::RunStatus::Failed => RunStatus::Failed,\n            crate::value::pb::RunStatus::Cancelled => RunStatus::Cancelled,\n            crate::value::pb::RunStatus::Panicked => RunStatus::Panicked,\n            crate::value::pb::RunStatus::Unspecified => {\n                return Err(io::Error::new(\n                    io::ErrorKind::InvalidData,\n                    \"run completed record omitted status\",\n                ));\n            }\n        };\n        Ok(Self {\n            status,\n            completed_at_ms: value.completed_at_ms,\n            renderer_hint: value.renderer_hint,\n            result_value_ref: value.result_value_ref.map(ValueRef::try_from).transpose()?,\n            error: value.error.map(run_error_from_proto).transpose()?,\n            cancellation: value.cancellation.map(cancellation_from_proto),\n        })\n    }\n}\n\nimpl From<&RunCompletedRecord> for crate::value::pb::RunCompletedV1 {\n    fn from(value: &RunCompletedRecord) -> Self {","sourceCodeStart":448,"sourceCodeEnd":484,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/baml_language/crates/bex_events/src/value/record.rs#L448-L484","documentation":"Thrown by TryFrom<pb::RunCompletedV1> for the run completed record when the run status proto enum is UNSPECIFIED. Every completed-run record must carry a concrete status (Succeeded/Failed/Cancelled/Panicked/Cancelling); UNSPECIFIED is the proto3 default meaning the producer never set the field, so conversion is rejected as InvalidData.","triggerScenarios":"RunCompletedRecord::try_from on a message where `status` was left at its default UNSPECIFIED — the emitter forgot set_status(), or the value was zeroed out during serialization/storage.","commonSituations":"Prost/proto3 default-value pitfalls (enum defaulting to 0/UNSPECIFIED when unset); a new completion path in the runner that reports status late; corrupted event records.","solutions":["Have the producer always set status (set_status(pb::RunStatus::Succeeded) etc.) on RunCompletedV1","Fix run-finish code paths so the terminal status is recorded before the event is emitted","Treat UNSPECIFIED at decode time as a malformed record and skip/log it","Add a producer-side assertion that status != Unspecified before serializing"],"exampleFix":"// before\nlet rec = RunCompletedRecord::try_from(msg)?; // status Unspecified\n// after\nmsg.status = pb::RunStatus::Failed as i32; // or set_status(...)\nlet rec = RunCompletedRecord::try_from(msg)?;","handlingStrategy":"validation","validationCode":"fn has_status(msg: &pb::RunCompletedV1) -> bool {\n    msg.status != pb::RunStatus::Unspecified as i32\n}","typeGuard":null,"tryCatchPattern":"match RunCompletedRecord::try_from(msg) {\n    Ok(rec) => rec,\n    Err(e) if e.kind() == io::ErrorKind::InvalidData => { log::warn!(\"run-completed missing status: {e}\"); return; },\n    Err(e) => return Err(e),\n}","preventionTips":["Always set an explicit terminal status before emitting run-completed","Remember proto3 enums default to 0/UNSPECIFIED — never rely on defaults for required fields","Add a compile-time or runtime exhaustive mapping test for RunStatus"],"tags":["protobuf","enum","deserialization"],"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-23T08:17:48.524Z"}