Hoy, 4 de noviembre, a las 15:17, enviamos el proyecto. El cierre era a las 23:00, así que quedaron 7 horas y 43 minutos de margen. El equipo es el #2477, el track es Startups y el problema que elegimos fue Build for Your World. Y ahora viene la parte que nadie escribe: esperar.

Este artículo no anuncia un resultado. Anuncia una entrega. Y cuenta lo que costó llegar hasta ahí, porque en diez días nos pasaron cosas que no le pasan a un demo.

Todo lo que sigue se puede abrir: el repositorio público, el producto corriendo en producción y el video de tres minutos. Si algo de lo que digo acá no coincide con eso, la culpa es de este texto.

La tesis, en una línea. Entregamos un expediente, no un demo. Y como el producto dice que ningún hallazgo sale sin cita, el video sobre ese producto tampoco podía salir con una cifra inflada, ni con nueve segundos de negro donde debía estar la prueba. Lo que borramos es el producto.

1. Qué se entregó, exactamente

El proyecto se llama Expediente. Es un motor de evidencia verificable sobre compras públicas chilenas. Le haces una pregunta en español; el agente escribe un plan, elige un verbo por turno y camina un grafo de 6.567.657 órdenes de compra. Nunca escribe SQL y nunca toca el grafo directamente: elige entre trece verbos acotados, y el código compila cada uno a un recorrido con límites.

La consecuencia de esa restricción es la única parte que importa: cada afirmación lleva la orden, el monto, la fecha y el documento oficial con su sha256. Un gate adversarial separa y borra cualquier afirmación que no pueda rastrear a un documento.

Qué Dónde Estado
Producto en vivo investiga.wagnersolutionsai.com responde en 1,16 s
Código github.com/SebaWag/expediente público, 407 tests
Video youtube.com/watch?v=jGUUaP40RaI 2:38 · techo 3:00
Corpus 6.567.657 órdenes · 145.600 proveedores · 2.065 organismos · 86.012.436 tripletas 100% del corpus

Un run completo cuesta 45.905 tokens y 44,7 segundos, el 98% de ese tiempo es del modelo. Ese último dato no es un adorno: es la prueba de que el sistema no está haciendo trampa con cálculos locales rápidos y atribuyéndole el mérito al modelo.

2. «JUNAEB no existe»: la noche que el corpus se volvió real

El lunes 3 por la noche, a tres días de la entrega, el agente respondió que la JUNAEB no existía. La sospecha razonable era la peor: que estuviéramos mostrando datos de mentira.

No era mock. Eran tres fallas distintas superpuestas, y cada una sola habría bastado para arruinar el demo.

Capa Qué pasaba de verdad Cómo se descubrió
Datos El grafo tenía 1.400 organismos y 665 nunca se importaron: 1.617.189 registros de la U. de Chile, CONAF, JUNJI, SAG, IND, SENAME, DGAC, la propia JUNAEB y sus universidades Comparar los RUT del grafo contra el volcado del ETL
Lenguaje El buscador devolvía count: 0 y el agente concluía «no existe» — un falso sobre el país entero Reproducir la búsqueda y leer el log del agente
Acceso Un túnel SSH viejo ocupaba el puerto 1235 y apuntaba a otra base, con 10,3 millones de órdenes. Por eso creíamos que el corpus ya estaba cargado Los números del túnel contradecían a los de la API

La tercera es la que me dejó pensando. Un puerto «abierto» no dice a qué base llega. Teníamos dos verdades contradictorias y las dos parecían correctas porque nadie había verificado que fueran la misma cosa.

Salimos de esa noche con esto:

Métrica Antes Después
Órdenes de compra4.950.4406.567.657
Organismos1.4002.065 (100%)
Proveedores103.220145.600
Tripletas en el grafo64.874.39586.012.436
Islas del grafo61 (100% conectado)

Fueron 1.617.189 registros nuevos · 21.228.243 tripletas · 72.629 proveedores. A las 04:00 del 4 de noviembre el grafo dejó de ser una muestra y se volvió el país.

3. Lo que borramos para poder publicarlo

Esta es la parte que no suele aparecer en un post de hackatón, y es la única que explica el resto. En diez días borramos cuatro resultados que nos habrían venido bien.

Lo que teníamos Lo que medimos Qué hicimos
Un fine-tune que mejoraba +21,7 puntos El «mejoró» era el grader comparando el texto de la cita carácter por carácter. Con la misma vara, la diferencia real era +1,7 puntos y p ≈ 1,0 Publicamos los dos números. El modelo sí bajó los tokens de salida 7,5× con igual calidad — eso es real y lo dijimos
Un umbral de similitud que «funcionaba» Embarriendo 1.892 pares con etiquetas del RUT, los embeddings solos admitieron 150 de 150 negativos adversarios Rediseñamos el pipeline: dos etapas y dos umbrales, y un nombre nunca puede afirmar identidad. Solo puede subir un candidato
Un detector de fraccionamiento Al controlar por comprador, la señal se debilitaba a ~2 puntos Cambiamos el verbo: no «detectamos fraccionamiento», producimos la cadena que un auditor debe revisar primero
Más razonamiento = mejor Sobre 800 documentos, low dio 0,800 y high 0,095 con 90,4% sin verificar. En 800 documentos, high no ganó uno solo (p = 1,1e-162) El esfuerzo quedó como constante medida en el código, no como opinión

La cuarta la medimos porque un taller de partner había reportado algo parecido, y no quisimos citarlo: lo re-medimos sobre nuestro corpus, con nuestro harness. El prompt fue byte idéntico en las tres corridas —624.245 tokens de entrada— así que la única variable era el esfuerzo.

El dato que nos costó plata aprenderlo. A máximo esfuerzo, los tokens de razonamiento se cobran como tokens de salida y se gastan antes de que la respuesta se escriba. Con un tope de 2.048 tokens, 19 de 400 respuestas volvieron vacías (4,75%) y el sistema no lanzó ningún error. Una respuesta vacía y un documento que no decía nada se ven exactamente igual. Eso nos obligó a separar TRUNCATED de EMPTY_RESPONSE en el código.

4. El video también tuvo que pasar el gate

El video dura 2:38 y tiene una regla: no se puede decir un número que no esté en pantalla. Cuando revisamos la versión 1 encontramos tres cosas.

Nueve segundos de negro. Del minuto 2:22 al 2:31 la imagen era una tarjeta estática. No era una impresión: la luminancia era 25,2969 idéntica fotograma a fotograma durante 15 segundos y medio. Nueve de esos segundos caían justo cuando la narración decía lo más importante del video. Los tapamos con la corrida real del agente.

El corte estaba antes de la prueba. La escena del demo se cortaba a los 37,75 segundos de material, cuando el crudo tenía 91,5. Buscando con OCR encontramos que el panel de registro con el nombre del modelo, los tokens y los milisegundos aparece entre el segundo 58 y el 91 del crudo — es decir, después del punto donde el video cortaba. El demo se estaba cortando justo antes de mostrar lo que había que mostrar.

Dos planos generados que había que descartar. Para abrir y cerrar el video usamos planos de escenario generados con IA a partir de una fotografía de referencia. Los dos primeros tenían el tell más delator que existe: la gorra decía «COFFEE ROASTERS» y la credencial decía «OWS Web3 Summit». Texto inventado en la ropa. Se regeneraron con vestuario plano y prohibición explícita de texto, y se validaron pidiéndole a un modelo de visión que transcribiera literalmente cualquier letra visible.

Y los dos errores fueron míos. Al componer el cierre saqué la capa de texto del render anterior, que ya tenía un plano encima: al mezclarla, la escena vieja se sumó sobre la nueva y se veía un fantasma. Lo corregí sacándola del máster original. Después, el segundo plano seguía mostrando el texto en baja opacidad, porque el filtro de mezcla repite el último fotograma del stream más corto. La segunda corrección no fue ajustar el relleno: fue sacar ese plano del filtro. Un plano que debe estar limpio no se protege con parches; se saca de la cadena.

El video declara en pantalla que la voz es sintética y clonada de una grabación del propio autor. Nos pareció obligatorio: en un video sobre trazabilidad, un crédito falso sería la peor firma posible.

5. Contra qué estamos compitiendo, dicho sin adornos

Mirando lo que presentan otros equipos, el patrón es claro: harness genéricos, asistentes de ciberseguridad, modelado 3D a partir de una imagen, chatbots sobre documentos. Son cosas que están en GitHub y que funcionan. Y son demos más vendibles que el nuestro, porque se explican en diez segundos y se ven bien en un video de tres minutos.

No voy a fingir que no lo entiendo. Un jurado con doscientos proyectos y poco tiempo premia lo que se entiende rápido. Es una decisión racional.

Pero hay una diferencia que no se puede copiar rápido: los datos. Nos pasamos cuatro días peleando con codificaciones dobles, umbrales que cambiaron de 30 a 100 UTM el 12 de diciembre de 2024, y un corpus que crecía un 33% mientras el demo ya estaba grabado. Lo que quedó corriendo es la contratación pública de un país, con 2.065 organismos y 86 millones de tripletas, consultable por cualquiera.

Eso no se baja de GitHub. Eso se construye.

6. Qué pasa ahora

Cuándo Qué
4 – 8 de noviembre Evaluación del jurado
9 de noviembre Finalistas en vivo y ceremonia de cierre
9 de noviembre El segundo artículo de esta serie, con el resultado, sea cual sea

Queda un riesgo concreto que sí depende de nosotros: el portal tiene que seguir arriba hasta el 9. El video muestra la producción corriendo en tiempo real; si un juez hace clic y encuentra un error, el 25% del puntaje se cae solo. Esta semana no se toca el despliegue.

Lo que dejamos en la cancha. Un motor de evidencia corriendo sobre 6,5 millones de órdenes reales. Un corpus con el 100% de los organismos del país. Un gate que borra lo que no puede citar. Un video de 2:38 donde cada número está en pantalla. Y cuatro resultados que borramos porque no aguantaban una pregunta. Si eso no alcanza, no era el formato adecuado para esto — pero el sistema sigue arriba y cualquiera puede usarlo mañana.

7. Verifícalo tú

Este artículo tiene un problema que se resuelve fácil: soy parte. Así que en vez de pedirte que me creas, te dejo las tres puertas y una sugerencia — empieza por el video, y si algo te suena exagerado, ve al portal y pregúntale al agente lo que quieras sobre tu comuna.

Puerta Qué vas a encontrar
El video (2:38) La corrida en vivo. Dice qué modelo pensó, cuántos tokens gastó y cuánto tardó, en pantalla
El portal El grafo completo. Escribe el nombre de una municipalidad y mira qué pasa
El repositorio 407 tests, el gate adversarial y los benchmarks con sus limitaciones escritas

Y si el 9 de noviembre el resultado no es el que queremos, igual va a estar acá el artículo que lo cuente. Eso también lo firmamos.

¿Tienes datos públicos que nadie está cruzando?

Construimos sistemas de evidencia verificable: cada afirmación rastreada a su fuente, cada hallazgo firmable por una persona. Si tienes un corpus que existe pero nadie puede auditar, hablemos.

Hablar con Wagner Solutions →

Sebastián Wagner — Fundador de Wagner Solutions AI. Construye sistemas agénticos donde el modelo es reemplazable y el harness es propio. Este artículo documenta una entrega real: el código, el video y el producto están públicos para que cualquiera pueda contradecirlo.