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 status shows Discord default: enabled, configured, running ✅
openclaw doctor reports 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 doctor should 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)
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:
openclaw channels statusshowsDiscord default: enabled, configured, running✅openclaw doctorreports no issuesThe only clue is a subtle log line at startup that's easy to miss:
This took 8+ hours of debugging across two machines to diagnose, because everything looks healthy from the outside.
This is a regression
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 toparseDiscordChannelInput. When the input contains/, the function splits it and returns:The
channelvalue (a numeric ID string like"222222222222222222") is then matched against channel names vianormalizeDiscordSlug(), 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 thechannelPrefixregex), but the internalguildId/channelIdpath bypasses that regex.Inconsistency with docs
The Discord docs state:
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 channelsWorkaround
Replace numeric keys with channel name slugs:
Environment