Skip to content

Discord inbound messages silently dropped after update — parseDiscordChannelInput fails to resolve numeric channel IDs #12185

@ateliersam86

Description

@ateliersam86

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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingstaleMarked as stale due to inactivity

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions