Lección 2: Evidencia de primera mano: la transcripción cruda, no el autorreporte
Objetivos de aprendizaje:
- Entender por qué el autorreporte de un agente es una fuente secundaria, y saber a qué lugares concretos de la transcripción apunta «lo que omite suele ser más importante que lo que incluye»
- Reconocer qué cuenta como transcripción cruda: por cada llamada a herramienta de una ejecución, el nombre de la herramienta y los parámetros completos; por cada respuesta de herramienta, el valor de retorno completo o el error; y poder localizar un comportamiento sospechoso hasta «qué campo del mensaje N»
- Usar las cuatro preguntas (herramienta equivocada, parámetros equivocados, muy pocas llamadas, respuesta mal manejada) para leer una transcripción hasta una conclusión clasificada, y saber cuáles preguntas puede responder un lector humano frente a cuáles habría que delegar a programas
Requisitos: Completar la Lección 1 y entender cómo el no determinismo rompe «reproducir y depurar», y cómo un síntoma puede esconder varias causas indistinguibles | Anterior: << Lección 1 | Siguiente: Lección 3 >>
Dijo que había contrastado tres fuentes
Un agente de investigación termina su ejecución y te da un resumen:
Busqué en tres fuentes autorizadas y las contrasté entre sí. Los datos son consistentes.
Le crees. La frase suena profesional, medida, y explica su método por iniciativa propia. Le mandas los resultados al equipo de negocio.
Tres semanas después llega una queja: ese número está tremendamente mal. Abres la transcripción cruda de esa ejecución y la lees mensaje por mensaje — solo hizo una llamada de búsqueda exitosa; la segunda llamada fue una descarga de página que devolvió un error de timeout de una línea; la tercera llamada nunca ocurrió. Las palabras «las contrasté» existen únicamente en el resumen que te dio.
Esto no es que el modelo mienta — cuando escribió esa frase, no había ningún «conteo de contrastes» que consultar. Solo estaba continuando con lo que sonaba como un cierre apropiado. El costo, en cambio, es real: confiaste en el autorreporte, te saltaste la transcripción y gastaste tres semanas en descubrir que esta ejecución se rompió en el paso dos.
La conclusión de la Lección 1 fue: los agentes son no deterministas entre ejecuciones, la intuición tradicional de «reprodúcelo y pon un punto de interrupción» falla de plano, y el camino adelante es hacer que la propia ejecución deje evidencia. El Curso 10 de esta serie mencionó de pasada, en el contexto de evaluación y calificación, que «el autorreporte de un agente no se puede usar como evidencia». Esta lección lo expande a un protocolo de lectura.
Los autorreportes son fuentes secundarias
Los autorreportes que te da un agente —resúmenes de cierre, cadena de pensamiento (el razonamiento que el modelo escribe antes de dar una respuesta, abreviado CoT de aquí en adelante), autoevaluaciones después de ejecutar una herramienta— son todos su escritura sobre sí mismo. Esos textos sirven, pero los separa una capa de «lo que realmente hizo».
El aspecto más dañino de esa capa no es que escriba algo equivocado, sino que no escriba nada. El artículo de ingeniería de herramientas de Anthropic lo dice sin rodeos: lo que los agentes omiten en su retroalimentación y sus respuestas a menudo puede ser más importante que lo que incluyen; los LLM no siempre dicen lo que quieren decir1. La omisión es más difícil de tratar que el error — con un error quizá detectes la contradicción; con una omisión ni siquiera tienes la oportunidad. En el ejemplo de arriba, no escribió «la descarga de la segunda fuente falló» — simplemente no la mencionó, y las piezas faltantes no levantan la mano.
Así que la secuencia es: leer su razonamiento y su retroalimentación (el CoT) puede ayudarte a encontrar asperezas, pero para atrapar comportamiento no descrito explícitamente en el CoT necesitas mirar la transcripción cruda, incluidas las llamadas a herramientas y sus respuestas1. El CoT es una pista; la transcripción es evidencia. Invierte estas dos cosas y concluirás una y otra vez «dijo que lo hizo, así que probablemente lo hizo».
En la práctica: toma cada número concreto del autorreporte y rastréalo de vuelta a la transcripción. Si no puedes encontrar su origen ni derivarlo de números que estén en la transcripción, entonces es algo que el modelo generó.
Qué cuenta como «transcripción cruda»
Una «transcripción cruda» no es nada nuevo. Construiste una a mano en el Curso 7 de esta serie: ese arreglo messages. Cada iteración del bucle agrega un mensaje de asistente y después agrega un mensaje de usuario que lleva el resultado de la herramienta. Cuando una tarea termina, lo que queda asentado en el arreglo es la transcripción cruda de esa ejecución.
Extiéndela y verás dos tipos de bloque. Un bloque tool_use es el modelo nombrando qué herramienta llamar, y contiene el nombre de la herramienta y un objeto de parámetros completo que el modelo generó. Un bloque tool_result es lo que el arnés devuelve después de ejecutar realmente la herramienta — si tuvo éxito, el valor de retorno completo; si falló, el contenido del error más un marcador de error. Los dos bloques deben leerse como par: mirar solo tool_use te dice qué quería hacer; mirar solo tool_result te dice qué devolvió el entorno.
¿Por qué califican como evidencia? El artículo de Anthropic sobre patrones de agentes lo explica desde la perspectiva del propio agente: durante la ejecución, el agente debe obtener «ground truth» del entorno en cada paso (como resultados de llamadas a herramientas o ejecución de código) para evaluar su progreso2. El mismo lote de datos te sirve a ti — él juzga dónde está por estos datos; tú juzgas dónde está por los mismos.
El mismo artículo también da un principio de diseño: prioriza la transparencia mostrando explícitamente los pasos de planificación del agente2. Esto suele tratarse como una recomendación de interfaz, pero su implicación para la depuración es más concreta — cualquier acción que no aterrice en una frontera de herramienta no deja rastro en la transcripción. Que el modelo «compare dos conjuntos de datos en su cabeza» no deja rastro; llamar a una herramienta diff sí. Si quieres que algo sea auditable, tienes que empujarlo hasta la frontera de herramienta.
La revisión humana atrapa lo que las evaluaciones no ven
A esta altura alguien preguntará: ¿el Curso 10 no acababa de construir un conjunto de evaluación? ¿Por qué no ejecutar las puntuaciones y listo? ¿Para qué tener humanos hojeando transcripciones mensaje por mensaje?
Porque los conjuntos de evaluación solo atrapan los fallos que ya se te ocurrieron. La evaluación humana atrapa lo que la automatización no ve. Las personas que prueban agentes encuentran casos límite que las evaluaciones no ven. Entre ellos hay respuestas alucinadas ante consultas inusuales, fallos del sistema o sesgos sutiles en la selección de fuentes3. La tercera categoría vale la pena examinarla: en el sistema multiagente de investigación de Anthropic, los evaluadores humanos notaron que los agentes tempranos elegían de forma consistente granjas de contenido optimizadas para SEO por encima de fuentes autorizadas pero peor rankeadas, como PDF académicos o blogs personales3.
Este sesgo es casi invisible en las evaluaciones: las respuestas no son necesariamente incorrectas —las granjas de contenido también copian hechos correctos— y las puntuaciones se siguen viendo bien. Está escrito en exactamente un lugar: la ristra de URL que realmente eligió, ahí sentada en la transcripción.
La capa de herramientas tiene ejemplos del mismo tipo. Cuando se lanzó la herramienta de búsqueda web de Claude, el equipo identificó que Claude estaba agregando innecesariamente 2025 al parámetro query de la herramienta, sesgando los resultados de búsqueda y degradando el rendimiento; el arreglo fue mejorar la descripción de la herramienta para dirigir a Claude en la dirección correcta1. Este bug no se cae, no lanza errores, no da timeout. La herramienta devuelve exitosamente cada vez, con resultados de búsqueda legítimos. Las métricas podrían decirte «el rendimiento se degradó»; para poder señalar con el dedo «se degradó porque hay un 2025 en query» hace falta leer los parámetros línea por línea.
Las transcripciones no son solo para lectores humanos
La sección anterior invita a un malentendido: leer transcripciones = ojos humanos, línea por línea. No es así — las transcripciones son texto estructurado, y los modelos son muy buenos leyéndolas. El artículo de ingeniería de herramientas da un método casi brutal: simplemente concatena las transcripciones de tus agentes de evaluación y pégalas en Claude Code. Claude es experto en analizar transcripciones y puede refactorizar montones de herramientas de una sola vez — por ejemplo, para asegurar que las implementaciones y las descripciones de las herramientas sigan siendo consistentes entre sí cuando se hacen cambios nuevos1.
El cuello de botella de «leer transcripciones» es la paciencia, no la inteligencia. Así que la división del trabajo es clara: los modelos son buenos para el barrido general, comprimiendo un lote de transcripciones en una lista de sospechosos; los humanos son buenos para los juicios cualitativos — decidir si las muestras que salieron realmente cuentan como problemas.
El formato de transcripción de otros es su implementación interna
Ya que las transcripciones son tan importantes, ¿no puedes simplemente leer las transcripciones ya hechas que los productos existentes dejan en disco? Toma Claude Code como ejemplo: persiste las transcripciones de sesión en archivos ~/.claude/projects/*/*.jsonl4. Se ve ideal: una línea por mensaje, ya hecha, transcripción cruda estructurada.
Pero la documentación oficial sigue de inmediato con una advertencia: el formato de las entradas de transcripción es interno a Claude Code y cambia entre versiones, así que una tubería que haga joins sobre estos campos puede romperse en cualquier release; trata los joins como específicos de versión y no como un contrato estable4. La documentación de hooks agrega una segunda nota: el archivo de transcripción que recibe un hook se escribe de forma asíncrona y puede ir retrasado respecto de la conversación en memoria, así que cuando un hook se dispara puede que todavía no incluya los mensajes más recientes del turno actual5.
Ambas enseñan la misma lección: no controlas el formato de otra persona, y no controlas su momento de escritura. Puedes leerlo, puedes usarlo para diagnosticar, pero no puedes construir tu observabilidad encima de él. Conclusión: tu propio arnés necesita escribir su propia transcripción. La Lección 3 cubre cómo diseñar los campos de esa transcripción, y la Lección 6 la agrega al arnés que escribiste en el Curso 7.
Las cuatro preguntas para leer transcripciones
Cuando abres una transcripción, ¿por dónde empiezas? El artículo de ingeniería de herramientas da una taxonomía ya hecha: los agentes podrían llamar a las herramientas equivocadas, llamar a las herramientas correctas con los parámetros equivocados, llamar a muy pocas herramientas o procesar mal las respuestas de las herramientas1. Estas cuatro eran originalmente sobre diseño de herramientas, pero funcionan extremadamente bien como lista de verificación de lectura, porque cada una tiene su propio lugar en la transcripción al cual apuntar:
Pregunta uno: herramienta equivocada. Mira el campo name de cada bloque tool_use. Compáralo con la tarea que hay entre manos y con la respuesta de herramienta anterior. El criterio es «¿había una herramienta más apropiada ahí sentada que no se usó?».
Pregunta dos: herramienta correcta, parámetros equivocados. Mira el campo input del bloque tool_use, clave por clave. El ejemplo de más arriba —agregar 2025 a los términos de búsqueda— vive bajo esta pregunta. Es la más fácil de saltarse porque los parámetros son largos y se ven plausibles. Enfócate específicamente en las claves que puedes juzgar bien o mal de forma independiente: fechas, rutas, ID, límites de rango, unidades.
Pregunta tres: muy pocas llamadas. La evidencia de esta pregunta es la ausencia, así que es la más difícil de leer. La forma de detectarla es encontrar posiciones donde «debería haber habido una llamada siguiente y no la hubo»: un error sin reintento, una búsqueda que devuelve cinco resultados pero solo uno descargado, una tarea que requiere dos fuentes pero la transcripción tiene una sola ida y vuelta exitosa. La ausencia no va a saltar sola — tienes que usar los requisitos de la tarea como plantilla y contar.
Pregunta cuatro: respuesta de herramienta mal manejada. Mira el mensaje de asistente inmediatamente posterior a cada tool_result y pregunta: «¿lo que dice a continuación coincide con lo que acaba de recibir?». Un error tratado como éxito, datos devueltos del período A usados como del período B, un retorno que dice explícitamente «resultados truncados» pero el agente lo toma como completo — todo cae bajo esta pregunta. Esto también se conecta directamente con cómo se escriben los mensajes de error: cuando una herramienta lanza un error, puedes aplicar ingeniería de prompts a tus respuestas de error para que comuniquen con claridad mejoras específicas y accionables, en vez de códigos de error opacos o trazas de pila1. Cuando veas a un agente malinterpretar repetidamente el mismo tipo de error, revisa primero qué dice ese error.
Proporcionalidad: no toda transcripción necesita lectura humana línea por línea
Que un humano lea transcripciones es una acción cara: una ejecución con decenas de mensajes toma unos buenos diez minutos largos de leer con cuidado; multiplica eso por cien ejecuciones y nadie da abasto. Así que la lectura humana va en dos lugares. Uno es el muestreo: periódicamente escoge unas cuantas ejecuciones al azar y léelas enteras, no cazando un bug específico sino calibrando tu intuición de «cómo funciona normalmente» — sesgos como el de las granjas de contenido SEO son exactamente lo que te encuentras cuando estás «leyendo sin cazar un bug». Dos es caracterizar problemas nuevos: cuando te topas con un síntoma desconocido, las primeras veces tienes que leer a mano, porque todavía no sabes qué buscar; una vez que hayas leído lo suficiente para entender en qué campo se manifiesta, pásaselo a un programa.
El volumen de rutina lo carga la lectura programática: cómo diseñar campos de log es la Lección 3, cómo correlacionar registros dispersos en una sola ejecución es la Lección 4. Para entonces el punto de entrada de la lectura humana pasa a ser «usa métricas para reducir a unas pocas ejecuciones sospechosas, y después abre las transcripciones y mira de cerca». La evidencia tiene que existir primero; solo entonces puedes hablar de leerla eficientemente — esta lección cubre la primera mitad.
💻 Ejercicios
Resumen
- El autorreporte de un agente es una fuente secundaria: lo que los agentes omiten en su retroalimentación y sus respuestas a menudo puede ser más importante que lo que incluyen; los LLM no siempre dicen lo que quieren decir1, y las piezas faltantes no levantan la mano en el resumen
- Leer el CoT puede encontrar asperezas, pero para atrapar comportamiento no descrito explícitamente en el CoT necesitas mirar la transcripción cruda, incluidas las llamadas a herramientas y sus respuestas1 — el CoT es una pista; la transcripción es evidencia
- La transcripción cruda es lo que queda asentado en ese arreglo
messages del Curso 7 de esta serie. Califica como evidencia porque los resultados de herramientas y la ejecución de código son la ground truth que el entorno da en cada paso2; la guía oficial también dice «prioriza la transparencia mostrando explícitamente los pasos de planificación del agente»2 — leído al revés, ese es el corolario de esta lección: cualquier acción que no aterrice en una frontera de herramienta no deja rastro
- La evaluación humana atrapa lo que la automatización no ve: casos límite que las evaluaciones no ven, incluidas respuestas alucinadas ante consultas inusuales, fallos del sistema y sesgos sutiles en la selección de fuentes3; el ejemplo del mundo real es que los agentes tempranos elegían de forma consistente granjas de contenido optimizadas para SEO por encima de PDF académicos y blogs personales3 — este tipo de sesgo, cuando aterriza en la transcripción, es esa ristra de URL que realmente eligió. Los bugs de la capa de herramientas también viven en los parámetros: Claude llegó a agregar innecesariamente
2025 al parámetro query de la herramienta de búsqueda, sesgando los resultados y degradando el rendimiento; el arreglo fue mejorar la descripción de la herramienta1
- Las transcripciones no tienen que leerlas solo humanos: simplemente concatena las transcripciones de tus agentes de evaluación y pégalas en Claude Code. Claude es experto en analizar transcripciones y puede refactorizar montones de herramientas de una sola vez — por ejemplo, para asegurar que las implementaciones y las descripciones de las herramientas sigan siendo consistentes entre sí1. Las cuatro preguntas para leer transcripciones son: herramienta equivocada, herramienta correcta pero parámetros equivocados, muy pocas llamadas, respuesta de herramienta mal manejada1
- El formato de transcripción de otros es su implementación interna. Claude Code escribe las transcripciones de sesión en
~/.claude/projects/*/*.jsonl4, pero la documentación oficial dice explícitamente que este formato es interno a Claude Code y cambia entre versiones, así que las tuberías que hagan joins sobre estos campos pueden romperse en cualquier release y habría que tratarlas como específicas de versión4; el archivo de transcripción que recibe un hook también se escribe de forma asíncrona y puede ir retrasado respecto de la conversación en memoria5. Así que tu propio arnés necesita escribir su propia transcripción — la Lección 3 diseña los campos, la Lección 6 la implementa
Lección 3 >>