🔀 Detecta el merge que se traga una fuente
El nodo fan-in —el punto donde varias ramas paralelas vuelven a unirse en un solo nodo— tiene un modo de falla silencioso: una rama falla o vuelve vacía, y la unión continúa como si estuviera completa. El resultado se ve bien, está incompleto y nadie se da cuenta porque nada dio la alerta.
🆕 ¿Nuevo aquí? Dos palabras antes de seguir
- Fan-in / merge / unión: el nodo donde vuelven a encontrarse varias ramas que se ejecutaron en paralelo (fan-out). Es lo opuesto al fan-out.
- Cardinalidad: cantidad esperada de elementos. Si enviaste 4 ramas, la cardinalidad esperada en la unión es 4. Una cardinalidad incorrecta = alguien desapareció en el camino.
La forma más común de que esto ocurra: despachas una investigación a cuatro fuentes, una API falla, el nodo de esa fuente devuelve una lista vacía (no un error: vacía) y la combinación redacta el informe con tres fuentes como si fueran cuatro. Nadie recibió una excepción ni vio un log en rojo. El informe simplemente está mal.
Qué observar: la línea roja punteada de la fuente C: todavía llega a la unión, pero vacía. El nodo de merge no comprueba la cantidad, así que procesa lo que recibió y sigue. No aparece ningún error. El defecto no está en la fuente que falló, sino en la unión, que no preguntó: "¿recibí los cuatro que envié?".
✓ Unión segura
- ✓Cuenta cuántos elementos llegaron y lo compara con cuántos se enviaron
- ✓Decide explícitamente qué hacer si falta una rama: abortar, seguir señalando el vacío o reintentar
- ✓Registra en el output "3 de 4 fuentes, C no disponible" cuando decides seguir de todos modos
✗ Unión a ciegas
- ✗Fusiona «lo que llegó» sin saber cuánto se esperaba
- ✗Trata una lista vacía igual que una lista con datos: ambas «pasan» en la fusión
- ✗Ningún log ni métrica registra la brecha
Conceptos clave
Dónde se unen las ramas paralelas
¿Recibí los N que envié?
Que esté vacío no es un error, pero debería serlo
Abortar, marcar o volver a intentar
♾️ Rompe el enrutamiento que no converge
Dos aristas condicionales que se apuntan entre sí son la receta más común para que un grafo se quede atascado: el revisor rechaza, el escritor reescribe, el revisor vuelve a rechazar — indefinidamente. El grafo "está funcionando" desde hace horas y el síntoma es exactamente ese: ningún error, solo consumo.
💡 Lo que todo ciclo necesita tener
- •Límite de vueltas — un número máximo de repeticiones, punto final, aunque nadie haya «resuelto» nada
- •Criterio de progreso — dos vueltas sin mejora medible = abandonar y avisar, no seguir intentándolo igual
- •Sin ambos, la factura es infinita: pagas tokens, tiempo y crédito hasta que alguien se dé cuenta manualmente
Qué observar: toda la diferencia está en la tercera arista del lado derecho, la cian, que solo existe porque alguien dibujó una salida de emergencia. Sin ella, el grafo de la izquierda solo tiene dos aristas, y ambas solo saben apuntarse entre sí.
⚠️ Atención: «converge eventualmente» no es un plan
Si tu defensa contra el bucle infinito es «el revisor lo aprobará en algún momento», no tienes ninguna defensa. Escribe el número explícito (p. ej., máximo 3 vueltas) Y el criterio de progreso (p. ej., la puntuación de calidad debe subir en cada vuelta): ambos, no solo uno. Un límite sin criterio de progreso permite que el grafo consuma las 3 vueltas enteras aunque la segunda ya haya demostrado que no va a mejorar.
Conceptos clave
Número máximo, sin excepciones
2 vueltas sin mejorar = detente
Tercera arista hacia afuera del par
Sin límite = sin límite de costo
🚰 Sella el estado que se filtra
Filtración de estado y ocurre cuando un nodo transmite más de lo debido, y el contexto limpio del siguiente nodo deja de estar limpio. El contexto limpio era justamente la ventaja que motivó armar el grafo, y este es el modo de falla que anula esa ventaja silenciosamente, sin romper nada visible.
El ejemplo clásico es el revisor. Si el revisor recibe solo el texto y el criterio de aprobación, juzga con ojos frescos. Si el revisor recibe el razonamiento del escritor junto —«lo pensé así, decidí de esta manera»—, deja de juzgar el resultado y empieza a validar el proceso. En la práctica, vuelve a aprobar el trabajo, porque ahora entiende (y simpatiza con) el motivo detrás de la elección.
Qué observar: solo cambió el contenido de la arista — no la estructura del grafo. Eso es lo que hace que las fugas de estado sean difíciles de detectar en una revisión de código: el diagrama queda idéntico, solo que el payload que circula por la arista se hizo más grande. Auditar las aristas por el schema, no solo por el diseño, es la única forma confiable de detectarlo.
📊 Dónde suele filtrarse sin querer
- Registro de depuración olvidado en el payload — dejaste el «pensamiento en voz alta» del escritor en el campo de salida
- Contexto compartido por conveniencia — un único objeto de sesión que todos los nodos leen y escriben
- Historial completo de la conversación — en vez de recibir solo el resumen, el siguiente nodo recibe la transcripción sin procesar
- Campos «por si acaso» — alguien agrega un campo extra «puede ser útil después» sin revisar si debería filtrarse
Conceptos clave
La arista carga más de lo que debería
La ventaja que prometía el grafo
Un revisor contaminado siempre aprueba
Mismo diagrama, payload diferente
📐 Escribe el state schema
State schema y es la declaración explícita de lo que lleva cada arista: nombre de los campos, formato de cada uno, qué es obligatorio y —tan importante como eso— qué explícitamente no debe pasar. Es el contrato entre dos nodos. Sin contrato, cambiar un lado rompe el otro sin aviso, y nadie sabe de quién es la culpa.
Campos obligatorios
Lo mínimo que necesita el siguiente nodo para funcionar; sin eso, ni siquiera debería empezar.
Ej.: texto e criterio_aprovacao para un revisor.
Campos prohibidos
La parte que la mayoría olvida escribir. Sin eso, «por si acaso» se vuelve la norma.
Ej.: raciocinio_do_escritor NO se lo pases al revisor — es una filtración de estado del tema 3.
Formato y validación
No basta con el nombre del campo — hay que indicar el tipo y, si se puede, validarlo antes de pasarlo.
Ej.: score y es un número entre 0 y 1, no la cadena «ochenta por ciento».
💡 Consejo práctico
Escribe el esquema de estado ANTES de escribir el prompt de cada nodo — en papel o en un JSON de ejemplo. Si no puedes nombrar los campos con claridad, es señal de que los dos nodos todavía están conceptualmente mezclados, y quizá deberían ser uno solo.
Conceptos clave
El contrato de cada arista
Los dos lados deben existir
El esquema define el nodo, no al revés
Contrato claro = falla rastreable
💾 Haz que la ejecución sea duradera
Ejecución duradera y la capacidad de un grafo para sobrevivir a una falla a mitad del camino: retomar exactamente desde donde se detuvo, no volver a ejecutar un nodo que ya terminó con éxito, y ser idempotente — ejecutar la misma entrada dos veces produce el mismo resultado, sin efectos secundarios duplicados.
Esto no es algo nuevo que haya inventado el mundo de los agentes. Es exactamente lo que la orquestación de datos resuelve desde hace décadas con ejecución duradera y caché por nodo (piensa en herramientas de pipelines de datos que reanudan un job trabado sin volver a ejecutar las etapas que ya terminaron). El grafo agéntico hereda esa solución lista: no hace falta reinventarla.
✓ Ejecución duradera
- ✓Cada nodo completo guarda el resultado + el checkpoint antes de continuar
- ✓Tras un fallo, reanuda desde el siguiente nodo pendiente, no desde el inicio
- ✓Misma entrada + mismo grafo = misma ruta (reproducible)
✗ Ejecución frágil
- ✗El grafo se ejecuta de nuevo desde cero después de cualquier fallo
- ✗Que ya envió un correo o guardó un archivo repite la acción al reintentar (no es idempotente)
- ✗Ningún registro de «hasta dónde había llegado»
📊 Tres preguntas para comprobar si tu grafo es duradero
- Si falla en el nodo 4 de 7, ¿qué ocurre al reiniciar? — si la respuesta es «volver a ejecutarlo todo», no es duradero
- ¿Ejecutar un nodo dos veces cambia el resultado en el mundo real? — si sí (correo electrónico duplicado, cobro doble), no es idempotente
- ¿Puedes reproducir exactamente el mismo camino con la misma entrada? — si no, no tienes forma de depurar de verdad
Conceptos clave
Sobrevive a una falla a mitad del proceso
Repetir no cambia el resultado
No rehace lo que ya terminó
La orquestación ya resolvió esto
🖥️ Instrumenta o depura a ciegas
Observabilidad aquí es simple: el harness de grafo debe mostrar qué nodos se ejecutaron, en qué orden, con qué latencia y con qué costo. En un bucle, «¿por qué hizo eso?» queda enterrado en un transcript (el registro sin procesar de la conversación/ejecución) que lees línea por línea. En un grafo, el camino recorrido es un dato que consultas — si existe la instrumentación.
Sin esta instrumentación pagas todo el costo del grafo —más nodos, más aristas, más modos de falla— y no recibes la ventaja que lo justificaba: ver el sistema. Y la instrumentación no es opcional en un grafo como sí era “deseable” en un loop; sin ella, literalmente no tienes cómo responder “dónde se atascó”.
recreación ilustrativa, no es una captura de pantalla de una herramienta real.
Qué observar: la línea roja (coletar_fonte_c) es la alerta del tema 1 apareciendo en tu pantalla: sin este panel, ese timeout se convierte en el "3 de 4 fuentes" silencioso que nadie notó. La línea ámbar muestra el ciclo del tema 2 en la tercera y última vuelta permitida, con el costo acumulado visible: ves que se acerca al límite antes de que exceda el presupuesto.
🧪 Ejemplo práctico: prompt de auditoría de grafo
Objetivo: darle a Claude Code (u otro asistente con acceso a archivos) un
grafo.json describiendo los nodos y las aristas, y pidiéndole que encuentre los cinco defectos de este módulo antes de que lo pongas en producción.
Voce vai auditar o arquivo <grafo.json> deste projeto, que descreve um grafo de agentes (nos, arestas, condicoes). Procure especificamente estes cinco defeitos e reporte cada ocorrencia com o no/aresta exato: 1. CICLO SEM TETO DE VOLTAS Existe algum par de arestas condicionais que formam um ciclo (A -> B -> A) sem um campo tipo "max_voltas" ou equivalente? Se sim, aponte o ciclo. 2. ARESTA CONDICIONAL SEM "QUANDO" Toda aresta que sai de um no de decisao/roteamento declara a condicao sob a qual e seguida? Aponte arestas condicionais sem condicao explicita. 3. CONDICOES QUE NAO COBREM TODOS OS CASOS (ENTRADA ORFA) Some as condicoes de saida de cada no de decisao. Existe um caso possivel (ex.: nem aprovado nem reprovado) que nao tem aresta correspondente? Isso deixa o fluxo sem destino nesse caso. 4. JUNCAO SEM CHECAGEM DE CARDINALIDADE Todo no que recebe de mais de uma aresta (fan-in) tem alguma logica de checagem de quantidade/completude antes de seguir? Aponte juncoes que nao verificam se receberam todos os ramos esperados. 5. NO SEM TETO DE CUSTO Todo no que chama um modelo tem um limite de custo, tokens ou tempo declarado? Aponte nos sem nenhum limite. Para cada defeito encontrado: cite o id do no/aresta, explique o risco em 1 frase, e sugira a correcao minima.
Cómo verificar: ejecuta este prompt contra un grafo que sabes que está roto —
toma uno grafo.json válido y elimina el campo a propósito max_voltas de un ciclo.
Si el asistente no señala exactamente ese ciclo como defecto 1, el prompt es impreciso: reescríbelo y pídele que enumere TODOS los ciclos antes de decidir si hay un límite.
Ahora cámbialo por el tuyo: apunta al tuyo propio
<grafo.json> real. Si aparece más de un defecto, prioriza corregir primero el ciclo sin límite y la unión sin comprobación —
son los dos que más rápido se convierten en una factura infinita o en datos incompletos sin aviso.
Verificación rápida (no bloquea nada): el revisor empieza a aprobarlo todo después de que empezaste a incluir el razonamiento del escritor en la arista que llega hasta él. ¿Cuál es el defecto?
Conceptos clave
Qué nodos, en qué orden, cuánto costó
Registro bruto que lees línea por línea
Tú consultas, no adivinas
Pagas el precio, pierdes la ventaja
📌 Resumen del módulo
Lo que esto cierra:
El grafo no es gratis. Compras paralelismo, contexto limpio y un flujo auditable, y pagas con un esquema de estado, nuevos modos de falla e infraestructura de ejecución/observabilidad. Si no vas a instrumentarlo, probablemente no deberías haber armado el grafo.
Próxima ruta:
Ruta 5 — Manos a la obra: migra un loop real a un grafo, modela grafos de negocio y de tareas, y llévate una biblioteca de prompts listos.