Hmbown/CodeWhale · error

private lane environment

Error message

private lane environment {} exceeds {} bytes

What it means

read_lane_environment first stats the private environment file and rejects it if the reported size exceeds MAX_ENVIRONMENT_BYTES, before reading. This is a pre-read sanity bound so a corrupt or hostile file cannot force an unbounded read into the proxy process.

Solutions

  1. Delete the oversized environment file and restart the lane so start() rewrites it within bounds.
  2. Verify no other process writes into the lane's private directory.
  3. Re-run start() to regenerate the file; ensure the producing side respects MAX_ENVIRONMENT_BYTES.
  4. If upgrading from an older version, clear stale lane state directories.
Defensive patterns

Strategy: try-catch

Validate before calling

let size = std::fs::metadata(&env_path).map(|m| m.len()).unwrap_or(0);
if size > MAX_ENVIRONMENT_BYTES { /* delete file and restart lane before reading */ }

Try / catch

match read_result { Err(e) if e.to_string().contains("exceeds") => { fs::remove_file(&env_path).ok(); restart_lane()?; } _ => ... }

Prevention

When it happens

Trigger: run_lane_log_proxy reading a lane environment file whose on-disk size (from fs::metadata) exceeds MAX_ENVIRONMENT_BYTES — typically a file written by an old/buggy writer or tampered with.

Common situations: Stale environment files left by an older version without size limits; external processes writing to the lane's private directory; corrupted state after a crashed writer.

Understand the failure class

Background: "File too large" / "file size exceeds limit" errors: why libraries cap file sizes and how to fix them — this error's family across 46 libraries.

Related errors


AI-assisted analysis of Hmbown/CodeWhale@73e0f67d83 (2026-09-22). Data as JSON: /api/errors/524c69f3c251a0ce. Report an issue: GitHub.

Appendix: source

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

            reader.consume(take);
            if ended_line {
                break;
            }
        }
        if line.is_empty() && reached_eof {
            return Ok(());
        }
        append_child_output(&log_path, stream, &line)?;
        if reached_eof {
            return Ok(());
        }
    }
}

fn read_lane_environment(path: &Path) -> Result<Vec<(String, String)>> {
    let metadata = fs::metadata(path).with_context(|| format!("stat {}", path.display()))?;
    if metadata.len() > MAX_ENVIRONMENT_BYTES {
        bail!(
            "private lane environment {} exceeds {} bytes",
            path.display(),
            MAX_ENVIRONMENT_BYTES
        );
    }
    let bytes = fs::read(path).with_context(|| format!("read {}", path.display()))?;
    if bytes.len() as u64 > MAX_ENVIRONMENT_BYTES {
        bail!(
            "private lane environment {} exceeds {} bytes",
            path.display(),
            MAX_ENVIRONMENT_BYTES
        );
    }
    let environment: Vec<(String, String)> =
        serde_json::from_slice(&bytes).with_context(|| format!("parse {}", path.display()))?;
    for (key, _) in &environment {
        if !valid_environment_key(key) {
            bail!("invalid lane environment key {key:?}");

View on GitHub (pinned to 73e0f67d83)