
En el año 256 a.C., un gobernador llamado Li Bing se enfrentó a un río que cada primavera se desbordaba y arrasaba la cosecha. La solución obvia era una presa. No la construyó.
Dividió el río Min con un dique de piedra con forma de boca de pez y dejó que la división hiciera el trabajo — la mayor parte del caudal hacia los campos en los meses secos, el exceso devuelto al río en las crecidas, el limo arrastrado con él. Sin compuertas, sin personal. El río se regulaba solo, y todavía hoy riega la llanura de Chengdu, veintitrés siglos después.
Este mes pensé mucho en Li Bing. Mi prueba más difícil tenía la enfermedad del río: se desbordaba en cada ejecución.
El flujo que no podía falsificar
OwlMeans es un pipeline de desarrollo de IA: describes un producto como historias de usuario, y roles de IA especializados lo convierten en una aplicación completa que es tuya. Para probar eso end-to-end no puedes usar mocks — ejecutas lo real.
La prueba registra un usuario, escribe un prompt, espera una especificación, la confirma — y entonces viene la parte difícil: se levanta un nuevo sandbox de Kubernetes para ese proyecto, un agente desarrolla la primera historia dentro de él, y la prueba espera hasta que la historia esté lista. De diez a cuarenta minutos, toda clase de asincronía entre medias — y toda clase de inestabilidad. Estado residual, un sandbox a medio aprovisionar, un agente que se cuelga, una interfaz que cambia mientras la miras. La versión ingenua es un timeout de ochenta minutos y una plegaria.
La mitad que no escribí
Primera parte del truco: no construí la mayoría de esto.
La parte del navegador corre sobre nuestro propio harness, @owlmeans/test-ui — una de las bibliotecas comunes de OwlMeans sobre las que se construye cada proyecto aquí. Lanza un navegador, inicia sesión con nuestras claves de supervisor en lugar de un Google Sign-In real, y envuelve la fontanería de Playwright para que mi test se lea como intención.
El sandbox tampoco me necesitaba. El slot efímero de Kubernetes — namespace, storage, deployment, políticas de red — es aprovisionado y mantenido vivo por otra biblioteca común, @owlmeans/kephemeral: observa el pod y lo sana si cae. Ya sabía cómo mantenerse en pie.
Solo quedaba un flujo por domar: ¿cómo depender de un flujo que legítimamente tarda cuarenta minutos, sin vigilarlo?
La boca de pez
No puedes usar un timeout corto — el agente puede pensar de verdad durante cuarenta minutos, y eso está bien. Tampoco puedes esperar ochenta para enterarte de que murió en el minuto tres. Un temporizador fijo es una presa: demasiado bajo y se desborda, demasiado alto y es inútil.
Así que dejé de medir el tiempo del flujo y empecé a leer su pulso. El agente consume tokens mientras trabaja — eso no es un indicador de progreso, es el progreso. La prueba observa el saldo de tokens. Cada veinte segundos: ¿sigue bajando? Si es que sí, el agente está vivo — sigue esperando, lo que tarde. Si se estanca diez minutos, el agente se ha colgado, y la prueba falla ahí mismo — en lugar de mirar la pared otra hora.
Esa es toda la idea: el propio comportamiento del flujo me dice si está sano, igual que la corriente le dice al dique de Li Bing cuánto dejar pasar. Treinta líneas de código convirtieron mi prueba más inestable en la más fiable.
Pizarra limpia a la entrada, pizarra limpia a la salida
Una fuga más. Una ejecución interrumpida a mitad deja todo un sandbox detrás — deployment, storage, certificados, rutas, namespace — y la siguiente ejecución tropieza con los escombros y no arranca.
La solución es aburrida y total: antes de cada ejecución y después, la prueba destruye todos los proyectos del único perfil reutilizado. Como sea que haya terminado la última vez — salida limpia, crash, portátil cerrado — la siguiente empieza desde un estado conocido y vacío. Sin limpieza manual, nunca — una pizarra limpia por ejecución es lo mejor que puedes hacer contra las pruebas inestables, y aquí sale gratis.
El acueducto

Quedaba un problema, el que la mayoría nunca resuelve bien: el clúster corre en un servidor en casa — sin IP pública, detrás de un ISP que no acepta tráfico entrante. Para probarlo desde cualquier lugar y poner Cloudflare delante, tenía que sacar el flujo de casa.
Es un pequeño proyecto aparte, flt-pf-tnl: una VM cloud barata con una IP estática reservada, corriendo WireGuard y un proxy Nginx. El camino es simple — Cloudflare → relay → túnel cifrado → servidor doméstico → sandbox Kubernetes. Dos comandos lo levantan — solo Terraform, Ansible y unos pocos scripts de shell. Un watchdog revisa el cortafuegos cada sesenta segundos y repara la deriva; la IP estática sobrevive a los teardowns, así que la dirección pública nunca cambia.
Lo configuré una vez. Sigue en pie. Un acueducto: construido una vez, funcionando por gravedad.
Puedes tenerlo sin más
Retrocede. Nada de esto es exótico — un sandbox que se autocura, un bucle de retroalimentación que lee el propio pulso del flujo, un túnel que lleva un clúster privado al mundo. Unos días de la estructura correcta alrededor de un flujo que me comía las tardes. Esa estructura es el producto — la misma promesa que OwlMeans hace a cada aplicación que lanza: un monorepo tipado y la infraestructura a su alrededor, tuya para siempre.
Así que aquí va el pitch honesto.
Si estás construyendo algo real, te toparás con esta pared — flujos lentos, dependencias externas, un sandbox que levantar y derribar, pruebas que pasan el lunes y fallan el martes. Puedes hacer lo que yo hice: quemar semanas aprendiendo que un timeout más largo nunca arregla un flujo inestable, que lees su pulso en lugar de cronometrarlo, que llegar a tu propio clúster requiere un acueducto. Para mí valió la pena; es mi trabajo.
No es tu trabajo.
Esto es parte de OwlMeans Services: tomamos este harness, sandbox y túnel exactos, los adaptamos a tu stack y los desplegamos en días. Todo es tuyo — código, infraestructura, sin vendor lock-in, mantenible con cualquier agente de codificación.
Un flujo que se ejecuta solo, igual que un río lleva veintitrés siglos fluyendo. Ahórrate el mes que yo invertí — puedes tenerlo sin más.
OwlMeans construye SaaS TypeScript full-stack a partir de tus historias de usuario — tipado, listo para SSO y tuyo para seguir construyendo con cualquier agente. Descubre lo que puede hacer →