{"record":{"id":"19f83b55d3a8ed2a","repo":"Hmbown/CodeWhale","slug":"the-active-route-has-no-exact-provider-config-identity","errorCode":null,"errorMessage":"The active route has no exact provider config identity.","messagePattern":"The active route has no exact provider config identity\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/tui/src/tui/app.rs","lineNumber":6277,"sourceCode":"\n    #[must_use]\n    pub(crate) fn provider_id_for_persistence(&self) -> Option<&str> {\n        self.provider_exact_id.as_deref()\n    }\n\n    /// Config selectors retain the exact saved slot, including legacy hosted\n    /// Ollama's `ollama` slot. Session receipts keep their canonical identity.\n    pub(crate) fn provider_selector_for_config_persistence(&self) -> anyhow::Result<&str> {\n        self.provider_id_for_persistence()\n            .or_else(|| {\n                (self.api_provider == ApiProvider::Custom\n                    && self\n                        .provider_identity\n                        .eq_ignore_ascii_case(ApiProvider::Custom.as_str()))\n                .then(|| self.provider_identity_for_persistence())\n            })\n            .ok_or_else(|| {\n                anyhow::anyhow!(\"The active route has no exact provider config identity.\")\n            })\n    }\n\n    pub(crate) fn set_provider_identity(\n        &mut self,\n        provider: ApiProvider,\n        identity: impl Into<String>,\n    ) {\n        let identity = identity.into();\n        self.api_provider = provider;\n        self.provider_exact_id = (!(provider == ApiProvider::Custom\n            && identity.eq_ignore_ascii_case(ApiProvider::Custom.as_str())))\n        .then(|| identity.clone());\n        self.provider_identity = identity;\n    }\n\n    pub(crate) fn set_provider_identity_record(\n        &mut self,","sourceCodeStart":6259,"sourceCodeEnd":6295,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/73e0f67d83c59909b571efdfc88c4bc28c309cb1/crates/tui/src/tui/app.rs#L6259-L6295","documentation":"When persisting the active route, the app needs an exact provider config identity string. `provider_identity_for_persistence()` is only produced when the active provider is Custom (case-insensitive match on the stored identity); for any other provider, or when no identity is stored, the Option is None and this error is returned.","triggerScenarios":"Calling the route-persistence accessor while the active provider is not `ApiProvider::Custom`, or it is Custom but `provider_identity` is empty/unset so the `.then(...)` yields None.","commonSituations":"Trying to persist a startup default while on a built-in provider (Anthropic/OpenAI) that has no custom identity; a custom provider selected but its identity field never filled in; state restored from a session where identity was lost.","solutions":["Select/enter the custom provider's identity before persisting the route","Only call route persistence for Custom providers with a set identity","Provide the provider identity via set_provider_identity before persisting"],"exampleFix":"// before\napp.set_provider(ApiProvider::Anthropic);\napp.persist_route();  // errors: no custom identity\n// after\napp.set_provider(ApiProvider::Custom);\napp.set_provider_identity(ApiProvider::Custom, \"my-gateway\");\napp.persist_route();","handlingStrategy":"validation","validationCode":"if (app.provider !== 'custom' || !app.providerIdentity) {\n  throw new Error('route persistence requires a custom provider with an identity');\n}","typeGuard":"const canPersistRoute = (app) => String(app.providerIdentity ?? '').trim() !== '' && app.provider.toLowerCase() === 'custom';","tryCatchPattern":null,"preventionTips":["Set provider identity before attempting route persistence","Only expose persist-route UI for custom providers with identity filled","Persist identity in session state so restore paths keep it"],"tags":["config","provider","route-persistence"],"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"}