El bot repetía la misma pregunta, y la culpa era de lo que el historial no traía
Un bug real de producción que tardé en ver porque estaba buscando en el lugar equivocado: no en lo que el sistema leía, sino en lo que dejaba fuera a propósito.
El bot de la clínica empezó a hacer algo absurdo: preguntaba «¿el paciente es menor de 9 años?», el paciente respondía, y el bot volvía a preguntar exactamente lo mismo. En bucle.
Perdí un rato largo revisando la lógica que interpreta la respuesta, convencido de que el problema estaba ahí. Estaba bien. El problema estaba en lo que esa lógica leía.
El dato que faltaba estaba ausente a propósito
El flujo lee el historial de la conversación desde la base de datos para armarle contexto al modelo. Y ese historial excluye a propósito el mensaje del turno actual, porque el mensaje ya se le pasa al modelo por separado y, si viniera en las dos partes, lo vería duplicado.
Esa decisión es correcta para el modelo. Pero mi lógica determinística —la que decide si el paciente dijo que sí o que no— estaba leyendo del mismo historial. Es decir: leía toda la conversación menos justo la respuesta que acababa de recibir. Nunca encontraba la respuesta, así que volvía a preguntar.
La corrección fue de una línea: leer el texto del turno actual del nodo que lo extrae, no del historial.
Lo que me llevé
Cuando dos partes de un sistema leen el mismo dato con necesidades distintas, alguien va a asumir mal. El historial estaba pensado para el modelo, no para las reglas. Nadie lo escribió en ningún lado porque, mientras solo lo usaba el modelo, la diferencia no existía.
Lo que hago ahora: cuando una fuente de datos tiene una exclusión deliberada, la documento en el propio nodo, no en un archivo aparte. La nota tiene que estar donde alguien la va a leer, que es justo antes de usar el dato.
También me dejó una preferencia: para depurar este tipo de cosas, empezar por revisar qué entra al proceso antes que cómo lo procesa. El bug estaba a un paso antes de donde yo lo estaba buscando.