Echo aparece al final del track porque la última habilidad de un ingeniero de sistemas LLM no es construir; es saber qué pasó cuando algo falla. Sin observabilidad, un bug en producción es un misterio: el usuario reporta "el sistema dijo algo raro", y vos no podés ni reproducirlo ni explicarlo.
La solución es vieja: trazas distribuidas, importadas desde el mundo de microservicios pero adaptadas a LLMs.
Los spans se anidan: un agent_loop es un span padre que contiene N spans hijos (uno por tool call). El router es un span padre que contiene un span hijo (el flow que eligió). La forma del trace es un árbol.
Mínimo viable:
{
"span_id": "spn_042",
"parent_span_id": "spn_001",
"name": "rag.retrieve",
"kind": "retrieval",
"started_at": "2026-05-24T12:34:56.123Z",
"duration_ms": 187,
"status": "success",
"input": "¿cuál es el protocolo de coolant?",
"output": "[3 snippets]",
"model": null,
"tokens_used": null,
"cost_usd": null,
"metadata": { "vector_store": "primary", "top_k": 3 }
}Para spans LLM, agregás model, tokens_used (in/out separados), y cost_usd. Para spans de tool, agregás el tool_name y los args.
partial: cuando degradás gracefully (step 14), el status del trace no es ni success ni error. es partial. Sin este valor, perdés visibilidad de la degradación.Las trazas viven en sistemas de observabilidad (Datadog, Honeycomb, OpenTelemetry). Cualquier cosa que pongas ahí es potencialmente leíble por todo tu equipo + el proveedor. Reglas:
[REDACTED]. Nunca recuperable.Una traza que filtra PII en logs es una historia real de violación de datos. Documentá la política de redaction en el schema, no en un wiki que nadie lee.
Escribí el schema (o un ejemplo concreto) de una traza para tu sistema. El judge evalúa 7 criterios sobre la cobertura del schema. trace root, spans, anidación, costo, status, redaction.