{"record":{"id":"f8e76fc0fca0bfc6","repo":"zeroclaw-labs/zeroclaw","slug":"git-channel-events-routing-table-ignores-every-e","errorCode":null,"errorMessage":"git channel `events` routing table ignores every event type; nothing would ever be delivered","messagePattern":"git channel `events` routing table ignores every event type; nothing would ever be delivered","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-channels/src/git/channel.rs","lineNumber":517,"sourceCode":"                        \"issues\": plan.issues,\n                        \"comments\": plan.comments,\n                        \"review_comments\": plan.review_comments,\n                        \"releases\": plan.releases,\n                        \"workflow_runs\": plan.workflow_runs,\n                        \"events_backbone\": self.cfg.events_backbone,\n                    },\n                })\n            ),\n            \"git channel polling\"\n        );\n        if repos.is_empty() {\n            anyhow::bail!(\n                \"git channel has no repositories to poll; set `repos` or grant the \\\n                 provider access to at least one repository\"\n            );\n        }\n        if !plan.any() {\n            anyhow::bail!(\n                \"git channel `events` routing table ignores every event type; \\\n                 nothing would ever be delivered\"\n            );\n        }\n\n        let filter = EventFilter {\n            bot_login: &bot_login,\n            mention_handle: &mention_handle,\n            mention_only: self.cfg.mention_only,\n            listen_to_bots: self.cfg.listen_to_bots,\n        };\n        let mut state = PollState::new(chrono::Utc::now());\n\n        loop {\n            for repo in &repos {\n                match self.poll_repo(repo, &filter, &plan, &mut state, &tx).await {\n                    Ok(true) => {}\n                    Ok(false) => return Ok(()),","sourceCodeStart":499,"sourceCodeEnd":535,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-channels/src/git/channel.rs#L499-L535","documentation":"listen() compiles the channels.git.<alias>.events routing table into an event filter plan and checks plan.any(): if the table filters out every possible event type, no event could ever be delivered, which is treated as a misconfiguration and bails instead of silently polling forever.","triggerScenarios":"An events table whose entries all resolve to ignore/none — every event type explicitly disabled, or a table using unrecognized keys so nothing matches.","commonSituations":"Copy-pasted events config that disables everything while intending to enable a subset; renamed event keys that no longer match the schema; a blanket ignore-all entry left in place.","solutions":["Enable at least one event type in the events table (use the channel's documented event keys, e.g. issues, pull_request, push)","Check for a blanket ignore/disable entry overriding your selections","Validate the events config against the documented schema before deploy"],"exampleFix":"# before\n[channels.git.mine.events]\n# every type disabled → listen() bails\n\n# after\n[channels.git.mine.events]\nissues = true\npull_request = true","handlingStrategy":"validation","validationCode":"// Rust — lint the routing table before listen()\nlet plan = EventFilterPlan::compile(&cfg.events)?;\nif !plan.any() {\n    anyhow::bail!(\"events routing table enables no event types; nothing would be delivered\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Config-lint event tables so an all-disabled table fails at load, not at listen","Keep the recognized event keys documented next to config examples"],"tags":["git","events","routing","configuration","validation"],"backgroundTag":"event-routing-empty","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}