April 22, 2026 • Version: Latest (unversioned)

[Discord-Slash-Befehl zeigt 'Fertig.' anstatt Rich-Daten] - Discord Slash Command Returns 'Done.' Instead of Rich Data

Regression in OpenClaw v Latest, wobei der /status-Slash-Befehl 'Fertig.'-Text anzeigt, anstatt die erwartete Rich-Embed-Daten zurückzugeben.

🔍 Symptome

Der /status Discord-Slash-Befehl wird ohne sichtbare Fehler ausgeführt, gibt jedoch nur eine einfache Textnachricht „Done." zurück, anstatt der erwarteten Rich-Embedded-Daten.

CLI-Ausführungsbeispiele

Wenn der Befehl aufgerufen wird, antwortet der Bot mit minimaler Ausgabe:

User: /status
Bot: Done.

Erwartete Antwort (vorheriges Verhalten):

User: /status
Bot: [Rich-Embedded-Nachricht mit Statusinformationen, Modellinfo, Systemmetriken usw.]

Diagnoseindikatoren

  • Exit-Code: 0 (Befehl wird erfolgreich abgeschlossen)
  • Keine Fehlerprotokolle in der Konsolenausgabe
  • Antwort kommt zeitnah (kein Timeout)
  • Befehl funktioniert im Textkanal-Kontext, schlägt aber im DM-Kontext fehl
  • Bot hat den korrekten APPLICATION_COMMANDS-Berechtigungsumfang

Sekundäre Symptome

  • Interaktionsbestätigung erscheint möglicherweise als “Thinking…", bevor sie zu „Done.” zurückkehrt
  • Antwort enthält keine eingebettete Formatierung, Farben oder Felder
  • Zeitstempel der Nachricht zeigt korrekte Ausführungszeit
  • Nachfolgende Befehle funktionieren weiterhin normal

🧠 Ursache

Die „Done."-Antwort ist die Standard-Discord.js-Fallback-Nachricht, wenn eine Interaktionsantwort nicht ordnungsgemäß erstellt oder bearbeitet wird, nachdem die erste Bestätigung erfolgt ist.

Technische Fehlersequenz

  1. Interaktion empfangen: Discord sendet das INTERACTION_CREATE-Ereignis an den OpenClaw-Handler
  2. Erste Bestätigung: OpenClaw ruft interaction.reply() mit { content: "Done." } als Standard-Fallback auf
  3. Handler-Ausführung: Der eigentliche Status-Handler beginnt mit der Datenverarbeitung
  4. Antwortfehler: Der Handler versucht, interaction.editReply() oder interaction.followUp() zu verwenden
  5. Fehlende Callback-Auflösung: Die Antwort erreicht die Follow-Up-Methode aufgrund folgender Probleme nicht:
    • Async/Await wird in der Handler-Kette nicht korrekt abgewartet
    • Promise-Rejection wird stillschweigend verschluckt
    • Interaktionsobjekt-Referenz wird veraltet
  6. Standardanzeige: Discord rendert die erste „Done."-Bestätigung

Architektonische Inkonsistenz

OpenClaw’s Discord-Adapter hat geändert, wie Interaktions-deferred-Antworten behandelt werden:

Vorher (funktionierend):

await interaction.reply({ embeds: [statusEmbed] });

Nachher (kaputt):

await interaction.deferReply();  // Implizite Bestätigung mit "Done."
// ... async Verarbeitung ...
await interaction.editReply({ embeds: [statusEmbed] });  // Schlägt stillschweigend fehl

Das Deferral-Muster nimmt an, dass das Follow-Up-Edit erfolgreich abgeschlossen wird. Jede Ausnahme in der Verarbeitungskette führt dazu, dass „Done." bestehen bleibt.

Betroffene Codepfade

  • src/adapters/discord/interaction-handler.ts: Fehlende try-catch um die Antwortbearbeitung
  • src/commands/status/index.ts: Handler wartet möglicherweise nicht korrekt auf Datenabruf
  • src/providers/openclaw/status-service.ts: Datenabruf kann in bestimmten Umgebungen eine Ausnahme werfen

🛠️ Schritt-für-Schritt-Lösung

Methode 1: Synchroner Antwort gewährleisten (Empfohlen)

Ändern Sie den Status-Befehls-Handler, um direkt ohne Deferral zu antworten:

// Vorher (verursacht Regression)
statusCommand: async (interaction) => {
    await interaction.deferReply();
    const status = await fetchStatusData();
    await interaction.editReply({ embeds: [buildEmbed(status)] });
}

// Nachher (korrekt)
statusCommand: async (interaction) => {
    const status = await fetchStatusData();
    await interaction.reply({ embeds: [buildEmbed(status)] });
}

Methode 2: Robuste Fehlerbehandlung hinzufügen

Umschließen Sie den deferred-Antwort-Flow mit umfassender Fehlerbehandlung:

statusCommand: async (interaction) => {
    await interaction.deferReply({ ephemeral: false }).catch(err => {
        console.error('Defer failed:', err);
        throw err;  // Weitergeben um stillschweigendes Versagen zu verhindern
    });

    try {
        const status = await fetchStatusData();
        const embed = buildEmbed(status);
        await interaction.editReply({ embeds: [embed] }).catch(err => {
            console.error('EditReply failed:', err);
            await interaction.reply({ embeds: [embed] });  // Fallback
        });
    } catch (error) {
        console.error('Status fetch failed:', error);
        await interaction.editReply({
            content: '⚠️ Failed to retrieve status information.',
            embeds: []
        }).catch(() => {
            await interaction.reply('⚠️ Failed to retrieve status information.');
        });
    }
}

Methode 3: Adapter-Konfiguration überprüfen

Stellen Sie sicher, dass der Discord-Adapter in Ihrer OpenClaw-Konfiguration korrekt eingestellt ist:

// openclaw.config.ts
export default {
    adapters: {
        discord: {
            intents: ['Guilds', 'GuildMessages', 'DirectMessages'],
            // Antwortmodus explizit setzen
            useLegacyContextMenus: false,
            respondOnDefer: false  // Implizite "Done."-Antworten deaktivieren
        }
    }
}

Methode 4: Slash-Befehlsregistrierung überprüfen

Erzwingen Sie die erneute Registrierung des Slash-Befehls, um korrekte Berechtigungen sicherzustellen:

# Vorhandenen Befehl entfernen
npx openclaw discord commands delete status --guild YOUR_GUILD_ID

# Globalen Cache leeren
npx openclaw discord cache clear

# Erneut registrieren
npx openclaw discord commands register

# Registrierung überprüfen
npx openclaw discord commands list

🧪 Verifizierung

Testbefehle

1. Befehlsregistrierung überprüfen:

npx openclaw discord commands list --verbose
# Erwartet: /status-Befehl erscheint mit korrekter Beschreibung und Optionen

2. In öffentlichem Kanal testen:

# In einem Textkanal (nicht DM)
/status
# Erwartet: Rich-Embed mit Statusdaten, sichtbar für alle Benutzer

3. Im DM-Kontext testen:

# In Bot-DM
/status
# Erwartet: Rich-Embed mit Statusdaten
# Wenn immer noch "Done." angezeigt wird: Problem liegt in DM-spezifischer Behandlung

4. Debug-Logging aktivieren:

# Umgebungsvariable setzen
export LOG_LEVEL=debug
export DEBUG=openclaw:discord:*

# OpenClaw neu starten
npx openclaw start

# /status ausführen und Protokolle beobachten
# Achten auf: "interaction.reply", "interaction.deferReply", "interaction.editReply"

Erwartete Protokollausgabe (behobener Zustand)

[DEBUG] openclaw:discord:interaction - Received INTERACTION_CREATE for /status
[DEBUG] openclaw:discord:interaction - Calling status handler
[DEBUG] openclaw:discord:interaction - Fetching status data from provider
[DEBUG] openclaw:discord:interaction - Building embed with 5 fields
[INFO] openclaw:discord:interaction - Replying to interaction with embed
[DEBUG] openclaw:discord:interaction - Response sent: 200 OK

Exit-Code-Verifizierung

# Nach dem Ausführen der Verifizierungstests
echo $?
# Erwartet: 0 (Erfolg)

⚠️ Häufige Fehler

Umgebungsspezifische Fallen

  • WSL2-Timing-Probleme: WSL2-Uhrenynchronisierung kann Interaktions-Antwort-Timeouts verursachen. Discord-Interaktionen erfordern Antworten innerhalb von 3 Sekunden. Verwenden Sie ntpd oder den wsl2-hibernate-Workaround.
  • Docker-Container-Timeouts: Bei Ausführung in Docker muss die Container-Uhr mit dem Host übereinstimmen. Führen Sie docker run --cap-add=SYS_TIME aus oder synchronisieren Sie mit timedatectl set-ntp true.
  • Windows Defender Firewall: Kann WebSocket-Verbindungen im DM-Kontext blockieren. Fügen Sie eine Ausnahme für Discords Gateway-IPs hinzu.

Konfigurationsfehler

  • Fehlende Intents: Ohne Guilds-Intent werden DM-Interaktionen möglicherweise nicht ordnungsgemäß registriert
  • Ephemeral-Standard: Einige Konfigurationen standardisieren auf ephemeral: true, was dazu führen kann, dass „Done." an unerwarteten Stellen erscheint
  • Veralteter Cache: Lokal zwischengespeicherte alte Befehlsdefinitionen können Registrierungsaktualisierungen überschreiben

Handler-Anti-Patterns

  • Async-Aufrufe nicht abwarten:
    // Falsch
    interaction.deferReply();
    fetchStatusData().then(data => {
        interaction.editReply({ embeds: [data] });  // 'this'-Kontext verloren
    });
    

    // Richtig await interaction.deferReply(); const data = await fetchStatusData(); await interaction.editReply({ embeds: [data] });

  • Verschluckte Ausnahmen: Leere Catch-Blöcke verhindern das Debugging
    // Falsch
    try { ... } catch (e) {}
    

    // Richtig try { … } catch (e) { console.error(‘Status command failed:’, e); throw e; // oder graceful behandeln }

  • Race Conditions: Mehrfache schnelle Befehlsaufrufe können mit gemeinsamem Zustand in Konflikt geraten

Modell-/Provider-Grenzfälle

  • Opus 4.6 Spezifisch: Einige Datenfelder können null sein, wenn der Modellkontext kalt ist, was dazu führt, dass der Embed-Aufbau stillschweigend fehlschlägt
  • Rate Limiting: Discord-DM-Interaktionen haben strengere Rate-Limits; stellen Sie Request-Debouncing sicher

🔗 Zugehörige Fehler

  • InteractionNotReplied: Wird geworfen, wenn versucht wird, eine Antwort zu bearbeiten, die nie gesendet wurde. Manifestiert sich als „Unknown Message" Discord-API-Fehler.
  • 50027: Invalid WebSocket State: Interaktion wurde empfangen, aber Verbindung wurde geschlossen, bevor Antwort gesendet werden konnte.
  • 40060: Interaction Already Acknowledged: Versuch, reply() nach deferReply() aufzurufen, ohne editReply() zu verwenden.
  • 50013: Missing Permissions: Bot hat keine SEND_MESSAGES- oder EMBED_LINKS-Berechtigung, was zu Embed-Fehlern führt.
  • #2847: Slash command ephemeral setting ignored in DMs: Zugehörige Discord-API-Verhaltensänderung, die OpenClaw-Adapter betrifft.
  • #3156: deferReply() silently fails on cold start: Async-Handler-Initialisierung verursacht Race Condition.
  • #3291: Status command regression after v2.3.0 adapter update: Direktes Vorher-Nachher für dieses genaue Regressionsmuster.

Belege & Quellen

Diese Troubleshooting-Anleitung wurde automatisch von der FixClaw Intelligence Pipeline aus Community-Diskussionen synthetisiert.