- NUNCA criar dependências de Infrastructure para Web ou vice-versa
- NUNCA injectar DbContext directamente em páginas Blazor — usar sempre MediatR
- NUNCA colocar lógica de negócio em Razor components — pertence a Use Cases
- SEMPRE usar construtores privados + factory methods nas entidades de domínio
- SEMPRE usar records para Value Objects e DTOs
- NUNCA colocar secrets em appsettings.json — sempre Azure Key Vault
- NUNCA loggar dados pessoais (NIF, nome, etc.) em níveis Information ou inferior
- SEMPRE sanitizar inputs de NIF (apenas dígitos, tamanho 9)
- SEMPRE validar autorização com [Authorize(Policy = "...")] nas páginas
- NUNCA adicionar Update ou Delete ao AuditEntryRepository
- SEMPRE registar acção em AuditEntry antes de qualquer decisão de risco
- SEMPRE incluir o hash do prompt LLM em entradas de auditoria geradas por IA
- NUNCA loggar conteúdo de relatórios KYC em logs aplicacionais
- SEMPRE aplicar políticas de retenção conforme DataRetentionJob
- SEMPRE anonimizar dados após expiração, nunca apagar registos de audit
- Usar C# 13 e .NET 9
- Nullable reference types sempre activados
- Async/await em toda a stack — sem bloqueios síncronos
- Usar CancellationToken em todos os métodos de infra
- Testes unitários para todos os Use Cases e Value Objects
Conformidade BdP (docs/pt/OPERACOES_E_HOMOLOGACAO.md §5, docs/pt/MATRIZ_REQUISITOS_INSTITUCIONAIS.md)
- SEMPRE verificar DueDiligenceLevelEvaluator após entity resolution no pipeline
- NUNCA aprovar caso com CaseParty.VerificationStatus != Verified para UBOs/BoardMembers/Proxy
- SEMPRE registar LegalBasisRef em KycCase (
PAC/{versão}/Lei83/2017-Art24) - EDD: verificação presencial, CMD ou assinatura qualificada — não só videoconferência
- Publicar
EntityIdentityVerifiedNotification/Failedapós webhook ou polling
- NUNCA silenciar SarEligibilityEvaluator.ShouldSuggestSar sem audit
SarSuggested - SEMPRE chamar IAssetFreezeNotificationService quando sanção confirmada
- SAR urgente: audit
SarUrgentSubmitted+SarSubmittedNotification→ supervisores SignalR - Consultar estado UIF via
GetUifSubmissionStatusQueryquando ref. disponível
- SEMPRE
ScheduleNextReview()emApproveKycCaseCommandHandler IPeriodicReviewSchedulerpublica re-triagem para casos comNextReviewDuevencido
- Se
DueDiligenceLevel == EnhancedeCanProceedWithEnhancedDd()falhar: omitir scoring LLM
- SEMPRE snapshot scoring (
SetScoringEngineSnapshot) antes do LLM - SEMPRE
LlmPromptHashemAuditEntrypara acçõesLlmRiskScored/LlmReportGenerated - RPB:
aiModelsJsoncomprovider=contextmemory(sem providers cloud directos)
- NUNCA auto-approve fora de Low + score ≤30 sem High/Critical/sanções
- Relatório: secções Art. 22 e limitações do modelo (
KycStructuredReportComposer)
- Operações / PAC / E2E / analistas:
docs/pt/OPERACOES_E_HOMOLOGACAO.md - Help UX:
docs/help-online/pt/ - Evidências:
docs/dossier/