April 22, 2026 • Versión: 2026.4.5

[Error del comando /status de Discord mostrando discord/undefined sin actividad] - Discord Native /status Reports 'discord/undefined' and No Activity for Active Channel Sessions

El comando nativo /status de Discord muestra incorrectamente Modelo: discord/undefined, cero contexto y sin actividad incluso cuando hay una sesión de canal válida activa. La causa raíz es una falta de búsqueda de sessionEntry en la ruta del comando nativo.


🔍 Síntomas

Manifestaciones visibles para el usuario

Al ejecutar el comando nativo de Discord /status en un canal de guild con una sesión activa, se devuelve la siguiente salida incorrecta:

🦞 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)

En algunas observaciones, la clave de sesión muestra el ID de canal correcto pero los metadatos permanecen incorrectos:

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

Contraste con el estado del camino de mensajes funcional

Cuando la sesión del mismo canal se consulta a través del camino normal de mensajes (agregando /status dentro de un mensaje regular), la salida es correcta:

🦞 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

Indicadores clave de diagnóstico

  • Campo Model muestra la cadena literal discord/undefined en lugar del modelo configurado (ej., openai-codex/gpt-5.4)
  • Campo Context muestra 0/... en lugar del porcentaje de uso real
  • Campo Session muestra el sufijo no activity en lugar de updated just now
  • Clave de sesión puede referenciar discord/slash:... en lugar de discord:channel:... con el ID de canal correcto

Condiciones del entorno

  • Versión de OpenClaw: 2026.4.5 (build 3e72c03)
  • Método de instalación: npm global
  • Sistema operativo: Linux 5.15.0-171-generic (x64)
  • Modo Discord: Guild-channel con comandos nativos habilitados
  • Modelo de agente predeterminado: openai-codex/gpt-5.4

🧠 Causa raíz

Análisis arquitectónico

El error se origina en una resolución faltante de entrada de sesión en la tubería de enrutamiento de comandos nativos de Discord. El camino de código del comando nativo /status intenta leer routeState.sessionEntry para poblar los metadatos de estado, pero esta propiedad nunca es poblada por la función de resolución de ruta ascendente.

Desglose del flujo de código

1. Punto de entrada: Invocación de comando nativo

Cuando un usuario invoca /status como un comando nativo (slash) de Discord, la solicitud entra en:

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

2. Fallo en la resolución de sesión

En provider-DR2mO1YM.js, la rama nativa /status referencia routeState.sessionEntry:

// Representación de pseudocódigo del camino de código problemático
const routeState = resolveDiscordNativeInteractionRouteState(interaction);
const sessionEntry = routeState.sessionEntry; // ← ESTO ES undefined

if (!sessionEntry) {
    // Recurre a metadatos del payload slash
    displayStatus(slashPayloadMetadata);
}

3. Brecha en la resolución del estado de ruta

La función resolveDiscordNativeInteractionRouteState() retorna:

{
    route: "...",           // ✓ Proporcionado
    effectiveRoute: "...",   // ✓ Proporcionado
    binding: {...},         // ✓ Proporcionado
    sessionEntry: undefined  // ✗ FALTANTE
}

La función proporciona metadatos de enrutamiento (route, effectiveRoute, binding) pero nunca pobla sessionEntry, dejándola como undefined.

4. Construcción de contexto con valores predeterminados hardcodeados

Cuando sessionEntry es undefined, buildDiscordNativeCommandContext() se ejecuta con datos faltantes. Esta función:

  • Hardcodea el proveedor como la cadena literal "discord"
  • Falla al resolver el modelo configurado real desde la configuración del agente
  • No puede buscar la sesión activa del canal desde el almacén de sesiones

5. Falla en cascada hacia la visualización del estado

El motor de renderizado de estado recibe:

{
    provider: "discord",
    model: undefined,       // Resulta en "discord/undefined"
    contextUsage: 0,        // Resulta en "0/200k (0%)"
    sessionKey: "discord/slash:..." // Tipo de sesión incorrecto
}

Por qué el camino de mensajes funciona

La búsqueda de estado por camino de mensajes normal usa un camino de código diferente que:

  1. Resuelve el ID del canal desde el contexto del mensaje
  2. Consulta el almacén de sesiones directamente por agent:main:discord:channel:{channelId}
  3. Extrae el modelo real, uso de contexto y marca de tiempo de última actividad desde la entrada de sesión almacenada

Este camino evita la función rota resolveDiscordNativeInteractionRouteState() por completo.

Explicación de la discrepancia en la clave de sesión

La clave de sesión muestra discord/slash:{interactionId} en lugar de discord:channel:{channelId} porque:

  • El camino alternativo usa el ID del comando de interacción como identificador de sesión
  • Nunca resuelve la entrada de sesión del canal padre
  • El camino correcto derivaría el ID del canal desde el contexto del canal de la interacción

🛠️ Solución paso a paso

Solución temporal (Inmediata)

Hasta que se implemente la corrección, usa la consulta de estado por camino de mensajes:

Antes (Roto - Comando nativo):

/status

Después (Funciona - Camino de mensajes):

cualquier contenido de mensaje /status

Esto fuerza el camino de enrutamiento de mensajes que resuelve correctamente la sesión del canal.

Corrección permanente (Para mantenedores)

La corrección requiere modificaciones a dos funciones en la tubería de comandos nativos de Discord:

Corrección 1: Poblar sessionEntry en la resolución de ruta

Archivo: provider-DR2mO1YM.js (o bundle equivalente)

Antes:

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

Después:

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
    };
}

Corrección 2: Manejar modelo faltante en el contexto de estado

Archivo: Función buildDiscordNativeCommandContext

Antes:

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

Después:

function buildDiscordNativeCommandContext(sessionEntry, routeState) {
    // Si sessionEntry falta en routeState, intentar búsqueda directa
    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(),
        // ...
    };
}

Corrección 3: Derivar la clave de sesión correcta para la visualización de estado

Archivo: status-yaHSTeGo.js (renderizado de estado)

Antes:

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

Después:

function resolveStatusSessionKey(routeState) {
    if (routeState.sessionEntry) {
        return routeState.sessionEntry.key;
    }
    // Alternativa a clave basada en canal, no ID de interacción slash
    const channelId = routeState.binding?.channelId;
    return channelId 
        ? `agent:main:discord:channel:${channelId}`
        : `discord/slash:${interaction.id}`;
}

🧪 Verificación

Caso de prueba 1: Estado de comando nativo en sesión de canal activa

Configuración:

  • Asegurar que existe una sesión para un ID de canal conocido (ej., 1490775030236450876)
  • Verificar que la sesión tiene uso de contexto no cero

Ejecución:

/status

Salida esperada:

🦞 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)

Criterios de aprobación:

  • El campo Model muestra openai-codex/gpt-5.4 (no discord/undefined)
  • El contexto muestra porcentaje no cero
  • La clave de sesión referencía discord:channel:{channelId}
  • La sesión muestra updated just now (no no activity)

Caso de prueba 2: Comparación con estado de camino de mensajes

Ejecución:

¿Cuál es el estado actual? /status

Verificación: La salida del comando nativo y la salida del camino de mensajes deben mostrar idéntico:

  • Nombre del modelo
  • Porcentaje de contexto
  • Clave de sesión
  • Marca de tiempo de última actividad

Caso de prueba 3: Estado de nueva sesión (Sin sesión de canal activa)

Configuración: Invocar /status en un canal sin sesión previa.

Salida esperada:

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

Criterios de aprobación:

  • La clave de sesión aún muestra discord:channel:{channelId} (no discord/slash:...)
  • El campo Model debe mostrar el modelo predeterminado configurado (no discord/undefined)

Caso de prueba 4: Comportamiento de canal Guild vs DM

Ejecución: Probar /status tanto en canales de texto de guild como en canales DM.

Criterios de aprobación: Ambos tipos de canal deben mostrar comportamiento de resolución de sesión consistente con claves de sesión basadas en canal correctas.

Script de verificación automatizada

#!/bin/bash
# Verificar corrección de /status nativo de Discord

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

# Capturar salida de /status (requiere API de Discord o harness de prueba)
STATUS_OUTPUT=$(get_discord_status_output)

# Verificar campo Model
if echo "$STATUS_OUTPUT" | grep -q "Model: $EXPECTED_MODEL"; then
    echo "✓ Campo Model correcto"
else
    echo "✗ Campo Model incorrecto"
    exit 1
fi

# Verificar formato de clave de sesión
if echo "$STATUS_OUTPUT" | grep -q "Session: $EXPECTED_SESSION_PREFIX"; then
    echo "✓ Clave de sesión correcta"
else
    echo "✗ Clave de sesión incorrecta"
    exit 1
fi

# Verificar que indicador de no actividad NO esté presente
if echo "$STATUS_OUTPUT" | grep -q "• no activity"; then
    echo "✗ Aún muestra 'no activity' para sesión activa"
    exit 1
else
    echo "✓ Estado de actividad correcto"
fi

echo "Todas las verificaciones pasaron"

⚠️ Errores comunes

Trampas específicas del entorno

1. Canales DM vs Canales Guild

  • Síntoma: La corrección funciona en canales guild pero las sesiones DM muestran discord/undefined
  • Causa: Los canales DM pueden tener formatos de ID o estructuras de clave de sesión diferentes
  • Mitigación: Asegurar que la derivación de clave de sesión maneje ambos prefijos channel y dm

2. Múltiples sesiones por canal

  • Síntoma: El estado muestra datos del modelo incorrecto para configuraciones multi-agente
  • Causa: El canal puede tener múltiples sesiones concurrentes con diferentes agentes
  • Mitigación: La corrección debe respetar la dimensión agent en las claves de sesión (ej., agent:main:...)

3. Estado de ruta en caché

  • Síntoma: La corrección parece funcionar pero revierte después de reiniciar el bot
  • Causa: El estado de ruta antiguo puede estar en caché en memoria
  • Mitigación: Limpiar la caché del almacén de sesiones o reiniciar completamente el proceso de OpenClaw

4. Conflicto entre comando nativo y comando de mensaje

  • Síntoma: Ambos /status nativo y de camino de mensajes muestran datos incorrectos
  • Causa: La búsqueda en el almacén de sesiones puede estar fallando independientemente de la resolución de ruta
  • Depuración: Verificar que el almacén de sesiones es accesible y contiene entradas para el canal objetivo

Configuraciones incorrectas del usuario

5. Configuración de agente faltante

  • Síntoma: El modelo muestra discord/undefined incluso después de la corrección
  • Causa: No hay modelo de agente predeterminado configurado en ~/.openclaw/openclaw.json
  • Corrección: Asegurar que agents.default.model esté configurado:
{
  "agents": {
    "default": {
      "model": "openai-codex/gpt-5.4"
    }
  }
}

6. Comandos nativos de Discord no habilitados

  • Síntoma: El comando nativo /status nunca ejecuta el camino de comando nativo
  • Causa: Comandos nativos deshabilitados en Discord Developer Portal o configuración de OpenClaw
  • Corrección: Habilitar comandos nativos tanto en la configuración de la aplicación Discord como en la configuración de OpenClaw

7. URL del endpoint de interacción mal configurada

  • Síntoma: Los comandos nativos devuelven errores genéricos o caen en los manejadores de mensajes
  • Causa: INTERACTIONS_ENDPOINT_URL incorrecta apuntando a despliegue incorrecto
  • Corrección: Verificar que la URL del endpoint coincide con la instancia de OpenClaw desplegada

Consideraciones específicas de versión

8. Discrepancia en hash de build

  • Síntoma: La corrección referencia archivos con diferentes sufijos hash que la versión instalada
  • Causa: La versión 2026.4.5 puede tener múltiples builds
  • Verificación: Confirmar que el hash del build en la salida de estado coincide con el objetivo de la corrección esperada

🔗 Errores relacionados

Patrones de error lógicamente conectados

  • Visualización de modelo discord/undefined — Síntoma general de fallo en la resolución de entrada de sesión a través de cualquier camino de comando que dependa del estado de ruta
  • Estado de sesión no activity — Indica que la búsqueda en el almacén de sesiones devolvió null o una entrada obsoleta
  • Indicador de clave API unknown — Síntoma correlacionado cuando faltan metadatos de sesión de proveedor/información de clave
  • Divergencia entre comando slash y comando de mensaje — Relacionado con el enrutamiento inconsistente entre tipos de interacción de Discord

Contexto histórico

  • Cambios en formato de clave de sesión (v2026.x) — Las versiones anteriores pueden haber usado estructuras de clave de sesión diferentes, causando fallos de búsqueda al mezclar versiones
  • Limitaciones beta de comandos nativos — La funcionalidad de comandos nativos fue notada como beta; este error puede estar relacionado con implementación incompleta de vinculación de sesión
  • Manejo de sesión de canal vs DM — Problemas anteriores con sesiones DM que no persisten correctamente pueden compartir patrones de causa raíz con este error

Issues relacionados de GitHub

  • Metadatos de sesión faltantes para comandos nativos — Issue de seguimiento general para propagación de contexto de comando nativo
  • Resolución de modelo del proveedor Discord — Fallos de resolución de modelo específico del proveedor a través de tipos de comando de Discord
  • Gestión del ciclo de vida del estado de ruta — Problemas con el estado de ruta que no se mantiene correctamente a través de las fases de interacción

Comandos de diagnóstico para problemas relacionados

# Verificar contenido del almacén de sesiones
openclaw session list --filter discord

# Verificar resolución de ruta en modo debug
DEBUG=openclaw:route openclaw start

# Volcar entrada de sesión para canal objetivo
openclaw session dump agent:main:discord:channel:1490775030236450876

Evidencia y fuentes

Esta guía de solución de problemas fue sintetizada automáticamente por la tubería de inteligencia de FixClaw a partir de las discusiones de la comunidad.