April 22, 2026 • Version: 2026.4.5

Native Discord /status meldet 'discord/undefined' ohne Aktivität - Discord Native /status Reports 'discord/undefined' and No Activity for Active Channel Sessions

Der native Discord /status Befehl zeigt fälschlicherweise Model: discord/undefined, null Kontext und keine Aktivität an, selbst wenn eine gültige Kanal-Sitzung aktiv ist. Die Ursache liegt in einem fehlenden sessionEntry-Lookup im nativen Befehlsrouting-Pfad.

🔍 Symptome

Für Benutzer sichtbare Manifestationen

Bei der Ausführung des nativen Discord-Befehls /status in einem Guild-Kanal mit einer aktiven Sitzung wird die folgende fehlerhafte Ausgabe zurückgegeben:

🦞 OpenClaw 2026.4.5 (3e72c03)
🧠 Model: discord/undefined · 🔑 unknown
📚 Context: 0/200k (0%) · 🧹 Compactions: 0
🧵 Session: agent:main:discord:slash:332887877048598528 • no activity
📌 Tasks: 0 active · 5 total · agent-local
⚙️ Runtime: direct · Think: off · elevated
🪢 Queue: collect (depth 0)

In einigen Beobachtungen zeigt der Sitzungsschlüssel die korrekte Kanal-ID, aber die Metadaten bleiben fehlerhaft:

🧵 Session: agent:main:discord:channel:1490775030236450876 • no activity

Kontrast zum funktionierenden Nachrichtenpfad-Status

Wenn die Sitzung desselben Kanals über den normalen Nachrichtenpfad abgefragt wird (durch Anhängen von /status innerhalb einer regulären Nachricht), ist die Ausgabe korrekt:

🦞 OpenClaw 2026.4.5 (3e72c03)
🧠 Model: openai-codex/gpt-5.4 · 🔑 oauth (...)
📚 Context: 50k/272k (18%)
🧵 Session: agent:main:discord:channel:1490775030236450876 • updated just now

Wichtige diagnostische Indikatoren

  • Modell-Feld zeigt den Literalstring discord/undefined anstelle des konfigurierten Modells (z.B. openai-codex/gpt-5.4)
  • Kontext-Feld zeigt 0/... anstelle der tatsächlichen Nutzungsprozentzahl
  • Sitzungs-Feld zeigt das Suffix no activity anstelle von updated just now
  • Sitzungsschlüssel verweist möglicherweise auf discord/slash:... anstelle von discord:channel:... mit der korrekten Kanal-ID

Umgebungsbedingungen

  • OpenClaw-Version: 2026.4.5 (Build 3e72c03)
  • Installationsmethode: npm global
  • Betriebssystem: Linux 5.15.0-171-generic (x64)
  • Discord-Modus: Guild-Kanal mit aktivierten nativen Befehlen
  • Standard-Agentenmodell: openai-codex/gpt-5.4

🧠 Ursache

Architekturanalyse

Der Bug stammt aus einer fehlenden Sitzungseintragsauflösung in der nativen Discord-Befehlsrouting-Pipeline. Der Code-Pfad des nativen /status-Befehls versucht, routeState.sessionEntry zu lesen, um Status-Metadaten zu füllen, aber diese Eigenschaft wird von der upstream-Routenauflösungsfunktion nie bevölkert.

Code-Ablauf-Aufschlüsselung

1. Einstiegspunkt: Native Befehlsaufruf

Wenn ein Benutzer /status als nativen Discord-(Slash-)Befehl aufruft, tritt die Anfrage ein über:

provider-DR2mO1YM.js → commands.runtime-CVX5D6kT.js → pi-embedded-DWASRjxE.js → status-yaHSTeGo.js

2. Sitzungsauflösungsfehler

In provider-DR2mO1YM.js referenziert der native /status-Zweig routeState.sessionEntry:

// Pseudocode-Darstellung des problematischen Code-Pfads
const routeState = resolveDiscordNativeInteractionRouteState(interaction);
const sessionEntry = routeState.sessionEntry; // ← DIES IST UNDEFINED

if (!sessionEntry) {
    // Greift auf Slash-Payload-Metadaten zurück
    displayStatus(slashPayloadMetadata);
}

3. Lücke in der Routenstatus-Auflösung

Die Funktion resolveDiscordNativeInteractionRouteState() gibt zurück:

{
    route: "...",           // ✓ Bereitgestellt
    effectiveRoute: "...",   // ✓ Bereitgestellt
    binding: {...},         // ✓ Bereitgestellt
    sessionEntry: undefined  // ✗ FEHLT
}

Die Funktion stellt Routing-Metadaten (route, effectiveRoute, binding) bereit, bevölkert aber niemals sessionEntry, was es als undefined belässt.

4. Kontextaufbau mit fest kodierte Fallbacks

Wenn sessionEntry undefined ist, führt buildDiscordNativeCommandContext() mit fehlenden Daten aus. Diese Funktion:

  • Hardcodiert den Provider als Literalstring "discord"
  • Schlägt fehl beim Auflösen des tatsächlich konfigurierten Modells aus der Agent-Konfiguration
  • Kann keinen Lookup durchführen für die aktive Kanalsitzung aus dem Sitzungsspeicher

5. Kaskadierender Fehler zur Statusanzeige

Die Status-Rendering-Engine empfängt:

{
    provider: "discord",
    model: undefined,       // Resultiert in "discord/undefined"
    contextUsage: 0,        // Resultiert in "0/200k (0%)"
    sessionKey: "discord/slash:..." // Falscher Sitzungstyp
}

Warum der Nachrichtenpfad funktioniert

Der normale Nachrichtenpfad-Status-Lookup verwendet einen anderen Code-Pfad, der:

  1. Die Kanal-ID aus dem Nachrichtenkontekst auflöst
  2. Den Sitzungsspeicher direkt abfragt nach agent:main:discord:channel:{channelId}
  3. Das tatsächliche Modell, die Kontextnutzung und den letzten Aktivitätszeitstempel aus dem gespeicherten Sitzungseintrag extrahiert

Dieser Pfad umgeht die fehlerhafte Funktion resolveDiscordNativeInteractionRouteState() vollständig.

Erklärung der Sitzungsschlüssel-Diskrepanz

Der Sitzungsschlüssel zeigt discord/slash:{interactionId} anstelle von discord:channel:{channelId}, weil:

  • Der Fallback-Pfad die Interaktions-ID des Befehls als Sitzungskennung verwendet
  • Er niemals zum Sitzungseintrag des übergeordneten Kanals aufgelöst wird
  • Der korrekte Pfad die Kanal-ID aus dem Interaktionskanalkontekst ableiten würde

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

Temporäre Problemumgehung (Sofortige)

Bis der Fix bereitgestellt wird, verwenden Sie die Nachrichtenpfad-Statusabfrage:

Vorher (Fehlerhaft - Nativer Befehl):

/status

Nachher (Funktionierend - Nachrichtenpfad):

Beliebige Nachricht /status

Dies erzwingt den Nachrichten-Routing-Pfad, der den Kanalsitzung korrekt auflöst.

Permanenter Fix (Für Maintainer)

Der Fix erfordert Änderungen an zwei Funktionen in der Discord-nativen Befehlspipeline:

Fix 1: sessionEntry in der Routenauflösung bevölkern

Datei: provider-DR2mO1YM.js (oder äquivalentes Bundle)

Vorher:

function resolveDiscordNativeInteractionRouteState(interaction) {
    return {
        route: determineRoute(interaction),
        effectiveRoute: determineEffectiveRoute(interaction),
        binding: resolveBinding(interaction)
        // sessionEntry fehlt
    };
}

Nachher:

function resolveDiscordNativeInteractionRouteState(interaction) {
    const channelId = interaction?.channel_id || interaction?.channelId;
    const sessionKey = channelId 
        ? `agent:main:discord:channel:${channelId}`
        : null;
    
    return {
        route: determineRoute(interaction),
        effectiveRoute: determineEffectiveRoute(interaction),
        binding: resolveBinding(interaction),
        sessionEntry: sessionKey ? sessionStore.get(sessionKey) : null
    };
}

Fix 2: Fehlendes Modell im Status-Kontext behandeln

Datei: buildDiscordNativeCommandContext-Funktion

Vorher:

function buildDiscordNativeCommandContext(sessionEntry) {
    return {
        provider: "discord",
        model: sessionEntry?.model || undefined,
        // ...
    };
}

Nachher:

function buildDiscordNativeCommandContext(sessionEntry, routeState) {
    // Wenn sessionEntry aus routeState fehlt, versuche direkten Lookup
    const resolvedSession = sessionEntry || (
        routeState?.binding?.channelId 
            ? sessionStore.get(`agent:main:discord:channel:${routeState.binding.channelId}`)
            : null
    );
    
    return {
        provider: resolvedSession?.provider || "discord",
        model: resolvedSession?.model || getDefaultAgentModel(),
        // ...
    };
}

Fix 3: Korrekten Sitzungsschlüssel für Statusanzeige ableiten

Datei: status-yaHSTeGo.js (Status-Rendering)

Vorher:

function resolveStatusSessionKey(routeState) {
    if (routeState.sessionEntry) {
        return routeState.sessionEntry.key;
    }
    return `discord/slash:${interaction.id}`;
}

Nachher:

function resolveStatusSessionKey(routeState) {
    if (routeState.sessionEntry) {
        return routeState.sessionEntry.key;
    }
    // Fallback auf kanalbasierten Schlüssel, nicht Slash-Interaktions-ID
    const channelId = routeState.binding?.channelId;
    return channelId 
        ? `agent:main:discord:channel:${channelId}`
        : `discord/slash:${interaction.id}`;
}

🧪 Verifizierung

Testfall 1: Nativer Befehlsstatus in aktiver Kanalsitzung

Einrichtung:

  • Sicherstellen, dass eine Sitzung für eine bekannte Kanal-ID existiert (z.B. 1490775030236450876)
  • Überprüfen, dass die Sitzung eine Nicht-Null-Kontextnutzung hat

Ausführung:

/status

Erwartete Ausgabe:

🦞 OpenClaw 2026.4.5 (3e72c03)
🧠 Model: openai-codex/gpt-5.4 · 🔑 oauth (...)
📚 Context: 50k/272k (18%)
🧵 Session: agent:main:discord:channel:1490775030236450876 • updated just now
📌 Tasks: 0 active · 5 total · agent-local
⚙️ Runtime: direct · Think: off · elevated
🪢 Queue: collect (depth 0)

Erfolgsbedingungen:

  • Modell-Feld zeigt openai-codex/gpt-5.4 (nicht discord/undefined)
  • Kontext zeigt Prozentsatz ungleich Null
  • Sitzungsschlüssel referenziert discord:channel:{channelId}
  • Sitzung zeigt updated just now (nicht no activity)

Testfall 2: Vergleich mit Nachrichtenpfad-Status

Ausführung:

What's the current status? /status

Verifizierung: Die Ausgabe des nativen Befehls und des Nachrichtenpfads sollten identisch zeigen:

  • Modellname
  • Kontextprozentsatz
  • Sitzungsschlüssel
  • Letzten Aktivitätszeitstempel

Testfall 3: Neuer Sitzungsstatus (Keine aktive Kanalsitzung)

Einrichtung: /status in einem Kanal ohne vorherige Sitzung aufrufen.

Erwartete Ausgabe:

🧵 Session: agent:main:discord:channel:{channelId} • no activity

Erfolgsbedingungen:

  • Sitzungsschlüssel zeigt immer noch discord:channel:{channelId} (nicht discord/slash:...)
  • Modell-Feld sollte das konfigurierte Standardmodell anzeigen (nicht discord/undefined)

Testfall 4: Guild- vs. DM-Kanalverhalten

Ausführung: /status sowohl in Guild-Textkanälen als auch in DM-Kanälen testen.

Erfolgsbedingungen: Beide Kanaltypen sollten ein konsistentes Sitzungsauflösungsverhalten mit korrekten kanalbasierten Sitzungsschlüsseln zeigen.

Automatisiertes Verifizierungsskript

#!/bin/bash
# Verify Discord native /status fix

EXPECTED_MODEL="openai-codex/gpt-5.4"
CHANNEL_ID="1490775030236450876"
EXPECTED_SESSION_PREFIX="agent:main:discord:channel:${CHANNEL_ID}"

# Capture /status output (requires Discord API or test harness)
STATUS_OUTPUT=$(get_discord_status_output)

# Check Model field
if echo "$STATUS_OUTPUT" | grep -q "Model: $EXPECTED_MODEL"; then
    echo "✓ Model field correct"
else
    echo "✗ Model field incorrect"
    exit 1
fi

# Check Session key format
if echo "$STATUS_OUTPUT" | grep -q "Session: $EXPECTED_SESSION_PREFIX"; then
    echo "✓ Session key correct"
else
    echo "✗ Session key incorrect"
    exit 1
fi

# Check for no-activity indicator should NOT be present
if echo "$STATUS_OUTPUT" | grep -q "• no activity"; then
    echo "✗ Still showing 'no activity' for active session"
    exit 1
else
    echo "✓ Activity status correct"
fi

echo "All verifications passed"

⚠️ Häufige Fehler

Umgebungsspezifische Fallen

1. DM-Kanäle vs. Guild-Kanäle

  • Symptom: Fix funktioniert in Guild-Kanälen, aber DM-Sitzungen zeigen discord/undefined
  • Ursache: DM-Kanäle haben möglicherweise unterschiedliche ID-Formate oder Sitzungsschlüsselstrukturen
  • Gegenmaßnahme: Sicherstellen, dass die Sitzungsschlüsselableitung sowohl channel- als auch dm-Präfixe verarbeitet

2. Mehrere Sitzungen pro Kanal

  • Symptom: Status zeigt falsche Modelldaten für Multi-Agent-Setups
  • Ursache: Kanal kann mehrere gleichzeitige Sitzungen mit verschiedenen Agenten haben
  • Gegenmaßnahme: Der Fix sollte die agent-Dimension in Sitzungsschlüsseln respektieren (z.B. agent:main:...)

3. Zwischengespeicherter Routenstatus

  • Symptom: Fix scheint zu funktionieren, kehrt aber nach Bot-Neustart zurück
  • Ursache: Alter Routenstatus kann im Speicher zwischengespeichert sein
  • Gegenmaßnahme: Sitzungsspeicher-Cache leeren oder den OpenClaw-Prozess vollständig neu starten

4. Konflikt zwischen nativem Befehl und Nachrichtenbefehl

  • Symptom: Sowohl nativer als auch Nachrichtenpfad-/status zeigen falsche Daten
  • Ursache: Der Sitzungsspeicher-Lookup schlägt möglicherweise unabhängig von der Routenauflösung fehl
  • Debugging: Überprüfen, ob der Sitzungsspeicher zugänglich ist und Einträge für den Zielkanal enthält

Benutzer-Fehlkonfigurationen

5. Fehlende Agent-Konfiguration

  • Symptom: Modell zeigt discord/undefined sogar nach dem Fix
  • Ursache: Kein Standard-Agentenmodell in ~/.openclaw/openclaw.json konfiguriert
  • Lösung: Sicherstellen, dass agents.default.model gesetzt ist:
{
  "agents": {
    "default": {
      "model": "openai-codex/gpt-5.4"
    }
  }
}

6. Discord-native Befehle nicht aktiviert

  • Symptom: Nativer /status führt niemals den nativen Befehlspfad aus
  • Ursache: Native Befehle im Discord Developer Portal oder in der OpenClaw-Konfiguration deaktiviert
  • Lösung: Native Befehle sowohl in den Discord-App-Einstellungen als auch in der OpenClaw-Konfiguration aktivieren

7. Interaktions-Endpunkt-URL falsch konfiguriert

  • Symptom: Native Befehle geben generische Fehler zurück oder fallen auf Nachrichten-Handler zurück
  • Ursache: Falsche INTERACTIONS_ENDPOINT_URL, die auf falsches Deployment zeigt
  • Lösung: Endpunkt-URL überprüfen, die mit der bereitgestellten OpenClaw-Instanz übereinstimmt

Versionsspezifische Überlegungen

8. Build-Hash-Abweichung

  • Symptom: Der Fix referenziert Dateien mit anderen Hash-Suffixen als installierte Version
  • Ursache: Version 2026.4.5 kann mehrere Builds haben
  • Verifizierung: Build-Hash in Statusausgabe bestätigen, die mit dem erwarteten Fix-Ziel übereinstimmt

🔗 Zugehörige Fehler

Logisch verbundene Fehlermuster

  • discord/undefined Modellanzeige — Allgemeines Symptom eines Sitzungseintrags-Auflösungsfehlers über alle Befehlspfade, die auf Routenstatus angewiesen sind
  • no activity Sitzungsstatus — Zeigt an, dass Sitzungsspeicher-Lookup null oder veralteten Eintrag zurückgegeben hat
  • unknown API-Schlüssel-Indikator — Korrelierendes Symptom, wenn Sitzungsmetadaten Provider-/Schlüsselinformationen fehlen
  • Slash-Befehl vs. Nachrichtenbefehl Abweichung — Bezieht sich auf inkonsistentes Routing zwischen Discord-Interaktionstypen

Historischer Kontext

  • Sitzungsschlüsselformat-Änderungen (v2026.x) — Frühere Versionen könnten unterschiedliche Sitzungsschlüsselstrukturen verwendet haben, was zu Lookup-Fehlern führt, wenn Versionen gemischt werden
  • Native Befehl Beta-Einschränkungen — Native Befehle-Funktion wurde als

Belege & Quellen

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