Motor — relatório de fecho

Deploy 38bf38e4 nos três serviços + auditoria de produção somente-leitura
Data: 2026-10-15 Janela da auditoria: 2026-10-15 04:52Z → 05:10Z Somente leitura no banco Sem segredo neste relatório

01Números

Todos os números vêm da auditoria de produção feita sob default_transaction_read_only = on e dos logs do próprio banco. Nenhum número foi estimado.

4
pendências fechadas
rollback, testes de setup, tool que falha, socket.io
3
serviços em 38bf38e4
be, worker e fe — healthz, readyz e / respondendo 200
13→11
falhas de teste do back
baseline agora 11 em vez de 13
21/21
migrations
repo = banco, 0 faltando, checksum 21/21 igual
86
threads ACTIVE paradas >24h
46 subagente + 40 root, nenhuma com lock vivo
0
erros de API desde o deploy
145 requisições, 0 de 400/401/403/429/5xx, 0 crash

02Antes / Depois

O que estava quebrado e o que está no ar com 38bf38e4. Cinza é o estado anterior; verde é o estado verificado hoje.

ANTES — ESTAVA QUEBRADO DEPOIS — ESTÁ NO AR TLS do banco DESLIGADO sslmode=disable, DATABASE_TLS_POLICY=allow-insecure, host público TLS ligado e obrigatório ssl=on, hostssl aceita e hostnossl rejeita; log do banco prova a recusa às 05:08/05:09 POOL ESTOURA O SERVIDOR 1000 × 2 processos = 2000 conexões contra max_connections 100 Pool cabe no Postgres mesma demanda 2000 contra max_connections 3000 Linha da tool girando até recarregar nos dois caminhos: step.toolResults do AI SDK e o broadcast Erro aparece na hora tool-error tratado nos dois caminhos, com paridade testada por mutação Tela dizia “caiu no /ws” e não caía frase mentirosa na UI Frase verdadeira + runbook §6.7 socket.io corrigido e coberto por teste — deliberadamente NÃO ligado em produção Rollback sem prova o estado “aborting” derrubava /tree e /graph com 500; migrate deploy do código velho saía 0 sem desfazer o banco Runbook documentado e testado contra o schema real docs/operacao.md §8.1 + teste que executa o SQL do documento

03Bloco a bloco

Cada bloco com o status e a evidência que sustenta o status. Âmbar é ressalva real, não pendência de código.

BlocoStatusO que éEvidênciaDetalhe
Deploy 38bf38e4 VERDE be, worker e fe no ar com o mesmo commit /healthz 200 · /readyz 200 · / 200 nos três; bundle do fe com 38 chunks / 1.889.428 bytes No bundle: “caiu no /ws” ausente, “ao vivo na barra” presente, isError presente, abort_orphan_closed presente.
1. Rollback documentado e testado VERDE O caminho de volta ficou escrito e é executado por teste contra o schema real docs/operacao.md §8.1 · be/src/persistence/rollback-aborting.doc.test.ts A armadilha do estado “aborting” foi provada: o código anterior derruba /tree e /graph com 500, e o migrate deploy do código velho termina em 0 sem devolver o banco. O teste executa o SQL do documento, então o doc não pode mentir.
2. Dois testes de setup VERDE Não eram bug de produção — o teste era cego agents.test.ts · setups/patch-schema.test.ts (guarda hermética sem banco) A igualdade com a frase do zod 3 derrubava na primeira asserção e o PATCH inteiro nunca rodava. Mutação prova que um PATCH frouxo daria a MESMA falha da baseline — a regressão ficava escondida dentro das falhas “conhecidas”. Baseline test:be foi de 13 para 11. Nenhuma linha executável de produção mudou.
3. Tool que falha VERDE A linha da tool girava “running” até você recarregar wf/sdk d4904fa4 · paridade testada nos dois caminhos O step.toolResults do AI SDK também só traz tool-result; falha é tool-error. Corrigido nos dois. Era no caminho PADRÃO de produção. Mutações nos dois lados provam que a correção detecta a volta do defeito.
4. socket.io VERDE A tela affirmava uma queda no /ws que não acontecia Frase corrigida · runbook §6.7 · 7 mutações A frase mentirosa foi corrigida e o comportamento tem teste e mutação. NÃO está ligado em produção — é o motivo de o fe não ter o texto antigo no bundle.
TLS do Postgres VERDE Cifra e é obrigatório — conexão sem TLS é recusada Log do próprio banco: “parameter ssl changed to on” 05:05 · “pg_hba.conf rejects connection … no encryption” 05:08 e 05:09 · zero rejeição depois Cert EC P-256 dentro do volume; hostssl aceita e hostnossl rejeita; as aplicações em sslmode=require.
max_connections VERDE 100 → 3000 ALTER SYSTEM + reload; boot do worker: “🟢 Pool cabe no Postgres (pool por processo 1000 × 2 processo(s) = demanda 2000 contra max_connections 3000)” Postgres reiniciado uma vez às 04:34:43Z (checkpoint forçado + fast shutdown, 8 conexões derrubadas) e voltou com o valor novo.
Varredura de órfãos AMBAR Rodando no worker, mas não fecha nada abortOrfaos rodando, intervalo 60s, teto de idade 10s, 0 fechadas · 0 eventos abort_orphan_closed aborting sem dono de varredura: 0 — o caminho está certo. O que falta é o reaper, que está OFF por decisão do dono.
Health da API desde o deploy VERDE 145 requisições de API e 159 /healthz, tudo 2xx 141×200, 3×201, 1×404 · 0×400/401/403/429/5xx · 0 “too many connections” · 0 crash · 0 linha de nível ≥50 Turnos desde o deploy: 3 done / 0 errored / 0 aborted (24h antes: 51 done / 3 errored / 13 aborted).
Migrations VERDE Repo e banco em paridade 21 no repo, 21 aplicadas, 0 faltando, 0 sobrando, 0 falhadas ou reverted · checksum 21/21 igual Última: 20261014100000_indices_2_11, aplicada 03:35:51Z.
Workflows VERDE Nada preso 5 runs (3 succeeded, 2 failed), 0 em queued/running/waiting · 74 tentativas (55 failed, 19 succeeded), 0 sem finished_at Último movimento em 2026-10-01 — nenhum workflow rodando hoje.
Órfãos com a marca metadata.orphan VERDE A marca nunca é gravada 0 de 551 subagentes com metadata.orphan · 0 roots com orphan · 0 órfãos malformados Mas existem 7 subagentes active órfãos de fato SEM a marca: 5 sem pai e 2 com pai já completed. A varredura não os enxerga porque eles nunca receberam a marca.
Erro de tool em 7 dias AMBAR 193 de 28.832 resultados de tool falharam (0,67%) sandbox_process_wait 129 · sandbox_bash 35 · run_command 13 Desde o deploy: 0 falhas de tool. 24h antes do deploy eram 11 de 1.623.
Avisos de SDK AMBAR 4 avisos de “System messages in the prompt” e 3 vazamentos de MCP 3× “[mcp-pool] LEAK detected” por volta de 04:03Z Os vazamentos são de browser, agentpack e mp, 1 referência cada depois de 60s. Não cresceram desde então, mas continuam sem causa encontrada.

04Só do dono

Em ordem de gravidade: primeiro o que está fora do meu alcance, depois o que ainda pode virar problema. Nenhum item aqui é bug de código.

1
Girar duas senhascritica
Duas credenciais estão fora do seu controle desde que apareceram em log.
  • auditoria HML — vazou em 2026-10-15
  • loadbalance-prod-postgres — vazou em 2026-10-12
O que fazer: Rotacionar as duas. Enquanto não girar, qualquer pessoa com o histórico Those log has o acesso.
2
Vazamento de conexão de MCP (3×)alta
“[mcp-pool] LEAK detected” às 04:03Z, em browser, agentpack e mp. Cada um ficou com 1 referência depois de 60s, o que indica um finally que escapou.
O que fazer: Investigar antes de virar rotina. Hoje são 3 em uma janela de 80 minutos de log do be; se o padrão repetir em outro deploy, é virando vazamento de verdade.
3
86 threads ACTIVE paradas e 16 turnos “running”alta
86 threads ACTIVE sem movimento há mais de 24h (46 subagente + 40 root). Nenhuma tem lock motor:lock:thread no Redis, e o SCAN de locks vivos devolveu 0 — são zumbis de restart, não trabalho em andamento. Dos 46 subagentes, 38 estão assim desde 2026-10-02 (mais de 7 dias) e 8 desde 2026-10-12. Somados a isso, 16 turnos seguem marcados como running, todos com mais de 24h e nenhum iniciado depois do deploy. O mais antigo tem 12d22h e está na lixeira; o mais antigo visível é a thread 28536176, com 3 turnos abertos desde 2026-10-11.
O que fazer: O reaper está OFF por decisão sua. Sem ele, nada fecha isso: a varredura de órfãos está rodando e já fechou 0. Ou liga o reaper, ou aceita que a lista cresce a cada restart.
4
Postgres exposto na porta públicamedia
31 “incomplete startup packet” antes da janela (scanner na porta pública) e 1 tentativa de login às 04:41 com a role “loadbalance” — que não existe neste banco e é de outro serviço. A regra do pg_hba recusou a autenticação; ninguém entrou.
O que fazer: Fechar a porta pública e deixar só o que o serviço usa, ou pôr o banco atrás de uma rede interna. A role do outro serviço tentando entrar aqui é o sinal de que a superfície está maior do que devia.
5
TLS sem verificar quem é o servidormedia
O transporte está cifrado e obrigatório, mas o cliente não confere o certificado do servidor (verify-full ausente).
O que fazer: Subir para verify-full com o certificado do banco. É o passo que falta para o TLS ser criptografia e não só codificação.
6
Redis do Motor sem TLSbaixa
O Redis responde PING ok, mas o caminho até ele não é cifrado.
O que fazer: Ligar TLS no Redis quando o Postgres estiver fechado. É o mesmo padrão que já foi aplicado no banco.

05O que testar agora

O que já está no ar e ainda não tem o seu olhar de usuário. Em ordem: o caminho de produção primeiro.

1Tool que falha, caminho padrão
ComoRode uma tool que vai falhar de verdade — um sandbox_process_wait com processo inexistente, por exemplo.
EsperadoA linha da tool para de girar na hora e mostra o erro. Sem F5. Era este o defeito do caminho de produção.
2Tool que falha, caminho do SDK
ComoMesmo teste, agora num turno que passe pelo step.toolResults do AI SDK.
EsperadoMesma resposta visual. A paridade entre os dois caminhos é o que a correção@testou.
3Mensagem do tempo real
ComoAbra uma thread e veja a linha que anuncia a conexão.
EsperadoDiz “ao vivo na barra”. NÃO pode aparecer “caiu no /ws” — o socket.io está desligado de propósito.
4PATCH de setup com chave desconhecida
ComoMande um PATCH de setup com uma chave que não existe no contrato.
Esperado400 com o nome da chave, e nada é gravado: override e versão intactos. É o contrato do docs/api-terceiros.md, agora realmente verificado.
5Health dos três serviços
ComoAbra /healthz, /readyz e / em be, worker e fe.
Esperado200 nos três. Foi como o 38bf38e4 foi confirmado hoje.
6Postgres recusando conexão sem TLS
ComoTente conectar sem TLS no banco do Motor.
EsperadoRecusa com “pg_hba.conf rejects connection … no encryption”. É o que o log do banco já mostrou às 05:08 e 05:09.
7Rollback de verdade
ComoLeia docs/operacao.md §8.1 e confira que o SQL de lá é o mesmo que be/src/persistence/rollback-aborting.doc.test.ts executa.
EsperadoSe os dois divergirem, o teste avisa — porque ele roda o SQL contra o schema real, não contra uma cópia.