{"record":{"id":"777add654a1f32f1","repo":"GitoxideLabs/gitoxide","slug":"configured","errorCode":null,"errorMessage":"configured","messagePattern":"configured","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"gix-transport/src/client/blocking_io/file.rs","lineNumber":312,"sourceCode":"                let mut cmd = into_std_command(cmd);\n                gix_features::trace::debug!(command = ?cmd, \"gix_transport::SpawnProcessOnDemand (fallback)\");\n                cmd.spawn().map_err(|err| client::Error::InvokeProgram {\n                    source: err,\n                    command: cmd_name,\n                })?\n            }\n            Err(err) => {\n                return Err(client::Error::InvokeProgram {\n                    source: err,\n                    command: cmd_name,\n                });\n            }\n        };\n        let stdout: Box<dyn std::io::Read + Send> = match ssh_kind {\n            Some(ssh_kind) => Box::new(supervise_stderr(\n                ssh_kind,\n                child.stderr.take().expect(\"configured beforehand\"),\n                child.stdout.take().expect(\"configured\"),\n            )),\n            None => Box::new(child.stdout.take().expect(\"stdout configured\")),\n        };\n        self.connection = Some(Connection::new_for_spawned_process(\n            stdout,\n            child.stdin.take().expect(\"stdin configured\"),\n            self.desired_version,\n            self.path.clone(),\n            self.trace,\n        ));\n        self.child = Some(child);\n        self.connection\n            .as_mut()\n            .expect(\"connection to be there right after setting it\")\n            .handshake(service, extra_parameters)\n    }\n\n    fn request(","sourceCodeStart":294,"sourceCodeEnd":330,"githubUrl":"https://github.com/GitoxideLabs/gitoxide/blob/e73179060badf27222d790981fac3f84c1830a7e/gix-transport/src/client/blocking_io/file.rs#L294-L330","documentation":"Panic from `child.stdout.take().expect(\"configured\")` (and the sibling `.expect(\"stdout configured\")` branch) in the blocking file transport's `handshake`. Like the stderr case, it asserts that piped stdout was configured on the spawned child process; a `None` means the spawn setup is broken. This is unreachable in correct code and indicates an internal invariant violation.","triggerScenarios":"Any handshake (SSH or plain spawned `git upload-pack`) where the child was spawned without `Stdio::piped()` on stdout.","commonSituations":"Forked builds or refactoring regressions in gix-transport's spawn code; local patches to process creation.","solutions":["Configure `.stdout(Stdio::piped())` before spawning the child process.","Upgrade gix-transport if stock code panics here.","Audit any local patches to the transport spawn logic for dropped pipe configuration."],"exampleFix":"// before\nlet mut cmd = Command::new(prog);\nlet child = cmd.spawn()?;\n// after\nlet child = cmd.stdout(Stdio::piped()).stderr(Stdio::piped()).stdin(Stdio::piped()).spawn()?;","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"std::panic::catch_unwind(AssertUnwindSafe(|| handshake(...)))\n    .map_err(|_| anyhow::anyhow!(\"handshake panicked: child stdout not piped\"))?","preventionTips":["Configure Stdio::piped() for stdout before spawning transport child processes","Audit local patches to the spawn code for dropped pipe setup","Exercise local-subprocess transport (file protocol) in tests"],"tags":["rust","panic","internal-invariant","process-spawn"],"backgroundTag":"internal-invariant-violation","analyzedSha":"e73179060badf27222d790981fac3f84c1830a7e","analyzedAt":"2026-09-08T11:26:50.865Z","contentChangedAt":"2026-09-08T11:26:50.865Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}