Samuel Arendt

Emulate ocupa o espaço entre mocks frágeis e staging caro

Vercel Labs lançou o Emulate. É uma emulação local de APIs pra rodar em CI e ambientes sem rede.

Não é mock. É emulação stateful com fidelidade de produção.

Você roda npx emulate e sobe APIs locais do GitHub (porta 4001), Vercel (porta 4000) e Google (porta 4002). Cria um repo, adiciona colaboradores, abre issues, faz merge de PR. Deleta o repo e as issues somem junto, como na API real. Cascade delete, state transitions, paginação cursor-based. Tudo funciona como se fosse o serviço de verdade.

O caso de uso que me chamou mais atenção: sandboxes de agentes de IA. Quando você roda um agente que interage com GitHub ou Vercel, não dá pra apontar pra produção. E mocks não pegam os edge cases de estado. O Emulate resolve isso com OAuth real (JWT com RS256 pro GitHub Apps), webhooks que fazem POST de verdade com assinatura HMAC-SHA256, e validação estrita de client_id/secret.

A configuração é por YAML ou seed JSON. Dá pra definir tokens com scopes, repos pré-populados, orgs com times. Zero config pra começar, granular quando precisa.

O que me faz pensar é o espaço que isso ocupa. Mock é rápido mas mente. Staging é fiel mas caro e frágil. O Emulate fica no meio: fidelidade de produção rodando em localhost. Sem rede, sem custo, sem surpresa quando sobe pra CI.

444 stars em poucos dias. 19 endpoints de escrita só pro Vercel. Cobertura completa de GitHub incluindo search, branch protection e workflows.

O que o estado local cobre e o que ainda pede o serviço real

npx emulate sobe Vercel na 4000, GitHub na 4001 e Google na 4002. O README do projeto hoje lista outros serviços no mesmo estilo, cada um numa porta seguinte, com seed e reset(). O alvo declarado é CI sem rede e sandbox de agente que não pode apontar para produção.

Cascade delete, paginação por cursor, branch protection e merge que respeita regra cobrem o comportamento que o seu código assume. Rate limit de verdade, incidente, campo novo num payload e o endpoint que o emulador ainda não implementa continuam fora.

Mantenha pelo menos um canário, job ou teste periódico falando com o serviço externo em horário controlado. O emulador corta custo e risco de dado real. A API pública continua sendo o contrato que o usuário final encontra.

Seed, token e a superfície que o teste afirma cobrir

YAML e JSON de seed são o fixture. Token com scope, org, repo, GitHub App com JWT RS256, webhook com HMAC-SHA256: isso só vale se o seed parecer com o caso que quebra lá fora.

Se a suíte usa um token admin e a produção usa um App com contents: read, o verde mente. Com oauth_apps configurado, a validação de client_id fica estrita. Sem essa lista, o emulador aceita qualquer cliente, o que é cômodo no dia um e perigoso se a suíte esquecer o modo folgado.

Chame reset() entre casos. Estado que vaza de um teste para o outro reproduz o flake do staging antigo, só que mais rápido e em localhost. No CI, createEmulator por serviço, com porta fixa e close() no fim da suíte, deixa o isolamento explícito. Seed versionado no repositório evita que cada pessoa rode um GitHub imaginário diferente.

O que o sandbox de agente prova de fato

Deixar o modelo criar repo, abrir PR, mergear, disparar webhook e inspecionar o resultado em localhost treina o harness: permissão, retry, parse de erro, o que o agente faz quando a issue some no cascade. Sem rede, sem fatura, sem lixo na org real.

O sandbox mostra se o agente obedece o protocolo que você modelou: auth, transição de estado, webhook assinado. O GitHub de verdade ainda pode devolver um campo diferente na semana seguinte. Grave respostas reais de tempos em tempos e compare. Onde divergir, o seed está pobre ou o código está preso a um detalhe que o Emulate não cobre.

Leia os limites que o próprio README lista. Vários serviços declararam o que não implementam: Socket Mode, Connect, rate limit exato, cantos pagos. Teste de agente nessas bordas passa no vazio.

Verde no CI e a lista do que vocês recusam emular

Dezenove endpoints de escrita no Vercel e cobertura larga de GitHub, incluindo search, proteção de branch e workflows, mostram que o projeto mira o fluxo que o app executa, não um GET de user. Stars em poucos dias mostram que a dor é comum.

Trate o Emulate como ambiente de desenvolvimento e de CI isolado. Staging continua a pergunta certa quando o token de produção, o app instalado e o webhook público precisam se falar. Localhost responde outra: o código reage às transições que o time modelou?

Se a suíte de integração externa sumir e ninguém olhar o serviço de novo, a próxima mudança de API chega como incidente. O espaço entre mock frágil e staging caro existe. Ele pede dono para o seed e uma lista explícita do que vocês deliberadamente não emulam.

Referências

#Agentes de IA, #Arquitetura, #Qualidade de Software