Thanks for the insight about Carbon! That helps a lot.
However, I don't think it's 4014 (Disallowed Intents) because:
My manual WebSocket test used intents = 38791 (includes MessageContent 1<<15, GuildMembers 1<<1, Presence 1<<8, GuildMessages 1<<9, etc.) — same privileged intents Carbon would request. Result:
CopyCopied!
HELLO received, interval: 41250
IDENTIFY with intents: 38791
READY! Bot: Aura Nexa #0826, Guilds: 1
GUILD_CREATE: Grupo Nexa
MESSAGE_CREATE: "<@bot_id> teste" from=ggcruz
Full READY + full content MESSAGE_CREATE received. If it were 4014, the gateway would reject the connection before READY.
All 3 privileged intents are enabled in the Developer Portal (confirmed) and in the config:
JSON
Capabilities: messageContent=limited guildMembers=limited presence=limited
No close codes found in the logs. Searched for 4014, 4013, 4012, etc — nothing. Carbon seems to fail silently.
What the logs show:
CopyCopied!
T+0s → "starting provider (@Aura Nexa)"
T+2s → "discord channels resolved" (REST API)
T+2s → "discord channel users resolved"
(no READY log, no error, no close code — silence)
T+300s → "health-monitor: restarting (reason: disconnected)"
My theory: Carbon's gateway WebSocket connects at TCP level but something in the IDENTIFY/initialization is different. The connection closes before READY but Carbon doesn't log the close code.
Could you check: Is there a way to enable debug/verbose logging for the Carbon gateway? Or is there a known issue with @buape/carbon on Node 25.x?
Environment: OpenClaw 2026.3.12, Node 25.8.1, Docker container, Linux 6.8.0-101-generic