{"record":{"id":"999234a40af42222","repo":"zeroclaw-labs/zeroclaw","slug":"unknown-git-channel-provider-other-supported","errorCode":null,"errorMessage":"unknown git channel provider `{other}` (supported: github, gitea, forgejo)","messagePattern":"unknown git channel provider `(.+?)` \\(supported: github, gitea, forgejo\\)","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-channels/src/git/channel.rs","lineNumber":135,"sourceCode":"                         (or `https://gitea.com/api/v1` for the public Gitea service). \\\n                         No default host is assumed because API requests carry the \\\n                         access token\"\n                    );\n                };\n                Ok(Box::new(super::providers::gitea::GiteaProvider::new(\n                    api_base_url.to_string(),\n                    cfg.access_token.clone(),\n                    cfg.proxy_url.clone(),\n                )))\n            }\n            #[cfg(not(feature = \"provider-gitea\"))]\n            {\n                anyhow::bail!(\n                    \"git channel provider `{provider}` requires the `provider-gitea` feature\"\n                );\n            }\n        }\n        other => anyhow::bail!(\n            \"unknown git channel provider `{other}` (supported: github, gitea, forgejo)\"\n        ),\n    }\n}\n\npub struct GitChannel {\n    cfg: GitConfig,\n    /// The alias key under `[channels.git.<alias>]` this handle is bound\n    /// to. Used to scope peer-group lookups and session keys.\n    alias: String,\n    /// Resolves inbound external peers from canonical state at message-time.\n    /// No cache (see AGENTS.md \"ABSOLUTE RULE — SINGLE SOURCE OF TRUTH\").\n    peer_resolver: Arc<dyn Fn() -> Vec<String> + Send + Sync>,\n    /// The forge driver. Owns its own auth/token/identity caches.\n    provider: Box<dyn GitProvider>,\n    /// Bot identity (mention handle + bot login) resolved from the\n    /// provider, cached for the sync `self_handle`/`self_addressed_mention`\n    /// accessors. The provider remains the source of truth; this is a","sourceCodeStart":117,"sourceCodeEnd":153,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-channels/src/git/channel.rs#L117-L153","documentation":"The provider value in channels.git.<alias>.provider matched none of github, gitea, forgejo (the match fell through to the `other` arm), so build_provider rejects the channel at construction with the supported list inline. Values are case-sensitive.","triggerScenarios":"Typing the provider: \"gitlab\", \"gitee\", \"GitHub\" (wrong case), or an empty string.","commonSituations":"Trying to point the git channel at GitLab (unsupported); case mismatches; trailing whitespace in config values.","solutions":["Use exactly one of: github, gitea, forgejo (lowercase)","GitLab is not supported — use one of the supported providers or request support upstream","Trim stray whitespace and fix casing in the config value"],"exampleFix":"# before\n[channels.git.mine]\nprovider = \"GitLab\"\n\n# after\n[channels.git.mine]\nprovider = \"forgejo\" # one of github | gitea | forgejo","handlingStrategy":"type-guard","validationCode":"if !known_git_provider(&cfg.provider) {\n    anyhow::bail!(\n        \"unsupported git provider '{}' (supported: github, gitea, forgejo)\",\n        cfg.provider\n    );\n}","typeGuard":"// Rust — accept only known providers before building the channel\nfn known_git_provider(value: &str) -> bool {\n    matches!(value.trim(), \"github\" | \"gitea\" | \"forgejo\")\n}","tryCatchPattern":null,"preventionTips":["Validate provider names in config linting before deploy","Provider values are case-sensitive and lowercase"],"tags":["git","provider","configuration","validation"],"backgroundTag":"unsupported-provider","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}