Render — fechamento da fase A
O que entrou na main (merge 3c2aaed), o que ficou de fora e o que precisa de você antes de subir em produção. Nada foi deployado.
Trilha: o que foi embora, onda por onda
Cada onda tem o merge --no-ff no integ/render-fase-a e os logs dos gates em .sbcache/wf-render-build/ (onda 0: 15/15, onda 1: 19/19, onda 2: 22/22, onda 3: 22/22). A onda 3 respondeu por todos os gates mas o agente integrador morreu sem reportar — o fechamento revalidou o commit, a árvore e os testes antes de decidir o merge na main, e re-rodou os mesmos 22 gates na main.
Ressalvas do P0 — veredito de cada uma
Merge na main — 3c2aaed
As quatro ondas integraram com gates verdes (onda 0: 15/15, onda 1: 19/19, onda 2: 22/22, onda 3: 22/22; o agente integrador da onda 3 morreu sem reportar, então o fechamento revalidou commit, árvore e testes antes do merge). Entrou o --no-ff do integ/render-fase-a: a main tinha só o desenho e agora tem o backend do Render. Gates do fechamento 22/22 verdes e repetidos na main (3c2aaed): 22/22, árvore limpa. 52 suítes, 909 testes, cobertura de 85,85% das linhas, teto do lint-ratchet mantido em 130 avisos. Publicado em origin/main e origin/integ/render-fase-a.
(a) Fail-open da regra design-system-id — CORRIGIDO
Era o único bloqueante. O globalWriteReach devolvia undefined para a regra e nenhuma checagem existia: a chave de projeto escrevia — e apagava — qualquer design system. Entrou o assertDesignSystemWriteAllowed (igual ao AgentPack, decidindo por EMPRESA, D3/D14): chave de projeto no catálogo → 403 GLOBAL_WRITE_NOT_ALLOWED antes do handler. O teste tests/auth-design-system-write.test.ts prova o 403 com linhas e chaves de verdade; a mutação que reabre o buraco derruba o teste.
(b) Isolamento da borda R05–R08 — FECHADOS
Quatro casos que sobreviveram às mutações da revisão e não tinham teste agora têm: R05 (chave de projeto barrada mesmo quando a referência do corpo é só FK do service), R06 (projeto do corpo conferido igual para pessoa e chave), R07 (regra legada {projectIn} sem projeto no corpo é escrita global), R08 (parâmetro depois de /projects/ isola pelo lugar, não pelo nome). As 4 mutações voltaram a ser aplicadas e as 4 derrubam os testes novos.
(c) tests/shutdown.test.ts — REGISTRADO
A suíte de shutdown do AgentPack não foi portada: shutdown.ts e server.ts ficam sem cobertura direta e as mutações R13 (prazo estourado sai com 0) e R14 (SIGTERM sem handler) continuam sem teste que as derrube. Fica para a onda do P13, que migra o resto da suíte.
(d) DB_CONNECTION_LIMIT 1000 — PARCIALMENTE FECHADO
A ressalva ficou para trás do código: o teste existe (config-env.test.ts — default 1000, inteiro positivo, vence o connection_limit da URL, mais o withConnectionLimit). O que nenhum teste alcança é o max_connections do servidor, que só a verificação manual do runbook cobre — registrada lá como passo obrigatório.
(e) Testes que não provam o que dizem — REGISTRADO
R02 (RENDER_AGENT_TOKEN podendo repetir MCP_SECRET_KEY), R15 (X-Content-Type-Options), R19 (CMD sem exec no entrypoint) e o caso do /mcp seguem sem teste que derrube a mutação. Nenhum é bloqueante de deploy; todos estão na lista de pendências do runbook.
(f) organization_id em audit_events e no ator bootstrap — FEITO, COM UMA DECISÃO SUA
O P1 fez a parte dele: a coluna existe em audit_events, o auditService grava a empresa (do principal, do projeto escrito ou da escrita) e 19 testes cobrem o caminho. O ator bootstrap continua sem empresa, por decisão documentada do P1 (chave de plataforma): fora de projeto a linha de auditoria fica sem empresa. A revisão do P0 pedia empresa também no bootstrap — vale você ratificar ou mandar mudar.
Detalhe
O que entrou na main
| Onda | Pacote | O que é | Gates |
|---|---|---|---|
| Onda 0 | P0 | Núcleo do backend Fastify: buildApp, 12 plugins de borda, config validada, Dockerfile com migrate abortando o boot, suíte e gates | verdes |
| Onda 1 | P1 | Banco: migration inicial (17 tabelas, 8 enums, 11 CHECKs), espelhos da Conta, audit_events com empresa | verdes |
| Onda 2 | P2 + P3 | Contratos (zod, JSON Schema, typegen, segurança de conteúdo) e identidade (OIDC render, suspensão por contrato, chaves apk_*, token de preview) | verdes |
| Onda 3 | P4 | Domínio do Render: espelho de projeto, catálogo por empresa, services e lib | 22/22 |
| Fechamento | ressalvas | Ressalva (a) corrigida + 4 casos R05–R08 testados + runbook de produção (commit a8b0df4) | 22/22 |
O que ficou de fora
| Item | Estado | Por quê |
|---|---|---|
| P5 — rotas REST (47 endpoints) | pronto, não integrado | Está no worktree pkg/p5, com os gates knip e coverage-floor falhando (4 métricas de cobertura abaixo do piso). Não entra na main sem onda com gates verdes. |
| P6 a P14 | fora do escopo | Tools MCP e gateway /mcp, portão de upgrade, casca do frontend, motor, telas, shot, testes e migração — cada um com as dependências do desenho. |
| Fase B no AgentPack | documentada | P-1, P-2, D6, D7, D13 e o corte estão descritos no runbook, com a ordem e as ressalvas aceitas. Nada foi mexido no AgentPack. |
| Migração de dados (P14) | só o roteiro | D13: o script e o runbook existem no desenho; não se executa contra produção. |
O que precisa de você antes do deploy
| Pedido | Tipo | Detalhe |
|---|---|---|
| OK de deploy | decisão | Nada subiu. Os três serviços (render-backend-ws, render-frontend-ws, render-shot-ws) nascem com autoDeploy desligado; publicar é deployments_trigger. |
| Cliente OIDC + CONTA_PROVISIONING_SECRET | ação fora do painel | Cadastro na Conta Nommand: cliente id render, redirect e post-logout do runbook, segredo novo e exclusivo, entrada no AppSwitcher e papel apps["render"]. |
| Postgres próprio | infra | Projeto databases_prod, max_connections acima de 1000, credencial fora do repositório (DB_CONNECTION_LIMIT=1000 na app). |
| Ratificar o ator bootstrap sem empresa | decisão | Ressalva (f): o P1 deixou o bootstrap fora da empresa por ser chave de plataforma. A revisão do P0 pedia outra coisa. |
| Segredo do banco de produção | segurança | Pendente antigo: a credencial do loadbalance-prod-postgres vazou num log de tool em 2026-10-12 e precisa ser rotacionada antes de qualquer novo segredo de produção. |
Próximo
- Runbook de produção — topologia, env sem valores, ordem de subida, verificação de cada passo, rollback e a lista da fase B
- PedroPaduelo/render — repo privado da app nova
- PedroPaduelo/agent-package — fonte copiada (só leitura) e alvo da fase B