nikivdev/code · warning
failed to capture stderr
Error message
failed to capture stderr
What it means
Identical guard to the stdout case but for stderr: run_command_with_output pipes stderr and take()s it; if the handle is absent it throws 'failed to capture stderr'. With Stdio::piped() applied before spawn, this should never trigger.
Source
Thrown at src/storage.rs:398
fn resolve_jazz_tools_package_spec(raw: Option<&str>) -> String {
raw.map(str::trim)
.filter(|value| !value.is_empty())
.unwrap_or(DEFAULT_JAZZ_TOOLS_NPX_SPEC)
.to_string()
}
fn run_command_with_output(mut cmd: Command) -> Result<Output> {
let mut child = cmd.stdout(Stdio::piped()).stderr(Stdio::piped()).spawn()?;
let mut stdout = child
.stdout
.take()
.ok_or_else(|| anyhow::anyhow!("failed to capture stdout"))?;
let mut stderr = child
.stderr
.take()
.ok_or_else(|| anyhow::anyhow!("failed to capture stderr"))?;
let stdout_handle = thread::spawn(move || {
let mut buf = Vec::new();
let _ = stdout.read_to_end(&mut buf);
buf
});
let stderr_handle = thread::spawn(move || {
let mut buf = Vec::new();
let _ = stderr.read_to_end(&mut buf);
buf
});
let start = Instant::now();
let mut next_log = Duration::from_secs(10);
let status = loop {
if let Some(status) = child.try_wait()? {
break status;
}View on GitHub (pinned to a747e741ae)
Solutions
- Do not set stderr on the Command before passing it to run_command_with_output
- Keep the .stderr(Stdio::piped()) call immediately before spawn()
- If triggered, capture the error anyway by falling back to an empty buffer instead of failing
Example fix
// before
.take()
.ok_or_else(|| anyhow::anyhow!("failed to capture stderr"))?;
// after
.take().unwrap_or_default(); // or fail with context including the command name Defensive patterns
Strategy: try-catch
Try / catch
match run_command_with_output(cmd) {
Ok(out) => out,
Err(e) if e.to_string().contains("failed to capture stderr") => {
// stderr pipe missing; degrade gracefully by ignoring stderr
eprintln!("stderr unavailable: {}", e);
// proceed without stderr contents
}
Err(e) => return Err(e),
} Prevention
- Do not pre-set stderr on the Command at call sites
- Keep .stderr(Stdio::piped()) in the helper itself
- Prefer unwrap_or_default over hard error for non-critical streams
When it happens
Trigger: Calling run_command_with_output (via create_jazz_app_credentials) when the child's stderr pipe was not established — only possible if stdio configuration conflicts so child.stderr is None after spawn.
Common situations: Effectively unreachable in current code; would appear only after modifications that remove .stderr(Stdio::piped()) or pre-set stderr to inherit/null in the caller.
Related errors
- failed to capture stdout
- Lin.app is not running
- gen agent list failed
- gen agent list failed: {}
- Agent exited with status: {}
AI-assisted analysis of nikivdev/code@a747e741ae (2026-09-01).
Data as JSON: /api/errors/c0c4e141fa0b47d9.
Report an issue: GitHub.