{"record":{"id":"d8af85a141f44bb3","repo":"Hmbown/CodeWhale","slug":"selected-fleet-has-an-incomplete-operator-route-provider-and","errorCode":null,"errorMessage":"selected Fleet '{}' has an incomplete operator route; provider and model must both be non-empty","messagePattern":"selected Fleet '(.+?)' has an incomplete operator route; provider and model must both be non-empty","errorType":"error_code","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/tui/src/lib.rs","lineNumber":8323,"sourceCode":"    })?\n    else {\n        return Ok(false);\n    };\n    let fleet_name = crate::safe_label::SafeLabel::phrase(&selected.name);\n    let (fleet, _) = crate::fleet::store::load_fleet_at(&selected.path).map_err(|_| {\n        anyhow!(\n            \"selected Fleet '{}' ({}) is invalid or unreadable; inspect /fleet and repair or clear the selection.\",\n            fleet_name,\n            selected.scope.label()\n        )\n    })?;\n    let Some(operator) = fleet.operator.as_ref() else {\n        return Ok(false);\n    };\n    let provider_id = operator.provider.trim();\n    let model_id = operator.model.trim();\n    if provider_id.is_empty() || model_id.is_empty() {\n        bail!(\n            \"selected Fleet '{}' has an incomplete operator route; provider and model must both be non-empty\",\n            fleet_name\n        );\n    }\n    let safe_provider_id = crate::safe_label::SafeLabel::identifier(provider_id);\n    let safe_model_id = crate::safe_label::SafeLabel::catalog_model(model_id);\n\n    let identity = config\n        .resolve_provider_pin_identity(provider_id)\n        .map_err(|error| {\n            anyhow!(\n                \"selected Fleet '{}' operator provider '{}' is unavailable: {}\",\n                fleet_name,\n                safe_provider_id,\n                crate::safe_label::safe_error_text(&error)\n            )\n        })?;\n    let resolved =","sourceCodeStart":8305,"sourceCodeEnd":8341,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/73e0f67d83c59909b571efdfc88c4bc28c309cb1/crates/tui/src/lib.rs#L8305-L8341","documentation":"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.","triggerScenarios":"Selecting/activating a Fleet whose configuration has operator: { provider: \"\", model: ... } or vice versa — typically a hand-edited or partially written fleet config.","commonSituations":"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.","solutions":["Edit the fleet config and fill in both operator.provider and operator.model","Re-create the Fleet via the fleet command so both fields are populated","Remove the incomplete operator entry if you don't want an operator route"],"exampleFix":"// before (fleet config)\noperator = { provider = \"\", model = \"gpt-5\" }\n// after\noperator = { provider = \"openai\", model = \"gpt-5\" }","handlingStrategy":"validation","validationCode":"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\"); }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Validate fleet files after hand edits","Never leave provider/model blank in templates — fail or fill at generation time"],"tags":["config","fleet","validation"],"backgroundTag":"missing-required-config-field","analyzedSha":"73e0f67d83c59909b571efdfc88c4bc28c309cb1","analyzedAt":"2026-09-22T01:30:00.501Z","contentChangedAt":"2026-09-22T01:30:00.501Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}