auditoria · 12 agentes · 557 medições · 24 ago 2026

O scaffolding está de pé; o peso morto está nas imagens, no cache e nos rituais de CI.

Varredura completa do repositório jeffecom em 6 áreas, com verificação adversarial: cada achado abaixo teve a evidência reproduzida por um segundo agente tentando derrubá-la. O que caiu, caiu — 4 achados refutados não estão aqui.

46
achados reportados
6 mesas em paralelo
42
sobreviveram ao contraditório
~36 temas únicos
2
severidade alta
ação recomendada já
2,5MB
maior ganho único
imagens da home
o que isso significa

A estrutura do projeto está saudável — nenhum achado diz "isto foi montado errado". O que a mesa achou é peso acumulado: imagens servidas 20× maiores que o necessário, regras de cache faltando, fontes pedidas em dobro, e rituais de CI que refazem trabalho. Quase tudo de esforço baixo. Os dois vermelhos merecem prioridade: o retrato de 858 KB com passe de prioridade máxima, e o comprador lendo Termos sem CNPJ.

Severidade alta

2 achados

Confirmados com evidência reproduzida em produção.

site
esforço baixo
O retrato do herói pesa 858 KB pra virar 128 px — e ainda fura a fila
/jeff.png (600×600 PNG) é 97% do caminho crítico da home e tem preload de prioridade máxima. Em WebP 256px vira ~10 KB (−98%). Duas mesas convergiram.
site
esforço baixo
Quem compra lê Termos SEM o CNPJ — existem duas versões divergentes no ar
O rodapé da LP linka as cópias de public/vagas/ (215/200 linhas de diferença); o CNPJ 40.726.324/0001-26 só existe em /termos e /privacidade. Provado em produção.

Severidade média

15 achados

Valem frente própria; nenhum queima a casa hoje.

site
baixo
13 ícones de 1024×1024 (1,72 MB) servidos em molduras de 52 px
São lazy (não afetam o primeiro render), mas custam ~2,5 MB por visita nova. Reamostrar pra 128px resolve.
site
baixo
2,83 MB da home sem regra de cache — a borda revalida a cada visita
_headers não cobre /icons, /creds, /js e jeff.png; revisita paga o RTT do 304. Somar 4 regras.
site
médio
CSS do institucional fossilizado: hash congelado do Next marcado immutable
Editar public/_next/static/css/… NÃO propaga (a URL nunca muda). Favicon e hero-thumb no mesmo barco. Mover pro bundle do Vite devolve o hash honesto.
site
médio
6 páginas pedem ao Google as 3 fontes que já moram no próprio site
14 woff2 (210 KB) self-hosted que só a /vagas usa; as demais pagam CSS render-blocking + 2 handshakes à toa.
site
baixo
/obrigado carrega as fontes em dobro
9,6 KB de @font-face inline (CF Fonts) + 16,3 KB do Google render-blocking, sem preconnect ao gstatic.
site
médio
Na home, Geist e JetBrains nunca chegam — o texto cai no fallback
O CF Fonts da zona só reescreveu a Bricolage; as outras 2 famílias declaradas nem carregam. Tipografia da marca a menos.
site
baixo
~10 MB de imagens órfãs versionadas e publicadas
th-opt/ (3,6 MB, só a era Coolify usava), 30 creatives full-size (4,3 MB — o site só usa os -128) e 6 JPGs de origem. Ninguém baixa, mas todo clone e deploy carrega.
worker
baixo
Segredo do webhook viaja na URL e o log do Worker grava a URL inteira
?k=SECRET + observability com amostragem 100%. Rotacionar e aceitar header (o /conversions já foi corrigido assim).
worker
médio
O cron do e-mail roda no escuro: sem log, sem try/catch, sem observability
Se falhar, ninguém fica sabendo — é descobrir pela ausência de e-mails.
worker
baixo
Typecheck do email-worker existe, passa em 1s — e o CI nunca o roda
Gate grátis já verde; é 1 linha no workflow. Site e quiz cobrem via build; este é o único nu.
ci
médio
tracking-worker (o worker que fatura) publica na mão, sem esteira
Testes rodam no CI, mas o deploy é wrangler deploy manual — exatamente o padrão que o quiz-publish nasceu pra matar.
agentes
baixo
Índice de SOPs declara 395, lista 389 — e o gate confere o número errado
6 contratos fora do índice colidem de nome com gêmeos; o gate compara arquivo-vs-arquivo e nunca vê. Corrigir o compute pega a classe.
agentes
médio
Ativar a maior task de copy custa ~104 mil tokens antes da 1ª palavra
create-sales-page puxa 83 SOPs (258 KB) + agente + DNAs = 404 KB. Carga por fase exige consertar o YAML de fases (chaves duplicadas).
raiz
médio
.env com 38 credenciais versionado e isento do scanner de segredos
Decisão documentada da casa (repo privado, 2026-08-04) — mas o comentário envelheceu e o histórico guarda tudo. Vale revisitar a decisão, não só o arquivo.
raiz
médio
72% do peso do clone são screenshots que o CI nunca executa
69,9 MB de snapshots VRT -darwin da app congelada. Atenção: git rm --cached não encolhe o pack — 22 MB já são história; precisa de decisão de reescrita ou aceite.

Severidade baixa

18 achados

Higiene e oportunidades — muitos com a ressalva do verificador anotada.

site
Gate de PR usa npm install; publish usa npm ci
Árvores hoje idênticas (verificado), mas o risco é latente. cache:npm procede onde há lockfile.
ci
Smoke pós-deploy não distingue deploy novo de anterior
sleep 5 + contrato que a versão antiga satisfaz por construção. Poll de hash do build resolveria.
ci
Playwright baixa o browser a cada publish
11,5s de download + 21s de apt num run de 104s. Cache de ~/.cache/ms-playwright poupa a metade certa.
ci
O publish constrói o site 3× e o smoke sobe um preview que nunca usa
O rebuild do gate é decisão documentada; o do smoke é desperdício (~6s).
ci
Apps e gate rodam 2× por mudança; 3 workflows sem concurrency
Custo ~centavos por merge; tirar o push da main deixaria o squash sem gate próprio — só o concurrency vale.
ci
cancel-in-progress do quiz mata as 2 skins em bloco
Mecânica real; alvos são preview sem tráfego e reconvergem no run seguinte.
worker
/conversions com limit negativo vira LIMIT sem teto
Reproduzido (atrás da chave de leitura). Clamp de 1 linha + teste.
worker
Nenhum workflow de deploy pros 2 workers; versões wrangler divergem
Email-worker trava 3.114 no lock; padrão de Pages não replica direto pra Worker.
worker
Paridade fonte×bundle do tracking cobre 1 das 5 funções
As outras 4 podem divergir do que está no ar sem teste vermelho.
worker
Teste do tracking duplicado: raiz e app rodam quase o mesmo arquivo
Herança do glob da raiz; consolidar num lugar só.
agentes
4 contadores do registry erram de 10% a 250%
Nada executável os lê; só 1 é gated. Corrigir + estender declaredCounts.
agentes
4 checklists migrados sem fiação em task nenhuma (+8 fora do config)
Import feito, uso não decidido — decidir plugar ou remover.
agentes
authority/schwartz.yaml é stub de 88 bytes
O arsenal existe inline no agente (que é o carregado); dívida já registrada como baixa.
agentes
voice/phrases/authority usam sobrenome; data/minds usa slug
A ambiguidade schwartz (Eugene × Ry) é real; a regra documenta o risco em vez de eliminá-lo.
raiz
Token legado squads/copy casa por prefixo com diretório vivo
Já mordeu um PR nesta sessão. Ancorar à direita fecha a classe.
raiz
package.json sem type:module gera 6 reparses por npm test
Fix composto: copy-linter.js é CommonJS e quebraria — migrar junto.
raiz
Quiz publica com npm install sem lockfile npm
Decisão documentada (corepack bloqueia pnpm; alvos são preview).
site
Nenhum gate mede peso de página antes do deploy
O orçamento de 1 MB citado na auditoria não existe em lugar nenhum do repo — criá-lo é o guarda-chuva dos achados de imagem.

Como isto foi apurado