ADR 0213 — O entregável roda na máquina do usuário pelo compose da Infra
Status
Accepted. 2026-10-11 (AT-517; decisões do dono de 11/10: "pelo compose da Infra", sem porta publicada no broker). Regras em RN-851..855. Referencia, sem editar, o ADR 0130, o ADR 0190 e o ADR 0199.
Context
No fim de uma execução o usuário tinha código mergeado e nenhuma forma declarada de vê-lo rodando. O que foi medido:
- O
docker-compose.ymlque a Infra abria na PR era "de desenvolvimento": subia o ambiente, não o APP, e o prompt do Infra Lead dizia que o container do projeto não sobe por ele. - A imagem decidida em
artifact.project_imagenão chegava à Infra quando ela escrevia o compose, então oFROMdo Dockerfile do módulo era um palpite. - A porta padrão do app (3000) colide com a do Brabo na mesma máquina.
- O container do projeto não tem Docker (contenção do ADR 0130), então nada
dentro do Brabo pode rodar
docker compose uppara provar o compose. - As rotas do entregável já são documentadas no README pelo dev (RN-850), e o QA já sobe processos em background e encerra o grupo (RN-817), mas nada amarrava uma URL ao que o usuário abre.
Decision
- O caminho é o compose da Infra, rodado pelo usuário no repositório entregue. O broker NÃO publica porta: a contenção do ADR 0130 fica intacta.
- O compose sobe o APP (RN-851):
builddo Dockerfile do módulo comFROMigual à imagem deartifact.project_image, porta do host${APP_PORT:-8080}:<porta interna>(8080 está livre ao lado das portas do Brabo: 3000, 4000, 5173, 5432, 7474, 7687, 8088, 11434), volume para dados persistentes eenv_filecom.env.examplecommitado — nunca.env. - A Infra escreve a seção "Rodar na sua máquina" do README, na PR dela. O dev segue com "Rotas HTTP" (RN-850) e acrescenta a URL do Swagger ou da página quando a cria.
propose_infra_prganha o campo OBRIGATÓRIOrun, validado no engine e na api:command: string não vazia, até 300 caracteres (ex.:cp .env.example .env && docker compose up --build);urls: 1 a 5 itens{ label, url, kind },labelaté 60 caracteres,kind∈api_docs|web,urlcomeçando comhttp://localhost:ouhttp://127.0.0.1:;envExample: boolean — quandotrue, o.env.exampleestá entre osfilesda PR.
- A api emite
artifact.run_instructions(RN-852) ao executaropen_infra_prcom sucesso: versionado, sem tabela, o vigente substitui — o desenho deartifact.project_image—, payload{ command, urls, envExample, prUrl }, lido porGET /projects/:projectId/infra-artifacts(ou GET dedicado se aquele não servir). - O dev expõe o que se abre (RN-853), sem amarrar stack: módulo HTTP serve
/openapi.json(OpenAPI 3) e/docs(UI Swagger); com redenoneou sem o pacote,/docsé uma página HTML que carrega oswagger-uide CDN — quem baixa é o navegador do usuário, não o container. Módulo web serve a página inicial. A cláusula só entra quando a tarefa toca entrypoint ou rotas. - O QA prova DENTRO do container (RN-854): sobe o app pelo comando do
README em background, bate em
localhost:<porta interna>/openapi.jsone/docs(curl,wgetounode -e fetch) e encerra o grupo de processos (RN-817). Odocker compose upreal é OBSERVAÇÃO ("provado só na máquina do usuário"), nunca item do plano. - A Visão geral ganha o cartão "Rodar na sua máquina" (RN-855): o comando com botão de copiar e as URLs clicáveis, com o texto "declarado pela Infra, não verificado na sua máquina" (RN-468) — nunca verde.
Consequences
- Custo de token: o payload
run, a seção do README e a cláusula do dev e do QA são texto a mais em turnos que já existiam; nenhum turno novo. - Lacuna declarada: o
docker compose upreal nunca roda dentro do Brabo. O que o QA prova é o app respondendo dentro do container; porta do host, volume e build pelo compose ficam provados só na máquina do usuário, e a tela diz isso. - O que NÃO muda: a contenção do ADR 0130 e do broker (sem porta publicada,
sem socket no container, rede
internal), a subida automática do ADR 0190 e os recursos derivados domodule_mapdo ADR 0199. A evidência de que o ponto de entrada sobe (RN-813) e a rota HTTP no README (RN-846) seguem valendo; este ADR acrescenta a URL que se abre, não troca a prova.
Alternatives considered
- Porta publicada pelo broker para o usuário abrir o app do container do projeto. Recusada por decisão do dono: abriria a primeira porta do container do projeto para o host e mudaria a contenção do ADR 0130.
- A tela lê o README ou o compose do repositório para montar o cartão.
Recusada: seria parsear prosa e YAML no cliente, sem contrato; o payload
runvalidado e o artefato versionado dão o mesmo dado com forma fixa.