PTENES
Saltar al contenido
MÓDULO 4.3

🔭 Fallas, harness y observabilidad

Aquí está el precio del grafo. Fan-in que se traga una fuente, ciclo que no converge, estado que se filtra de un nodo a otro. Este módulo muestra los tres modos de falla que solo existen porque armaste un grafo, y cómo instrumentarlo para no descubrir cada uno de ellos en producción.

6
Temas
45
Minutos
Avanzado
Nivel
Práctica
Tipo
Progreso de este módulo
0%0 de 6
1

🔀 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.

fuente A fuente B fuente C ✗ fuente D unión (merge) Llegaron 3 de 4 fuentes — la fusión no lo comprobó y siguió como si estuviera completo

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

Fan-in

Dónde se unen las ramas paralelas

Cardinalidad

¿Recibí los N que envié?

Falla silenciosa

Que esté vacío no es un error, pero debería serlo

Decisión explícita

Abortar, marcar o volver a intentar

2

♾️ 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
SIN LÍMITE — se bloquea escritor revisor ∞ reprueba → reescribe → reprueba → reescribe... CON LÍMITE — converge escritor revisor vuelta 2 de 3 se rinde y avisa

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

Límite de vueltas

Número máximo, sin excepciones

Criterio de progreso

2 vueltas sin mejorar = detente

Salida de emergencia

Tercera arista hacia afuera del par

Factura infinita

Sin límite = sin límite de costo

3

🚰 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.

estado compacto escritor revisor texto + criterio el revisor evalúa con ojos frescos estado filtrado escritor revisor texto + criterio + razonamiento vuelve a sellar el trabajo

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

Filtración de estado

La arista carga más de lo que debería

Contexto limpio

La ventaja que prometía el grafo

Marca de vuelta

Un revisor contaminado siempre aprueba

Falla silenciosa

Mismo diagrama, payload diferente

4

📐 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.

1

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.

2

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.

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

State schema

El contrato de cada arista

Obligatorio vs. prohibido

Los dos lados deben existir

Antes del prompt

El esquema define el nodo, no al revés

Sin culpa compartida

Contrato claro = falla rastreable

5

💾 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

Ejecución duradera

Sobrevive a una falla a mitad del proceso

Idempotente

Repetir no cambia el resultado

Caché por nodo

No rehace lo que ya terminó

Herencia de datos

La orquestación ya resolvió esto

6

🖥️ 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ó”.

monitor de ejecución — grafo:daily_brief#run_4821
✓ coletar_fonte_a1.2s · $0.003
✓ coletar_fonte_b0.9s · $0.002
✗ coletar_fonte_c4.0s · timeout
⧗ revisor (vuelta 3 de 3)en ejecución · $0.041 acum.
○ juncao_finalesperando

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

Observabilidad

Qué nodos, en qué orden, cuánto costó

Transcripción

Registro bruto que lees línea por línea

Ruta como dato

Tú consultas, no adivinas

Sin instrumento

Pagas el precio, pierdes la ventaja

📌 Resumen del módulo

✓
La unión debe comprobar la cardinalidad — ¿recibiste los N que enviaste? Decide explícitamente qué hacer con lo que faltó.
✓
Todo ciclo necesita un límite y un criterio de progreso — sin los dos, la factura es infinita.
✓
La filtración de estado anula el grafo — un contexto contaminado hace que el revisor vuelva a aprobar automáticamente.
✓
State schema es el contrato — obligatorio y prohibido; deben existir ambos lados.
✓
Ejecución duradera e idempotente — retoma sin rehacer, repite sin duplicar el efecto.
✓
Sin observabilidad, pagas y no recibes nada — el camino recorrido debe ser un dato que se pueda consultar.

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.