Hmbown/CodeWhale · error · anyhow::Error

selected Fleet ' ' has an incomplete operator route…

Error message

selected Fleet '{}' has an incomplete operator route; provider and model must both be non-empty

What it means

When applying a Fleet's operator route, the code requires the operator entry to carry both a provider id and a model id. If fleet.operator exists but either field is empty or whitespace, the route is considered incomplete and the TUI bails rather than guessing a default.

Solutions

  1. Edit the fleet config and fill in both operator.provider and operator.model
  2. Re-create the Fleet via the fleet command so both fields are populated
  3. Remove the incomplete operator entry if you don't want an operator route

Example fix

// before (fleet config)
operator = { provider = "", model = "gpt-5" }
// after
operator = { provider = "openai", model = "gpt-5" }
Defensive patterns

Strategy: validation

Validate before calling

let op = fleet.operator.as_ref().ok_or("fleet missing operator")?; if op.provider.trim().is_empty() || op.model.trim().is_empty() { return Err("operator route incomplete"); }

Prevention

When it happens

Trigger: Selecting/activating a Fleet whose configuration has operator: { provider: "", model: ... } or vice versa — typically a hand-edited or partially written fleet config.

Common situations: Manually editing the fleet TOML/JSON and leaving provider blank; an older fleet file predating a required field; a templated config where a substitution produced an empty string.

Understand the failure class

Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.

Related errors


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

Appendix: source

Thrown at crates/tui/src/lib.rs:8323

    })?
    else {
        return Ok(false);
    };
    let fleet_name = crate::safe_label::SafeLabel::phrase(&selected.name);
    let (fleet, _) = crate::fleet::store::load_fleet_at(&selected.path).map_err(|_| {
        anyhow!(
            "selected Fleet '{}' ({}) is invalid or unreadable; inspect /fleet and repair or clear the selection.",
            fleet_name,
            selected.scope.label()
        )
    })?;
    let Some(operator) = fleet.operator.as_ref() else {
        return Ok(false);
    };
    let provider_id = operator.provider.trim();
    let model_id = operator.model.trim();
    if provider_id.is_empty() || model_id.is_empty() {
        bail!(
            "selected Fleet '{}' has an incomplete operator route; provider and model must both be non-empty",
            fleet_name
        );
    }
    let safe_provider_id = crate::safe_label::SafeLabel::identifier(provider_id);
    let safe_model_id = crate::safe_label::SafeLabel::catalog_model(model_id);

    let identity = config
        .resolve_provider_pin_identity(provider_id)
        .map_err(|error| {
            anyhow!(
                "selected Fleet '{}' operator provider '{}' is unavailable: {}",
                fleet_name,
                safe_provider_id,
                crate::safe_label::safe_error_text(&error)
            )
        })?;
    let resolved =

View on GitHub (pinned to 73e0f67d83)