{"record":{"id":"e38073d7df46d923","repo":"zeroclaw-labs/zeroclaw","slug":"unsupported-room-visibility-other-expected-pr","errorCode":null,"errorMessage":"unsupported room visibility '{other}': expected private or public","messagePattern":"unsupported room visibility '(.+?)': expected private or public","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-api/src/channel.rs","lineNumber":449,"sourceCode":"        }\n    }\n}\n\nimpl fmt::Display for RoomVisibility {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.write_str(self.as_str())\n    }\n}\n\nimpl FromStr for RoomVisibility {\n    type Err = anyhow::Error;\n\n    fn from_str(value: &str) -> Result<Self, Self::Err> {\n        match value.trim().to_ascii_lowercase().as_str() {\n            \"private\" => Ok(Self::Private),\n            \"public\" => Ok(Self::Public),\n            other => {\n                anyhow::bail!(\"unsupported room visibility '{other}': expected private or public\")\n            }\n        }\n    }\n}\n\n/// Room creation options shared by channel implementations that support\n/// creating group conversations.\n#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]\npub struct RoomCreationOptions {\n    pub name: Option<String>,\n    pub topic: Option<String>,\n    pub invites: Vec<String>,\n    pub visibility: Option<RoomVisibility>,\n    pub encryption: Option<bool>,\n}\n\nimpl SendMessage {\n    /// Create a new message with content and recipient","sourceCodeStart":431,"sourceCodeEnd":467,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-api/src/channel.rs#L431-L467","documentation":"The `channels add` subcommand (ChannelCommands::Add arm in handle_command, src/channels/mod.rs:74) is intentionally not implemented and unconditionally bails with remediation text. Channel configuration lives in TOML under `channels.<type>.<alias>.<field>`, so adding a channel is done through `zeroclaw config set` or by editing the config file directly. No partial work happens; the command exits non-zero immediately.","triggerScenarios":"Invoking `zeroclaw channels add <channel_type> ...` from the CLI, or dispatching a ChannelCommands::Add value into channels::handle_command programmatically. Every invocation of this arm bails — there is no input that succeeds.","commonSituations":"Muscle memory from other tools that have `add`/`remove` channel subcommands (docker, slackctl); following an out-of-date tutorial or README that predates the config-set workflow.","solutions":["Use the command the error prints: `zeroclaw config set channels.<channel_type>.<alias>.<field>=<value>` (e.g. channels.telegram.main.token=...)","Or edit ~/.zeroclaw/config.toml directly and add the `[channels.<type>.<alias>]` table","Verify with `zeroclaw channels list` that the channel now shows as configured (✅) and compiled in"],"exampleFix":"# before\n$ zeroclaw channels add telegram\nError: Channel type 'telegram' — use `zeroclaw config set channels.telegram.<alias>.<field>=<value>` to configure\n\n# after\n$ zeroclaw config set channels.telegram.main.token=123456:ABC-DEF...\n$ zeroclaw channels list","handlingStrategy":"validation","validationCode":"// Reject unimplemented subcommands before dispatching to handle_command.\nfn is_implemented(cmd: &zeroclaw::ChannelCommands) -> bool {\n    !matches!(cmd, zeroclaw::ChannelCommands::Add { .. })\n}","typeGuard":null,"tryCatchPattern":"if let Err(e) = channels::handle_command(cmd, &config).await {\n    if e.to_string().contains(\"use `zeroclaw config set channels.\") {\n        // Deterministic unsupported-command bail: do not retry;\n        // translate into the config-set workflow for the user.\n    }\n}","preventionTips":["Script channel provisioning with `zeroclaw config set channels.<type>.<alias>.<field>=<value>`, never `channels add`","Check `zeroclaw channels list` after config changes to confirm the channel compiled in","Do not build tooling that retries on this error — it is a permanent, by-design refusal"],"tags":["channels","cli","not-implemented","config"],"backgroundTag":"unsupported-command","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}