{"record":{"id":"0eaaf704f56a11d1","repo":"zeroclaw-labs/zeroclaw","slug":"signal-channel-requires-the-channel-signal-featu","errorCode":null,"errorMessage":"Signal channel requires the `channel-signal` feature","messagePattern":"Signal channel requires the `channel-signal` feature","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-channels/src/orchestrator/mod.rs","lineNumber":9086,"sourceCode":"                Arc::new(move || cfg_arc.read().channel_external_peers(\"signal\", &alias))\n            };\n            Ok(Arc::new(\n                SignalChannel::new(\n                    sg.http_url.clone(),\n                    sg.account.clone(),\n                    sg.group_ids.clone(),\n                    sg.dm_only,\n                    alias,\n                    peer_resolver,\n                    sg.ignore_attachments,\n                    sg.ignore_stories,\n                )\n                .with_approval_timeout_secs(sg.approval_timeout_secs),\n            ))\n        }\n        #[cfg(not(feature = \"channel-signal\"))]\n        \"signal\" => {\n            anyhow::bail!(\"Signal channel requires the `channel-signal` feature\");\n        }\n        \"matrix\" => {\n            #[cfg(feature = \"channel-matrix\")]\n            {\n                let mx = config\n                    .channels\n                    .matrix\n                    .get(\"default\")\n                    .context(\"Matrix channel is not configured\")?;\n                let alias = \"default\".to_string();\n                let state_dir = matrix_state_dir(&config.config_path, &alias);\n                let peer_resolver: Arc<dyn Fn() -> Vec<String> + Send + Sync> = {\n                    let cfg_arc = config_arc.clone();\n                    let alias = alias.clone();\n                    Arc::new(move || cfg_arc.read().channel_external_peers(\"matrix\", &alias))\n                };\n                let ack = mx.ack_reactions.unwrap_or(config.channels.ack_reactions);\n                let workspace_dir = one_shot_channel_workspace_dir(&config, \"matrix\", &alias);","sourceCodeStart":9068,"sourceCodeEnd":9104,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-channels/src/orchestrator/mod.rs#L9068-L9104","documentation":"Thrown by build_channel_by_id when channel_type is `signal` and the `channel-signal` cargo feature is absent from the build. The signal arm (which reads config.channels.signal and constructs the Signal runtime) exists only under the feature; the cfg(not(...)) arm bails naming the feature. Configuration for signal cannot be honored by a binary that lacks the code.","triggerScenarios":"Configured `[channels.signal.*]` alias or a `signal.<alias>` delivery target on a binary compiled without `channel-signal`; surfaces at daemon startup and in one-shot sends.","commonSituations":"Slim docker images that enable only the channels the deployment uses; a rebuild after Cargo feature pruning; config drift between environments with different feature sets.","solutions":["Rebuild with `cargo build --features channel-signal`","Pick a prebuilt package including signal support","Or remove `[channels.signal]` from the config"],"exampleFix":"# before\ncargo build --no-default-features\n# error: Signal channel requires the `channel-signal` feature\n\n# after\ncargo build --no-default-features --features channel-signal","handlingStrategy":"validation","validationCode":"#[cfg(not(feature = \"channel-signal\"))]\nif !config.channels.signal.is_empty() {\n    log::warn!(\"[channels.signal.*] configured but `channel-signal` feature is off\");\n}","typeGuard":"fn channel_feature_enabled(channel_type: &str) -> bool {\n    match channel_type {\n        \"signal\" => cfg!(feature = \"channel-signal\"),\n        \"telegram\" => cfg!(feature = \"channel-telegram\"),\n        \"discord\" => cfg!(feature = \"channel-discord\"),\n        \"slack\" => cfg!(feature = \"channel-slack\"),\n        \"mattermost\" => cfg!(feature = \"channel-mattermost\"),\n        \"matrix\" => cfg!(feature = \"channel-matrix\"),\n        \"whatsapp\" | \"whatsapp-web\" => cfg!(feature = \"whatsapp-web\"),\n        _ => false,\n    }\n}","tryCatchPattern":"Err(err) if err.to_string().contains(\"requires the `channel-signal` feature\") => {\n    // rebuild with --features channel-signal or remove signal config\n}","preventionTips":["Validate configured channel types against compiled features during boot","Automate the feature list in CI from the config of channels you deploy","Record enabled features in build metadata for faster diagnosis"],"tags":["feature-flag","signal","build-configuration","zeroclaw"],"backgroundTag":"missing-compile-time-feature","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}