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.

4
pacotes na main (P0…P4)
22/22
gates verdes no fechamento e na main
909
testes verdes (52 suítes)
5/5
mutações que os testes novos derrubam
1
ressalva crítica corrigida (fail-open)
0
deploys — nada subiu
verde: integradoâmbar: espera decisão suacinza: fora do escopo

Trilha: o que foi embora, onda por onda

Onda 0 · P0 núcleo do backend Onda 1 · P1 banco e espelhos Onda 2 · P2+P3 contratos + identidade Onda 3 · P4 domínio · 22/22 main merge --no-ff Fora: P5…P14 (rotas REST, tools MCP, portão, frontend, shot, testes, migração). O P5 está pronto no worktree, com 2 gates falhando (knip e coverage-floor). Fora: fase B no AgentPack (P-1, P-2, D6, D7, D13, corte) — documentada no runbook, não implementada. Espera você: deploy em produção (autoDeploy nasce desligado) e a ratificação da decisão do P1 sobre o ator bootstrap.

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

OndaPacoteO que éGates
Onda 0P0Núcleo do backend Fastify: buildApp, 12 plugins de borda, config validada, Dockerfile com migrate abortando o boot, suíte e gatesverdes
Onda 1P1Banco: migration inicial (17 tabelas, 8 enums, 11 CHECKs), espelhos da Conta, audit_events com empresaverdes
Onda 2P2 + P3Contratos (zod, JSON Schema, typegen, segurança de conteúdo) e identidade (OIDC render, suspensão por contrato, chaves apk_*, token de preview)verdes
Onda 3P4Domínio do Render: espelho de projeto, catálogo por empresa, services e lib22/22
FechamentoressalvasRessalva (a) corrigida + 4 casos R05–R08 testados + runbook de produção (commit a8b0df4)22/22

O que ficou de fora

ItemEstadoPor quê
P5 — rotas REST (47 endpoints)pronto, não integradoEstá 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 P14fora do escopoTools 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 AgentPackdocumentadaP-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 roteiroD13: o script e o runbook existem no desenho; não se executa contra produção.

O que precisa de você antes do deploy

PedidoTipoDetalhe
OK de deploydecisãoNada 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_SECRETação fora do painelCadastro 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óprioinfraProjeto databases_prod, max_connections acima de 1000, credencial fora do repositório (DB_CONNECTION_LIMIT=1000 na app).
Ratificar o ator bootstrap sem empresadecisãoRessalva (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çãosegurançaPendente 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