{"record":{"id":"ae58e29c1201c012","repo":"zeroclaw-labs/zeroclaw","slug":"channel-type-channel-type-does-not-support-ide","errorCode":null,"errorMessage":"Channel type `{channel_type}` does not support identity binding (supported: telegram, wechat, line).","messagePattern":"Channel type `(.+?)` does not support identity binding \\(supported: telegram, wechat, line\\)\\.","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-channels/src/orchestrator/mod.rs","lineNumber":8658,"sourceCode":"///\n/// Returns `Ok(true)` when the identity was newly added, `Ok(false)` when it\n/// was already present. Pure config mutation — no disk write, no daemon\n/// restart — so it is the single core shared by the CLI\n/// (`bind_telegram_identity`) and the gateway bind endpoint. The `channel`\n/// field is the dotted `<type>.<alias>` ref so authorization stays scoped to\n/// the bound alias; a bare type would broaden the peer across every alias of\n/// that type.\npub fn bind_channel_identity_into(\n    config: &mut Config,\n    channel_type: &str,\n    alias: &str,\n    identity: &str,\n) -> Result<bool> {\n    use zeroclaw_config::multi_agent::{PeerGroupConfig, PeerUsername};\n    use zeroclaw_config::providers::ChannelRef;\n\n    let Some(normalize) = channel_identity_normalizer(channel_type) else {\n        anyhow::bail!(\n            \"Channel type `{channel_type}` does not support identity binding \\\n             (supported: telegram, wechat, line).\"\n        );\n    };\n\n    let normalized = normalize(identity);\n    if normalized.is_empty() {\n        anyhow::bail!(\"{channel_type} identity cannot be empty\");\n    }\n\n    // The alias must name an existing `[channels.<type>.<alias>]` section.\n    // Binding into a phantom alias would mint a peer group the runtime never\n    // reads (it resolves authorization per the alias the channel actually\n    // runs under), so fail loudly instead of silently authorizing nobody.\n    if !channel_alias_configured(config, channel_type, alias) {\n        anyhow::bail!(\n            \"{channel_type} channel alias `{alias}` is not configured. Run \\\n             `zeroclaw config set channels.{channel_type}.{alias}.bot_token <token>` \\","sourceCodeStart":8640,"sourceCodeEnd":8676,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-channels/src/orchestrator/mod.rs#L8640-L8676","documentation":"Thrown by bind_channel_identity_into when channel_identity_normalizer(channel_type) returns None. Identity binding (pairing an operator's chat identity into a peer group allowlist) is only implemented for `telegram`, `wechat`, and `line`, because only those types have a normalization function; any other channel type hits the closed-set gate and the bind is rejected before touching config.","triggerScenarios":"Calling bind_channel_identity_into(config, \"discord\", alias, identity) — or via the CLI bind command / gateway bind endpoint with channel_type `discord`, `slack`, `matrix`, `signal`, etc. Anything outside {telegram, wechat, line} fails immediately.","commonSituations":"Assuming every configured channel supports operator identity binding; scripting a generic bind loop over all configured channel types; a new channel was added to config and the operator tries to bind to it before binding support landed.","solutions":["Use one of the supported types: telegram, wechat, or line","For unsupported channels, authorize users through that channel's own mechanism (e.g. peer_groups config keyed by the channel's native identifiers) instead of the bind API","Watch the supported set in channel_identity_normalizer — it only grows when a new pairing channel lands"],"exampleFix":"# before\nzeroclaw bind discord default 123456789\n# error: Channel type `discord` does not support identity binding (supported: telegram, wechat, line.)\n\n# after — authorize discord users via peer_groups in zeroclaw.toml\n[peer_groups.discord_default]\nchannel = \"discord.default\"\nusers = [\"123456789\"]","handlingStrategy":"type-guard","validationCode":"use zeroclaw_channels::orchestrator::channel_identity_normalizer;\nif channel_identity_normalizer(channel_type).is_none() {\n    return Ok(notify(format!(\"{channel_type} has no identity binding; use telegram/wechat/line\")));\n}","typeGuard":"fn supports_identity_binding(channel_type: &str) -> bool {\n    matches!(channel_type, \"telegram\" | \"wechat\" | \"line\")\n}","tryCatchPattern":"Err(err) if err.to_string().contains(\"does not support identity binding\") => {\n    // route the user to the channel's native authorization mechanism instead\n}","preventionTips":["Gate bind UI/actions on the supports_identity_binding check so unsupported types never reach the API","Keep the guard list in sync with channel_identity_normalizer when new pairing channels land","Return the supported set in your tooling's help text"],"tags":["identity-binding","channel-type","allowlist","zeroclaw"],"backgroundTag":"unsupported-operation-for-type","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}