Render — os dois serviços no ar

O que foi para produção em 2026-10-15 (backend cc69555, frontend 2dbc653): P5 (47 endpoints REST) e P8 (a casca do frontend), com os gates que cada um passou. Verde = no ar. Âmbar = espera decisão sua. Cinza = fora.

2 de 2
serviços do Render no ar
47
endpoints REST publicados (P5)
26/26
gates verdes (18 do P5 + 8 do P8)
1056
testes passando (987 back + 69 frente)
87,6%
cobertura do backend (piso 87)
1200
conexões do Postgres próprio
verde: no arâmbar: espera decisão suacinza: fora desta entrega

Trilha: 15 pacotes, 7 fechados

P0…P4 · fase A núcleo, banco, contratos, identidade e domínio — merge 3c2aaed P5 · rotas REST 47 endpoints, zod e serializers — merge 1b63972 P8 · casca do front Vite + React + @nomad/ui + TopBar + nginx — merge 4a13f50 P6 · tools MCP 59 tools + gateway /mcp — ~5.000 linhas para portar P7 · portão de upgrade render_approvals + sincronia de projetos P9…P11 · motor e telas motor do Render, editor e as 112 telas — ~200 arquivos P12…P14 · shot, testes e corte serviço de captura, suíte migrada e migração dos dados Conta, duas pendências suas: (1) o CONTA_PROVISIONING_SECRET_RENDER só entra no processo do conta-backend-ws na próxima RECRIAÇÃO do container — services_restart não aplica env nova; (2) o resync do estado (empresa, membros) para o Render precisa ser disparado à mão em Conta → Aplicativos → Render → Reenviar estado. O login por SSO já funciona ponta a ponta (a app redirecionou para a Conta com o client_id render), mas sem o resync o Render fica sem espelho de empresa/membros. O que ainda não existe dentro do app: o motor do Render (P9), o editor de tela e as 112 telas (P10/P11), as 59 tools MCP (P6) e o serviço de captura (P12). Hoje o app tem a casca — login, barra Nomad, navegação e configurações — e as rotas /render/** redirecionam para a raiz em vez de dar 404. Segurança: a senha do role do banco que vazou em output de tool na sessão anterior foi girada no mesmo dia, sem downtime, e está morta. Na subida do frontend o CSP por hash foi conferido contra o script servido em produção: batem, e não houve violação de CSP no console.

Cada pacote entra por merge --no-ff no integ/render-fase-a, com gates com log. P0..P4 foram entregues na sessão anterior (fase A, commit 3c2aaed); P5 foi fechado e publicado agora; P6..P14 continuam na fila do desenho. Os números das ondas que faltam são o tamanho medido no AgentPack de onde o código sai.

Vereditos

Os dois serviços no ar

Backend render-backend-ws: deploy t5OiAPuh_PI271BNnyEiR, commit cc69555, container 657f8d4b2572. /health 200 com banco ok, /api/render/schemas 200 (contrato público) e as 47 rotas respondendo 401. Frontend render-frontend-ws: deploy qixTWdiAryB-yObcj_UYB, commit 2dbc653, container 8fcf5b400c16, https://render-v0.mp.serendiped.com com TLS válido e 200 na raiz.

O login por SSO funciona ponta a ponta

Com navegador de verdade: abrir a raiz da app manda para /auth/sso, o backend monta a authorize da Conta com client_id=render e o redirect_uri da origem do frontend, e a Conta Nommand recebe o pedido (302 para o login dela, sem erro de CSP no console). A tela /login renderiza a moldura de entrada com o botão para a Conta.

CSP conferida contra o que é servido

O nginx responde script-src 'self' 'sha256-+xIY…' e o script de tema servido tem exatamente esse SHA-256 — conferido baixando a página de produção e recalculando. O index.html ficou fora do prettier de propósito: reformatar o script quebrava o hash e a página pintaria o escuro padrão até o bundle carregar, sem erro no console. Também vieram CSP, X-Frame-Options, nosniff e Referrer-Policy.

P5 em produção — commit cc69555

47 endpoints sob /api com os mesmos caminhos do AgentPack (inclusive os legados /api/designs/** e /api/library/**), zod em params/query/body/resposta, e a borda decidindo a escrita do catálogo por empresa (D3/D14).

Gates: 26 verdes, nenhum contornado

P5 (18): prisma-validate, prisma-format-check, typecheck, lint-ratchet (129 no teto), cycles, knip, docs-check, env-example-check, test-db-migrate, test-db-drift, testes (58 suítes, 987 testes), cobertura, coverage-floor, test-env-ci, build, gitleaks×2. P8 (8): typecheck, lint, cycles, format, testes (7 suítes, 69 testes), build, build-sane e nginx-conf. Os dois gates que reprovavam no P5 foram corrigidos: o knip por trazer os testes do P4 que faltavam, e a cobertura porque a medida era de uma árvore incompleta — os pisos subiram para os medidos.

P8 — a casca que faltava

Vite 8 + React 19 nos presets do @nomad/ui, TopBar Nomad com o AppSwitcher no slug render, rotas públicas de login, RequireAuth com ?next=, sidebar, breadcrumb e paleta de comandos, dentro do shell / e /settings. Dois aprendidos de deploy ficaram registrados: o lock tem de ser gerado com o npm que o Dockerfile instala (o npm 11 da sandbox escreve uma árvore diferente) e precisa da cópia aninhada do typescript 5.9.3 que o madge exige.

Detalhe

O que foi para a main nesta tarefa

CommitO que éTamanho
1b63972Integra pkg/p5 (rotas REST do Render) no integ/render-fase-a27 arquivos, +3.816 / −98
4a13f50Integra pkg/p8 (casca do frontend) no integ/render-fase-a77 arquivos, +16.021
cc69555Fase A (P0..P5) na main — o backend publicadomerge --no-ff
2dbc653Fase A + P8 na main — o frontend publicadomerge --no-ff
a8401d6docs(runbook): o que a subida mostrou que o roteiro errava+125 / −17
9fea358chore(backend): piso de cobertura sobe para o medido8 pisos
442eac5fix(test): handler de mentira sem async (fecha a catraca em 129)1 arquivo

Gates por pacote

PacoteResultadoNúmero
P5 · typecheck + buildpassoutsc limpo, dist/server.js gerado
P5 · lint:ratchetpassou129 avisos no teto (não subiu), 0 erros
P5 · knippassou0 erros; exports e tipos sem uso só como aviso
P5 · testespassou58 suítes · 987 testes · 5 pulados · 0 falhas
P5 · cobertura + pisopassousrc 87,63% · services 86,58% · routes 92,53% · 8/8
P5 · gitleakspassounenhum segredo na árvore nem nos commits
P8 · typecheck + lintpassoutsc limpo; eslint 0 erro
P8 · testespassou7 suítes · 69 testes · 0 falhas
P8 · build + nginxpassoudist com 9 assets; 7/7 conferências no conf

O que ficou de fora — e o que destrava

OndaTamanho medidoO que destrava
P6 · tools MCP~5.000 linhas + 11 suítesPortar tools/render e mcp/ e trocar o stub do /mcp (hoje responde 403 MCP_NOT_AVAILABLE para chave restrita)
P7 · portão de upgrade2 services + 1 CLITabela render_approvals no lugar da leitura de task_decisions
P9 · motor do Render~40 arquivos de engineAs primitivas e o contrato gerado que o preview de tela usa
P10 · dados e editor48 operações REST escritas à mãoO editor de tela, com autosave e rascunho
P11 · telas112 arquivos de pages/RenderAs telas do Studio e as rotas /render/** de verdade
P12 · serviço de captura4 arquivos + credencialshot/ com token próprio, depois do frontend
P13 · suíte migrada~95 arquivos de testeFazer a cobertura voltar aos pisos do AgentPack (90/93)
P14 · corte de dados1 script + 2 runbooksMigração do AgentPack com --dry-run obrigatório

Próximo