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_spawningse dispara correctamente y devuelvetrue, 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:
- 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. - 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. - Falló la resolución del contexto: La creación del lane requiere un contexto de run activo (
RunContext) con una propiedadthread_idválida. Como el thread no ha sido confirmado por la API de Discord, la resolución del contexto devuelvenullo un contexto incompleto. - Disparador del abort: El subsistema de sesión interpreta el contexto faltante como
no_active_runy 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_spawningdevolviendotruesolo 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 ThreadsyManage Threads, la falta del permisoRead Message Historypuede 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 OpenClawv2026.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 ano_active_runen 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.