Hmbown/CodeWhale · error

lane log proxy requires a command

Error message

lane log proxy requires a command

What it means

run_lane_log_proxy wraps a child command in a lane log-proxy that captures frames, appends failures to a log, and writes an exit receipt. It requires a non-empty command; an empty argv has nothing to spawn, so it fails fast with exit code 127 (command not found convention) after writing the failure record and receipt.

Solutions

  1. Pass the command to run as the proxy argument, e.g. lane log proxy -- <cmd> <args...>
  2. Fix the calling script/config so the command variable is not empty
  3. Check the written exit receipt and proxy failure log to confirm the empty-command cause

Example fix

// before
lane log proxy --            # no command
// after
lane log proxy -- cargo test --workspace
Defensive patterns

Strategy: validation

Validate before calling

if command.is_empty() {
    anyhow::bail!("lane log proxy requires a command");
}

Type guard

fn has_command(args: &[String]) -> bool { !args.is_empty() && !args[0].trim().is_empty() }

Try / catch

let code = run_lane_log_proxy(args).unwrap_or_else(|e| { eprintln!("lane log proxy: {e}"); 127 });

Prevention

When it happens

Trigger: Invoking the lane log proxy (CLI/runtime) without providing the command argument, or with an empty vector/string argv.

Common situations: Missing CLI argument when wiring the proxy in scripts or CI, a config/environment file lost the command field, or shell quoting collapsed the command to nothing.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


AI-assisted analysis of Hmbown/CodeWhale@433685b202 (2026-09-15). Data as JSON: /api/errors/dd55350f4874bcd9. Report an issue: GitHub.

Appendix: source

Thrown at crates/lane/src/runtime.rs:451

/// hidden CLI should propagate to tmux.
pub fn run_lane_log_proxy(spec: LaneLogProxySpec) -> Result<i32> {
    let LaneLogProxySpec {
        command,
        log_path,
        receipt_path,
        receipt_tmp_path,
        environment_path,
        lane_id,
    } = spec;

    let fail = |error: anyhow::Error, exit_code: i32| -> Result<i32> {
        append_proxy_failure(&log_path, &lane_id, &error)?;
        write_lane_exit_receipt(&receipt_path, &receipt_tmp_path, &lane_id, exit_code)?;
        Ok(exit_code)
    };

    if command.is_empty() {
        return fail(anyhow::anyhow!("lane log proxy requires a command"), 127);
    }

    let environment = if let Some(path) = environment_path.as_deref() {
        let loaded = read_lane_environment(path);
        let removed = remove_file_if_present(path);
        match (loaded, removed) {
            (Ok(environment), Ok(())) => environment,
            (Err(error), Ok(())) => return fail(error, LANE_PROXY_FAILURE_EXIT_CODE),
            (Ok(_), Err(error)) | (Err(_), Err(error)) => return Err(error),
        }
    } else {
        Vec::new()
    };

    let mut child_command = Command::new(&command[0]);
    child_command.args(&command[1..]);
    child_command.envs(environment);
    child_command.stdout(Stdio::piped()).stderr(Stdio::piped());

View on GitHub (pinned to 433685b202)