{"record":{"id":"b9440440e836a398","repo":"openai/codex","slug":"terminal-operation-operation-id-disappeared-duri","errorCode":null,"errorMessage":"terminal operation {operation_id} disappeared during observation linking","messagePattern":"terminal operation (.+?) disappeared during observation linking","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"codex-rs/rollout-trace/src/reducer/tool/terminal.rs","lineNumber":297,"sourceCode":"    /// and output item ids let viewers jump between transcript and terminal timelines.\n    pub(in crate::reducer) fn sync_terminal_model_observation(\n        &mut self,\n        tool_call_id: &str,\n    ) -> Result<()> {\n        let Some(tool_call) = self.rollout.tool_calls.get(tool_call_id) else {\n            bail!(\"tool call {tool_call_id} disappeared during terminal observation linking\");\n        };\n        let Some(operation_id) = tool_call.terminal_operation_id.clone() else {\n            return Ok(());\n        };\n        let call_item_ids = tool_call.model_visible_call_item_ids.clone();\n        let output_item_ids = tool_call.model_visible_output_item_ids.clone();\n        if call_item_ids.is_empty() && output_item_ids.is_empty() {\n            return Ok(());\n        }\n\n        let Some(operation) = self.rollout.terminal_operations.get_mut(&operation_id) else {\n            bail!(\"terminal operation {operation_id} disappeared during observation linking\");\n        };\n        // A terminal result and a model-visible tool output are intentionally\n        // separate: the former is what the runtime saw, the latter is what later\n        // inference payloads prove was shown back to the model.\n        if let Some(observation) = operation\n            .model_observations\n            .iter_mut()\n            .find(|observation| observation.source == TerminalObservationSource::DirectToolCall)\n        {\n            observation.call_item_ids = call_item_ids;\n            observation.output_item_ids = output_item_ids;\n        } else {\n            operation.model_observations.push(TerminalModelObservation {\n                call_item_ids,\n                output_item_ids,\n                source: TerminalObservationSource::DirectToolCall,\n            });\n        }","sourceCodeStart":279,"sourceCodeEnd":315,"githubUrl":"https://github.com/openai/codex/blob/339751715c64496cb86246bfb3935f40e309dd3d/codex-rs/rollout-trace/src/reducer/tool/terminal.rs#L279-L315","documentation":"Error \"terminal operation {operation_id} disappeared during observation linking\" thrown in openai/codex.","triggerScenarios":"Thrown at codex-rs/rollout-trace/src/reducer/tool/terminal.rs:297 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"339751715c64496cb86246bfb3935f40e309dd3d","analyzedAt":"2026-08-25T05:35:09.876Z","schemaVersion":2},"datasetVersion":"2026-08-25T06:17:31.827Z"}