April 21, 2026 • Versión: 2026.2.26

Los subagentes vinculados a hilos de Discord fallan con error 'no_active_run' - Thread-Bound Subagent Spawns Fail with 'no_active_run' on Discord

Las sesiones de subagentes vinculadas a hilos de Discord fallan inmediatamente con el error 'no_active_run' a pesar de tener la configuración y los permisos correctos, mientras que los subagentes sin hilos se inician correctamente.

🔍 Síntomas

Los subagentes vinculados a hilos en canales de Discord finalizan inmediatamente después de que se ejecuta el hook subagent_spawning, generando un error de abort con código no_active_run. Se observan las siguientes manifestaciones técnicas:

  • Ejecución exitosa del hook: El hook subagent_spawning se dispara correctamente y devuelve true, indicando que la solicitud de spawn es válida.
  • Abort inmediato de la sesión: El lane de sesión del subagente falla al inicializarse con un código de abort que indica no_active_run.
  • Falló la creación del lane: A diferencia de los spawns no threaded exitosos, no aparece ninguna entrada lane=session:agent:main:subagent:<uuid> en los logs de runtime.
  • Modo de fallo silencioso: El thread de Discord se crea pero permanece vacío—no aparece ningún mensaje de respuesta del agente dentro del thread.

Comparación de logs de diagnóstico:

# FAILURE CASE — Thread-bound subagent spawn
[INFO] subagent_spawning hook executing for agent=example-agent
[INFO] subagent_spawning hook completed: spawn_requested=true
[ABORT] subagent session aborted: reason=no_active_run, session_id=<uuid>
[DEBUG] lane creation skipped: no active run context available

# SUCCESS CASE — Non-threaded subagent spawn
[INFO] subagent_spawning hook executing for agent=example-agent
[INFO] subagent_spawning hook completed: spawn_requested=true
[INFO] lane created: session:agent:main:subagent:<uuid>
[INFO] subagent session initialized: agent=example-agent

Contexto de configuración:

# Relevant configuration flags (all enabled)
channels:
  discord:
    threadBindings:
      enabled: true
    spawnSubagentSessions: true

session:
  threadBindings:
    enabled: true

🧠 Causa raíz

El error no_active_run en los spawns de subagentes vinculados a threads se debe a una condición de carrera en la propagación del contexto entre el establecimiento del thread de Discord y la creación del lane de sesión del subagente.

Secuencia técnica del fallo:

  1. Fase de creación del thread: OpenClaw inicia un enlace de thread de Discord mediante la API channel.discord.createThread(). Esta es una operación de E/S asíncrona.
  2. Creación prematura del lane: El subsistema de sesión del subagente intenta crear el lane session:agent:main:subagent:<uuid> antes de que el contexto del thread esté completamente establecido y vinculado al run padre.
  3. Falló la resolución del contexto: La creación del lane requiere un contexto de run activo (RunContext) con una propiedad thread_id válida. Como el thread no ha sido confirmado por la API de Discord, la resolución del contexto devuelve null o un contexto incompleto.
  4. Disparador del abort: El subsistema de sesión interpreta el contexto faltante como no_active_run y termina el spawn antes de que se complete el enlace del thread.

Inconsistencia arquitectónica:

La ruta de spawn no vinculada a threads omite completamente la resolución del contexto del thread—el lane de sesión se crea inmediatamente dentro del contexto de run existente. La ruta con threads introduce una cadena de dependencias:

spawnSubagent()
  └─> createThread() [async Discord API call]
       └─> resolveRunContext() [requires thread_id]
            └─> createSessionLane() [fails if context incomplete]
                 └─> ABORT: no_active_run

La latencia de ida y vuelta de la API de Discord (típicamente 100-500ms) crea una ventana donde la inicialización de la sesión procede sin un contexto de thread válido. El flag spawnSubagentSessions habilita el spawn pero no tiene en cuenta el ciclo de vida del enlace de thread asíncrono.

🛠️ Solución paso a paso

Existen dos rutas de remediación dependiendo de las restricciones del despliegue.

Opción A: Habilitar enlace de thread síncrono (Recomendado)

Configurar el canal de Discord para usar establecimiento síncrono de thread, lo cual bloquea la creación del lane hasta que el thread sea confirmado:

# config.yaml
channels:
  discord:
    threadBindings:
      enabled: true
      syncMode: "blocking"  # <-- ADD THIS FLAG
    spawnSubagentSessions: true

session:
  threadBindings:
    enabled: true

Opción B: Diferir la creación del lane del subagente

Si el modo síncrono causa timeouts en entornos de alta latencia, implementar un patrón de spawn diferido usando el hook subagent_spawning:

// hooks/subagent_spawning.ts
export async function subagent_spawning(ctx, next) {
  const isThreadBound = ctx.spawnOptions?.thread === true;
  
  if (isThreadBound) {
    // Wait for thread confirmation before proceeding
    const threadId = await ctx.agent.context.getDiscordThreadId();
    
    if (!threadId) {
      // Retry after Discord API confirmation
      await new Promise(resolve => setTimeout(resolve, 500));
      const retryThreadId = await ctx.agent.context.getDiscordThreadId();
      
      if (!retryThreadId) {
        return ctx.abort("thread_not_confirmed", {
          message: "Discord thread not ready for subagent spawn"
        });
      }
    }
  }
  
  return next();
}

Opción C: Deshabilitar el enlace de thread para subagentes (Solución alternativa)

Si se requieren spawns inmediatos y el contexto del thread no es crítico para los subagentes:

# config.yaml — Selective thread binding
channels:
  discord:
    threadBindings:
      enabled: true
    spawnSubagentSessions: true
    subagentThreadBinding: false  # <-- ADD THIS FLAG

session:
  threadBindings:
    enabled: true

🧪 Verificación

Después de aplicar la corrección, verifique que el spawn del subagente tenga éxito revisando tanto los logs de runtime como la actividad del thread de Discord.

Paso 1: Reinicie el agente OpenClaw con la configuración actualizada.

# Stop and restart the agent
> Ctrl+C
> openclaw start --config ./config.yaml

[INFO] OpenClaw v2026.2.26 initializing...
[INFO] Loading channel: discord
[INFO] Discord channel ready: guild_id=123456789
[INFO] Thread binding mode: synchronous (blocking)

Paso 2: Dispare un spawn de subagente vinculado a thread.

Envíe un mensaje en un thread de Discord que invoque un subagente con el enlace de thread habilitado.

Paso 3: Confirme la creación del lane en los logs.

# Expected log output after fix
[INFO] subagent_spawning hook executing for agent=example-agent
[INFO] Creating Discord thread for subagent session
[INFO] Thread created: channel_id=987654321, thread_id=111222333
[INFO] lane created: session:agent:main:subagent:aaa111bbb222
[INFO] subagent session initialized: agent=example-agent
[INFO] Subagent message dispatched to thread_id=111222333

Paso 4: Verifique que el thread de Discord contenga la respuesta del subagente.

Verifique que el thread de Discord ahora contenga:

  • Un mensaje inicial del subagente confirmando el spawn
  • El identificador lane=session:agent:main:subagent:<uuid> en el tema o primer mensaje del thread
  • Capacidad interactiva (responde a mensajes de seguimiento)

Paso 5: Validación del código de salida.

# Verify no abort codes in recent logs
> openclaw logs --tail 100 | grep -E "(ABORT|no_active_run)"

# Expected: no output (no abort errors)

⚠️ Errores comunes

  • Interpretar erróneamente el éxito del hook como éxito del spawn: El hook subagent_spawning devolviendo true solo confirma que la solicitud de spawn es válida—no garantiza que la sesión del subagente se haya inicializado. Siempre verifique los logs de creación del lane.
  • Permisos insuficientes de Discord: Incluso con Create Public Threads, Send Messages in Threads y Manage Threads, la falta del permiso Read Message History puede causar que las operaciones de thread fallen silenciosamente. Verifique todos los permisos relacionados con threads.
  • Problemas de separadores de ruta en Windows: En Windows, los archivos de configuración que usan barras inclinadas hacia adelante en las rutas de enlace de thread pueden no resolverse correctamente. Use rutas con doble escape o separadores nativos del entorno:
    # Incorrect on Windows
    threadLogPath: C:\openclaw\threads\
    

    Correct

    threadLogPath: C:\openclaw\threads\

    or

    threadLogPath: C:/openclaw/threads/

  • Condición de carrera con spawns rápidos: Si múltiples subagentes se generan simultáneamente en el mismo thread, la API de Discord puede devolver rate_limit_exceeded. Implemente retroceso exponencial:
    async function spawnWithBackoff(fn, maxRetries = 3) {
      for (let i = 0; i < maxRetries; i++) {
        try {
          return await fn();
        } catch (e) {
          if (e.code === "RATE_LIMITED" && i < maxRetries - 1) {
            await sleep(Math.pow(2, i) * 1000);
          } else throw e;
        }
      }
    }
    
  • Desajuste de versión con el módulo de enlace de thread: El flag syncMode: "blocking" requiere OpenClaw v2026.2.26+. Verifique la compatibilidad de versiones:
    > openclaw --version
    OpenClaw v2026.2.26 (bc50708)  # ✓ Compatible
    
  • Entornos containerizados (Docker): Cuando ejecute OpenClaw en Docker, asegúrese de que el token del bot de Discord se pase como variable de entorno, no codificado. El enlace de thread puede fallar si el proceso del bot no puede acceder al token durante la llamada asíncrona a la API de Discord:
    # docker-compose.yml
    environment:
      - DISCORD_BOT_TOKEN=${DISCORD_BOT_TOKEN}
      - OC_THREAD_BINDING_MODE=synchronous
    

🔗 Errores relacionados

  • no_active_run — La inicialización de la sesión falla cuando no existe un contexto de run activo. Puede ocurrir al generar subagentes antes de que el contexto del run padre esté completamente establecido, particularmente en operaciones asíncronas de canales.
  • thread_not_confirmed — La creación del thread de Discord succeeded a nivel de API pero el contexto del thread aún no está disponible para el subsistema de sesión. Indica problemas de temporización en el enlace de thread.
  • lane_creation_skipped — El lane de sesión no fue creado porque la resolución del contexto devolvió null o datos incompletos. Es posterior a no_active_run en la cadena de fallos.
  • rate_limit_exceeded — Limitación de tasa de la API de Discord durante la creación rápida de threads. Puede causar fallos en cascada en los spawns cuando múltiples subagentes vinculados a threads se solicitan simultáneamente.
  • Referencia histórica: Issue #892 — "Subagent spawn in DM channels fails silently" (OpenClaw v2026.1.x). Problema relacionado de propagación de contexto resuelto al asegurar que el contexto del run se hereda antes de la creación de la sesión.
  • Referencia histórica: Issue #1047 — "Discord thread binding delays cause message ordering issues". Documenta el problema de latencia asíncrona de la API de Discord que subyace al fallo actual del spawn vinculado a threads.

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.