{"record":{"id":"1d3a9570d4297946","repo":"Hmbown/CodeWhale","slug":"selected-fleet-operator-provider-is-unavailable","errorCode":null,"errorMessage":"selected Fleet '{}' operator provider '{}' is unavailable: {}","messagePattern":"selected Fleet '(.+?)' operator provider '(.+?)' is unavailable: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/tui/src/lib.rs","lineNumber":8334,"sourceCode":"    })?;\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 =\n        crate::route_runtime::resolve_runtime_route_for_identity(config, &identity, Some(model_id))\n            .map_err(|error| {\n                anyhow!(\n                    \"selected Fleet '{}' operator route {}/{} is invalid: {}\",\n                    fleet_name,\n                    safe_provider_id,\n                    safe_model_id,\n                    crate::safe_label::safe_error_text(&error)\n                )\n            })?;\n    let mut selected_config = *resolved.config;","sourceCodeStart":8316,"sourceCodeEnd":8352,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/73e0f67d83c59909b571efdfc88c4bc28c309cb1/crates/tui/src/lib.rs#L8316-L8352","documentation":"Thrown when the selected Fleet's operator route names a provider that `resolve_provider_pin_identity` cannot resolve in the current configuration. The fleet expects a provider that is not configured (no matching provider entry/credentials), so the operator route cannot be pinned. Provider and model ids are sanitized via `SafeLabel` before inclusion in the message.","triggerScenarios":"A turn starts with a selected Fleet whose `operator.provider` id has no matching provider in the active config, or whose identity resolution fails (e.g. missing API key entry for that provider).","commonSituations":"Renaming or removing a provider in config while a fleet still pins the old id; switching machines/config profiles without the provider's credentials; a provider id typo in the fleet definition.","solutions":["Add or restore the named provider (and its credentials) to the active config.","Edit the fleet's operator route to reference an existing provider id.","Run /fleet and re-select a fleet whose operator provider matches your config.","Check for provider-id typos or renamed ids after a config migration."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// verify the operator provider exists in config before selecting the fleet\nlet provider_ok = config.providers.iter().any(|p| p.id == fleet.operator.provider);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep provider ids and credentials present in every config profile you use.","Update fleet definitions whenever you rename or remove a provider.","Prefer provider ids from the config catalog rather than free-typed strings."],"tags":["fleet","provider","config","route"],"backgroundTag":"missing-credentials","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"}