-
-
Notifications
You must be signed in to change notification settings - Fork 69.2k
Discord inbound messages silently dropped after update — parseDiscordChannelInput fails to resolve numeric channel IDs #12185
Description
Describe the bug
After updating to v2026.2.6, the Discord bot appears fully functional — it shows as online, connects to the gateway, and outbound messages (webchat → Discord) work perfectly. But every single inbound Discord message is silently dropped. The bot never responds to any message on any channel.
There is zero indication that anything is wrong:
- No error in the logs
openclaw channels statusshowsDiscord default: enabled, configured, running✅openclaw doctorreports no issues- The bot is online in Discord and has full permissions
The only clue is a subtle log line at startup that's easy to miss:
[discord] channels unresolved: <guildId>/<channelId>, ... (+N)
This took 8+ hours of debugging across two machines to diagnose, because everything looks healthy from the outside.
This is a regression
- Before update (pre-2026.2.x): Discord inbound worked correctly with the exact same config and bot token on both machines
- After update to v2026.2.6: All channels unresolved, all inbound silently ignored
- Affects both npm install (macOS) and Docker source build (Unraid) — both broke simultaneously after updating
Config was generated by OpenClaw itself
The channel config was created by openclaw onboard / the setup wizard, which stored entries with numeric channel IDs as keys:
{
"channels": {
"discord": {
"guilds": {
"111111111111111111": {
"channels": {
"222222222222222222": { "allow": true },
"333333333333333333": { "allow": true }
}
}
}
}
}
}Root cause
At startup, the gateway constructs entries as guildId/channelKey (e.g. 111111111111111111/222222222222222222) and passes them to parseDiscordChannelInput. When the input contains /, the function splits it and returns:
if (guild && /^\\d+$/.test(guild)) return {
guildId: guild,
channel // ← treated as channel NAME/slug, never as channelId
};The channel value (a numeric ID string like "222222222222222222") is then matched against channel names via normalizeDiscordSlug(), which never matches a number. Every channel stays "unresolved", and the message handler rejects all incoming messages.
Note: openclaw channels resolve --channel discord "222222222222222222" works fine with a bare ID (matched by the channelPrefix regex), but the internal guildId/channelId path bypasses that regex.
Inconsistency with docs
The Discord docs state:
guilds.<id>.channels: channel rules (keys are channel slugs or ids).
But IDs do not work as channel keys — only slugs do.
Suggested fix
if (guild && /^\\d+$/.test(guild)) {
+ if (/^\\d+$/.test(channel)) return { channelId: channel };
return { guildId: guild, channel };
}Additionally:
openclaw doctorshould flag unresolved Discord channels- The "channels unresolved" log should be a warning, not an info-level message
Workaround
Replace numeric keys with channel name slugs:
- "222222222222222222": { "allow": true },
+ "my-channel-name": { "allow": true },Environment
- OpenClaw v2026.2.6 (npm + Docker source build)
- Node.js v22.22.0
- macOS + Unraid (Docker)