{"record":{"id":"7b6f437e40cd23b7","repo":"openai/codex","slug":"non-spawn-interaction-edge-carried-a-spawn-fall","errorCode":null,"errorMessage":"non-spawn interaction edge {} carried a spawn fallback target","messagePattern":"non-spawn interaction edge (.+?) carried a spawn fallback target","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"codex-rs/rollout-trace/src/reducer/tool/agents.rs","lineNumber":600,"sourceCode":"                &mut existing.carried_raw_payload_ids,\n                pending.carried_raw_payload_ids,\n            );\n            return Ok(());\n        }\n\n        self.pending_agent_interaction_edges.push(pending);\n        Ok(())\n    }\n\n    /// Materializes unresolved spawn edges that have a valid child-thread fallback target.\n    pub(in crate::reducer) fn resolve_pending_spawn_edge_fallbacks(&mut self) -> Result<()> {\n        let pending_edges = std::mem::take(&mut self.pending_agent_interaction_edges);\n        for pending in pending_edges {\n            let Some(child_thread_id) = pending.unresolved_spawn_thread_id else {\n                continue;\n            };\n            if pending.kind != InteractionEdgeKind::SpawnAgent {\n                bail!(\n                    \"non-spawn interaction edge {} carried a spawn fallback target\",\n                    pending.edge_id\n                );\n            }\n            if !self.rollout.threads.contains_key(&child_thread_id) {\n                continue;\n            }\n\n            // Spawn normally resolves to the child task message because that is\n            // where the delegated work first becomes model-visible. A child can\n            // fail before that transcript item exists, but the spawned thread is\n            // still real and the spawning tool still created it. Preserve that\n            // relationship with the thread fallback instead of dropping the edge.\n            self.upsert_interaction_edge(InteractionEdge {\n                edge_id: pending.edge_id,\n                kind: pending.kind,\n                source: pending.source,\n                target: TraceAnchor::Thread {","sourceCodeStart":582,"sourceCodeEnd":618,"githubUrl":"https://github.com/openai/codex/blob/339751715c64496cb86246bfb3935f40e309dd3d/codex-rs/rollout-trace/src/reducer/tool/agents.rs#L582-L618","documentation":"Error \"non-spawn interaction edge {} carried a spawn fallback target\" thrown in openai/codex.","triggerScenarios":"Thrown at codex-rs/rollout-trace/src/reducer/tool/agents.rs:600 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"}