{"record":{"id":"e4d62e9a45f3cf98","repo":"zeroclaw-labs/zeroclaw","slug":"voice-call-channel-requires-the-channel-voice-cal","errorCode":null,"errorMessage":"Voice Call channel requires the `channel-voice-call` feature","messagePattern":"Voice Call channel requires the `channel-voice-call` feature","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-channels/src/orchestrator/mod.rs","lineNumber":9671,"sourceCode":"            #[cfg(not(feature = \"channel-line\"))]\n            {\n                anyhow::bail!(\"LINE channel requires the `channel-line` feature\");\n            }\n        }\n        \"voice-call\" => {\n            #[cfg(feature = \"channel-voice-call\")]\n            {\n                let (alias, vc) = config\n                    .channels\n                    .voice_call\n                    .iter()\n                    .next()\n                    .context(\"Voice Call channel is not configured\")?;\n                Ok(Arc::new(VoiceCallChannel::new(alias.clone(), vc.clone())))\n            }\n            #[cfg(not(feature = \"channel-voice-call\"))]\n            {\n                anyhow::bail!(\"Voice Call channel requires the `channel-voice-call` feature\");\n            }\n        }\n        other => Err(anyhow::Error::new(UnknownChannelId(other.to_string()))),\n    }\n}\n\n/// Send a one-off message to a configured channel.\npub async fn send_channel_message(\n    config: &Config,\n    channel_id: &str,\n    recipient: &str,\n    message: &str,\n) -> Result<()> {\n    // Wrap into the canonical shared handle for the builder; this is a\n    // one-shot path so the snapshot is dropped immediately after send.\n    let config_arc = Arc::new(RwLock::new(config.clone()));\n    // The builder gets first refusal so families it already resolves natively\n    // (notably `linq.<alias>`) keep their established route and their own","sourceCodeStart":9653,"sourceCodeEnd":9689,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-channels/src/orchestrator/mod.rs#L9653-L9689","documentation":"Raised by build_channel_by_id in the \"voice-call\" arm when the binary was compiled without the `channel-voice-call` feature. Voice Call uses an inner cfg block; without the feature only the bail remains. Do not confuse it with the sibling error in the feature-on arm — \"Voice Call channel is not configured\" (a .context on the first configured entry) — this bail fires purely on compilation flags.","triggerScenarios":"start_channels / build_channel_by_id selecting \"voice-call\" from an agent binding or channels config in a build lacking --features channel-voice-call.","commonSituations":"Default-feature builds (voice-call is in channels-full only); telephony-enabled configs deployed onto binaries built without it; operators who see \"Voice Call channel is not configured\" docs and add config when the real problem is the missing feature.","solutions":["Rebuild with cargo build --release --features channel-voice-call","Or use --features channels-full","Or remove the \"voice-call\" binding from config","Once compiled in, make sure at least one voice-call entry exists in config or you will hit the separate 'not configured' error"],"exampleFix":"# before\n cargo build --release\n\n # after\n cargo build --release --features channel-voice-call","handlingStrategy":"validation","validationCode":"use zeroclaw_channels::listing::is_channel_type_compiled;\n\nif !is_channel_type_compiled(\"voice-call\") {\n    eprintln!(\"rebuild with --features channel-voice-call or remove the voice-call binding\");\n}","typeGuard":"fn voice_call_available() -> bool {\n    zeroclaw_channels::listing::is_channel_type_compiled(\"voice-call\")\n}","tryCatchPattern":"match build_channel_by_id(&config_arc, \"voice-call\") {\n    Ok(ch) => { /* use */ }\n    Err(e) if e.to_string().contains(\"requires the `channel-voice-call` feature\") => {\n        // rebuild needed\n    }\n    Err(e) if e.to_string().contains(\"Voice Call channel is not configured\") => {\n        // compiled in but no entry in config: add one\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Distinguish the feature bail from the sibling 'not configured' context error in the same arm","Keep telephony features in the build profile wherever the config may enable voice bindings"],"tags":["rust","cargo-features","feature-gate","zeroclaw","channels","voice-call"],"backgroundTag":"cargo-feature-not-enabled","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}