Files
Projeto-Portaria/prompts/FASE-9-hardening.md
2026-07-22 15:55:55 -03:00

6.0 KiB
Raw Blame History

FASE 9 — Hardening e produção

Objetivo

Provar que o sistema aguenta o mundo real: testes ponta a ponta, carga no SFU, injeção de falhas, revisão de segurança e deploy documentado.

Pré-requisitos

FASES 08 concluídas. Ler docs/06-LGPD-E-SEGURANCA.md §5 e docs/07-REQUISITOS-DE-CAMPO.md.

Tarefas

1. Testes ponta a ponta

Playwright para os webs, Maestro para os apps. Cenários obrigatórios:

  1. Visita completa: QR → aviso → permissões → foto → unidade → morador atende → autoriza → PIN
  2. Entrega em um toque, resolvida pela notificação, em menos de 10s
  3. Escalonamento completo: ninguém atende → outros moradores → fila → operador → autorizado
  4. Recado: ninguém atende, sem módulo de operador → grava → morador resolve depois
  5. Unidade inexistente: visita criada, ninguém notificado, expira — resposta indistinguível de unidade válida
  6. Fora do geofence: bloqueado com mensagem acionável
  7. Quiet hours: desvia sem tocar em ninguém
  8. Dois moradores respondendo juntos: um vence, o outro vê quem resolveu
  9. LiveKit fora: degrada para áudio, depois foto+texto
  10. Backend reiniciado no meio de uma visita: escalonamento acontece mesmo assim

O cenário 10 é o que valida o padrão de timeouts persistidos. O 5 valida a busca cega.

2. Teste de carga

SFU: 50 chamadas simultâneas de 2 participantes, medindo banda, CPU e tempo até o primeiro frame. Confronte com o dimensionamento de 05-INFRA-DOCKER.md §4.

API: 100 visitas/minuto sustentadas — muito acima do real (~0,3 req/s), de propósito.

Fila: 10 mil jobs agendados para o mesmo instante, verificando que nenhum é perdido ou executado duas vezes.

Banco: tabela de auditoria com 1 milhão de visitas; a tela do admin precisa continuar fluida.

3. Injeção de falhas

Derrube cada peça, uma por vez, com uma visita em andamento, e verifique o comportamento:

Peça derrubada Comportamento esperado
LiveKit Degrada para áudio → foto+texto → operador
Redis WebSocket degrada para polling; fila continua (está no Postgres)
MinIO Visita prossegue sem foto, com aviso; upload entra em retry
FCM WebSocket assume se o app está aberto; falha vai para o dashboard
Uma réplica do backend Outra assume; jobs pendentes executam
Postgres (breve) Erro claro ao visitante e contingência física acionada

Teste do relógio: atrase o relógio de uma réplica em 30s e confirme que ShedLock não permite execução dupla.

4. Revisão de segurança

Percorra o modelo de ameaças de 06-LGPD-E-SEGURANCA.md §5 e prove cada mitigação:

  • A.1 Busca cega — tempo de resposta constante medido estatisticamente, não no olho. Este é o teste mais importante da fase
  • A.2 Geofence — rejeita fora do raio; GPS falsificado é registrado
  • A.3 DoS social — rate limit e quiet hours funcionam; varredura gera alerta
  • A.4 Mídia — nenhuma URL pública; assinada expira; acesso auditado
  • A.5 AuditoriaUPDATE/DELETE em audit_log falham no banco
  • A.6 Tokens — JWT de visitante não serve para outra visita nem outra portaria
  • A.7 QR — incrementar qr_version invalida os códigos antigos

Rode também: pnpm audit, gradle dependencyCheck, varredura de imagem Docker (Trivy), e headers verificados por observatório de segurança.

Grep obrigatório: nenhuma biblioteca de detecção ou reconhecimento facial em build.gradle.kts ou package.json. A tentação aparece disfarçada de UX ("só para enquadrar o rosto") e tem consequência jurídica direta.

5. Checklist de produção

Infraestrutura

  • Faixa UDP 5000060000 aberta (esquecer isso conecta a chamada e nunca mostra vídeo)
  • TLS válido e renovação automática testada
  • Backup automático com restore testado e cronometrado
  • Segredos fora do repositório e fora das imagens
  • Healthchecks respondendo em todos os serviços
  • Alertas chegando em canal monitorado de verdade

Aplicação

  • Perfil prod, sem stack trace exposto
  • Rate limits ativos
  • CORS restrito aos domínios reais
  • Logs sem dado pessoal (nome, foto, coordenada) — verificar linha a linha
  • Migrations aplicadas em ordem em banco limpo

Apps

  • Builds de release assinados
  • Testados em dispositivo físico, Android e iOS
  • Ficha de privacidade da App Store e do Google Play preenchida
  • Justificativa de VoIP documentada para a App Review
  • Crash reporting sem PII

Conformidade — checklist completo de 06-LGPD-E-SEGURANCA.md §9.

Campo — checklist de ativação de 07-REQUISITOS-DE-CAMPO.md §2 para o condomínio piloto.

6. Deploy

docs/anexos/deploy.md com provisionamento, primeiro deploy, atualização sem downtime (rolling com healthcheck), rollback, aplicação de migration com dado em produção, e o procedimento de crescer para HA.

7. Piloto assistido

Antes da ativação definitiva, duas semanas com o módulo de operador ligado, monitoramento diário e reunião semanal com o síndico.

O que se mede: taxa real de atendimento, tempo médio de resolução, abandono de entregador, incidentes, e feedback qualitativo de moradores e entregadores.

É esse número — não a expectativa comercial — que define se o condomínio fica no plano Autônomo ou no Assistido.

Critérios de aceite

  • Os 10 cenários E2E passam em CI
  • Carga do SFU dentro do dimensionamento previsto
  • Toda injeção de falha se comporta como na tabela
  • Todas as mitigações do modelo de ameaças verificadas
  • Busca cega com tempo constante comprovado estatisticamente
  • Checklist de produção 100% marcado
  • Restore de backup executado e cronometrado
  • Runbooks testados por alguém que não os escreveu
  • Piloto de duas semanas concluído com métricas coletadas

Não faça nesta fase

  • Novas funcionalidades — se aparecer necessidade, vira v2
  • Otimização sem métrica que a justifique