Fitness functions¶
Testes de arquitetura que protegem as decisões (o CI roda mkdocs/lint em strict). Cada um
existe para que uma decisão não se degrade em silêncio. Tipos: static (sem executar) ou dynamic;
triggered (CI/PR) ou continuous (produção).
FF-1 · Isolamento multi-tenant¶
Protege a Segurança (RNF-2, E1.6/1.7).
- Static: proíbe query ao ORM fora da camada de escopo (todo acesso injeta o filtro de tenant).
- Dynamic: autenticado como tenant A, cada endpoint nega dados de B (Admin é a exceção).
- Continuous: alerta em query sem cláusula de tenant.
FF-2 · Dependência entre módulos¶
Protege o quantum coeso — cada módulo dono das suas tabelas.
- Um módulo só acessa as próprias tabelas; dado de outro só via a API pública dele.
MessagingeRecognitionnão são importados por outros —Journeyemite/enfileira; falha o build sejourney/*importa esses módulos (garante que não vira orquestrador).
FF-3 · Form estável e genérico¶
Protege a Composabilidade — Form é afferent alto.
Formnão importa nenhum vertical (Track/Diagnostic/Scheduling/Journey).- Mudança no contrato público de
Formexige revisão explícita (CODEOWNERS + teste de contrato).
FF-4 · Media só por presigned URL¶
Protege a decisão de não servir blob no backend.
- Nenhum handler retorna o corpo de um arquivo — só URL pré-assinada (com expiração).
FF-5 · Integrações e jobs fora do request¶
Protege a Confiabilidade — async só no worker.
- Static: proíbe chamar WhatsApp / disparar jobs pesados (PDF, rollover) em handler de request — só enfileirar.
- Dynamic: ao concluir etapa/agendar sessão, o handler enfileira e não chama a integração no caminho síncrono.
FF-6 · Eventos de domínio sem ciclo¶
Protege o eixo de conclusão coreografado.
- O grafo evento → listener → evento é acíclico; nenhum listener reentra na própria cadeia.
- Handler de evento interno não chama integração externa direto — enfileira.
FF-7 · Convenção de idioma¶
Protege o RNF-5: rotas/UI em PT, código em EN.
- Rotas expostas em português; identificadores de módulo em inglês (os nomes canônicos).