Samuel Arendt

Emulate ocupa el espacio entre mocks frágiles y staging caro

Vercel Labs publicó Emulate, una implementación local y stateful de APIs externas para CI y sandboxes sin red. npx emulate inicia endpoints locales de GitHub, Vercel y Google. Crear un repositorio, añadir colaboradores, abrir issues, fusionar un pull request y eliminar estado relacionado siguen transiciones modeladas, no respuestas fijas de un mock.

El proyecto incluye paginación por cursor, cascade delete, tokens con scopes, organizaciones precargadas y validación estricta de credenciales. Puede validar JWT de GitHub Apps con RS256 y enviar webhooks firmados con HMAC-SHA256. La configuración empieza sin trabajo y crece mediante YAML o seed JSON.

Los sandboxes de agentes de IA son un caso fuerte. Permitir que un agente toque datos reales durante una prueba es inseguro y un mock superficial pierde transiciones. Un emulador local ofrece un sistema que el agente puede cambiar e inspeccionar sin red ni costo externo.

Qué cubre el estado local y qué sigue pidiendo el servicio real

npx emulate levanta Vercel en 4000, GitHub en 4001 y Google en 4002. El README del proyecto hoy lista otros servicios en el mismo estilo, cada uno en el puerto siguiente, con seed y reset(). El objetivo declarado es CI sin red y un sandbox de agente que no puede apuntar a producción.

Cascade delete, paginación por cursor, branch protection y un merge que respeta reglas cubren el comportamiento que asume tu código. Rate limit de verdad, incidente, un campo nuevo en un payload y el endpoint que el emulador todavía no implementa siguen fuera.

Mantén al menos un canario, job o test periódico hablando con el servicio externo en un horario controlado. El emulador corta costo y riesgo de dato real. La API pública sigue siendo el contrato que encuentra el usuario final.

Seed, token y la superficie que el test afirma cubrir

YAML y JSON de seed son el fixture. Token con scope, org, repo, GitHub App con JWT RS256, webhook con HMAC-SHA256: eso solo vale si el seed se parece al caso que se rompe afuera.

Si la suite usa un token admin y producción usa un App con contents: read, el verde miente. Con oauth_apps configurado, la validación de client_id queda estricta. Sin esa lista, el emulador acepta cualquier cliente, cómodo el día uno y peligroso si la suite olvida el modo holgado.

Llama a reset() entre casos. Estado que se filtra de un test a otro reproduce el flake del staging viejo, solo que más rápido y en localhost. En CI, createEmulator por servicio, con puerto fijo y close() al final de la suite, deja el aislamiento explícito. Un seed versionado en el repositorio evita que cada persona corra un GitHub imaginario distinto.

Qué demuestra de hecho el sandbox de un agente

Dejar que el modelo cree un repo, abra un PR, haga merge, dispare un webhook e inspeccione el resultado en localhost entrena el harness: permiso, retry, parse de error, qué hace el agente cuando la issue desaparece en el cascade. Sin red, sin factura, sin basura en la org real.

El sandbox muestra si el agente obedece el protocolo que modelaste: auth, transición de estado, webhook firmado. El GitHub de verdad todavía puede devolver un campo distinto a la semana siguiente. Graba respuestas reales de vez en cuando y compara. Donde diverjan, el seed está pobre o el código está preso de un detalle que Emulate no cubre.

Lee los límites que lista el propio README. Varios servicios declaran lo que no implementan: Socket Mode, Connect, rate limit exacto, rincones de plan pago. Un test de agente en esas orillas pasa en el vacío.

Verde en CI y la lista de lo que se niegan a emular

Diecinueve endpoints de escritura en Vercel y una cobertura amplia de GitHub, incluido search, protección de branch y workflows, muestran que el proyecto apunta al flujo que el app ejecuta, no a un GET de user. Las stars en pocos días muestran que el dolor es común.

Trata Emulate como entorno de desarrollo y de CI aislado. Staging sigue siendo la pregunta correcta cuando el token de producción, el app instalado y el webhook público necesitan hablarse. Localhost responde otra: ¿el código reacciona a las transiciones que el equipo modeló?

Si la suite de integración externa desaparece y nadie vuelve a mirar el servicio, el próximo cambio de API llega como incidente. El espacio entre mock frágil y staging caro existe. Pide dueño para el seed y una lista explícita de lo que deliberadamente no emulan.

Si tu empresa está evaluando algo parecido, escríbeme por LinkedIn o por WhatsApp.

Referencias

#Agentes de IA, #Arquitectura, #Calidad de software, #Radar