{"record":{"id":"83478a80ab4ebe93","repo":"zeroclaw-labs/zeroclaw","slug":"unsupported-proxy-service-selector-selector-u","errorCode":null,"errorMessage":"Unsupported proxy service selector '{selector}'. Use tool `proxy_config` action `list_services` for valid values","messagePattern":"Unsupported proxy service selector '(.+?)'\\. Use tool `proxy_config` action `list_services` for valid values","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-config/src/schema.rs","lineNumber":9862,"sourceCode":"\n    pub fn normalized_no_proxy(&self) -> Vec<String> {\n        normalize_no_proxy_list(self.no_proxy.clone())\n    }\n\n    pub fn validate(&self) -> Result<()> {\n        for (field, value) in [\n            (\"http_proxy\", self.http_proxy.as_deref()),\n            (\"https_proxy\", self.https_proxy.as_deref()),\n            (\"all_proxy\", self.all_proxy.as_deref()),\n        ] {\n            if let Some(url) = normalize_proxy_url_option(value) {\n                validate_proxy_url(field, &url)?;\n            }\n        }\n\n        for selector in self.normalized_services() {\n            if !is_supported_proxy_service_selector(&selector) {\n                anyhow::bail!(\n                    \"Unsupported proxy service selector '{selector}'. Use tool `proxy_config` action `list_services` for valid values\"\n                );\n            }\n        }\n\n        if self.enabled && !self.has_any_proxy_url() {\n            anyhow::bail!(\n                \"Proxy is enabled but no proxy URL is configured. Set at least one of http_proxy, https_proxy, or all_proxy\"\n            );\n        }\n\n        if self.enabled\n            && self.scope == ProxyScope::Services\n            && self.normalized_services().is_empty()\n        {\n            anyhow::bail!(\n                \"proxy.scope='services' requires a non-empty proxy.services list when proxy is enabled\"\n            );","sourceCodeStart":9844,"sourceCodeEnd":9880,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-config/src/schema.rs#L9844-L9880","documentation":"ProxyConfig::validate checks every entry of proxy.services against the known service keys and selector families, case-insensitively. Valid values are concrete keys like tool.browser, channel.slack, or model_provider.openai, or the wildcard families model_provider.*, channel.*, tool.*, memory.*, tunnel.*, transcription.*. Anything else is refused with a pointer at the proxy_config tool's list_services action.","triggerScenarios":"proxy.services containing \"web\", \"browser\" (missing the tool. prefix), \"storage.*\" (a family that does not exist), or any other string not in the supported keys/selectors lists, whenever proxy config validation runs.","commonSituations":"Guessing service names instead of listing them; typos in wildcard families; configs written against a version whose service set differed; dropping the family prefix when shortening entries.","solutions":["Query the authoritative list: the proxy_config tool's list_services action, or ProxyConfig::supported_service_keys() / supported_service_selectors() from code.","Prefix each service with its family: browser → tool.browser, slack → channel.slack.","Use a family wildcard like tool.* when you mean all services in that family.","Fix typos and re-validate the config before enabling."],"exampleFix":"# before\n[proxy]\nservices = [\"browser\", \"slack\"]\n\n# after\n[proxy]\nservices = [\"tool.browser\", \"channel.slack\"]","handlingStrategy":"type-guard","validationCode":"for s in &cfg.proxy.services {\n    if !is_supported_proxy_selector(s) {\n        return Err(anyhow::anyhow!(\"invalid proxy service selector {s:?}\"));\n    }\n}","typeGuard":"fn is_supported_proxy_selector(selector: &str) -> bool {\n    let keys = zeroclaw_config::schema::ProxyConfig::supported_service_keys();\n    let selectors = zeroclaw_config::schema::ProxyConfig::supported_service_selectors();\n    keys.iter().chain(selectors.iter())\n        .any(|k| k.eq_ignore_ascii_case(selector))\n}","tryCatchPattern":"match cfg.proxy.validate() {\n    Err(e) if e.to_string().contains(\"Unsupported proxy service selector\") => {\n        // call proxy_config list_services, replace the entry, re-validate\n    }\n    other => other,\n}","preventionTips":["Always derive selector lists from proxy_config list_services or the supported_service_* helpers instead of hand-writing them.","Namespace entries with their family prefix (tool., channel., model_provider., ...).","Re-validate proxy blocks after upgrading zeroclaw — the service set can change."],"tags":["proxy","config","validation","services"],"backgroundTag":"proxy-service-selector-invalid","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}