Boa pergunta, Leonardo!
Antes de listar: o SDD hoje roda em cima de um projeto .NET (Clean Architecture + CQRS + NHibernate + Vue.js 3), então os gates abaixo são específicos dessa stack. Mas o padrão é o mesmo para qualquer projeto: cada gate nasceu de um bug real ou de uma correção que tivemos que fazer manualmente mais de uma vez. Em um projeto React + Node, os gates seriam outros (validação de props, sanitização de input, patterns de hooks...), mas a mecânica é a mesma: codificar em regras automatizáveis o que hoje vive só na cabeça do dev sênior.
Dito isso, os 49 quality gates estão distribuídos em ~13 categorias:
Arquitetura & CQRS (8)
- Entidade deve herdar Entity<T, long> com genéricos
- Query handler → repositório de leitura, Command handler → repositório de escrita (NUNCA inverter)
- Formulário unificado (Criar/Editar no mesmo form, nunca separados)
- sealed class obrigatório em Commands, Handlers, Controllers, Validators
- Value Objects obrigatórios para Email, CPF, CNPJ, CEP, Telefone (nunca string pura)
- Propriedades virtual com protected set (requisito de proxy NHibernate)
- Nomenclatura padronizada (ObtemPorChaveAsync, nunca FindByChaveAsync)
- DI automático via Scrutor — nunca registrar repositório manualmente
- Constantes centralizadas (5)
- maxlength sempre via constante (LengthsConstraint.X), nunca hardcoded
- [StringLength] idem
- .Truncate() idem
- Chaves de localização devem existir no arquivo central antes de usar
- Nomes de coluna/tabela centralizados em helpers (snake_case)
Commands & Queries (8)
- Command nunca recebe Value Object direto — sempre string, Handler converte
- Strings em Command devem ter .Trim().Truncate()
- Busca textual com .RemoveDiacritics() nos dois lados do Contains()
- .FirstOrDefaultAsync(cancellationToken) obrigatório, nunca síncrono
- CancellationToken sempre repassado, inclusive em métodos privados
- Task.WhenAll proibido com NHibernate na mesma sessão (sequencializar)
- Padrão A (server-side paging) como default em QueryHandlers
- DataGridQuery nunca nullable no controller
Segurança (5)
- [ValidateAntiForgeryToken] proibido — CSRF via Double Submit Cookie
- Nunca expor ex.Message ao usuário — usar mensagem genérica localizada
- [SensibleAuditing] obrigatório em campos LGPD (CPF, CNPJ, Senha, Token)
- Nunca logar dados sensíveis sem sanitizar
- Html.Raw apenas com conteúdo sanitizado
Mapeamento NHibernate (4)
- Ordem fixa no EntityMap: Id → References → Component → Map → HasMany → Table
- Value Objects via Component(), nunca Map() direto
- References() com Cascade.None() para entidades compartilhadas
- Nunca mapear Chave, CriadoEm, AtualizadoEm (EntityMap já faz)
Controllers & Views (4)
- [Authorize] desnecessário — FallbackPolicy global já protege
- View usa , nunca outro componente
- Helpers corretos por tipo de VO (EmailFor, CpfFor, etc.)
- Select-multiple deve usar { id, text }, nunca { id, nome }
Testes (8)
- dotnet build antes de dotnet test
- Builder obrigatório para cada entidade
- Construtor e Atualiza() devem ter mesmas validações nos testes
- Warning testado via Errors["RESULT_WARNING"], nunca resultado.Message
- Mock de localizer via indexer l[key], nunca GetString()
- SoftDelete: mock com ObtemPorChaveAsync, nunca FindByAsync
- 0 falhas para declarar pronto
- Cobertura de 100% dos paths por handler
Registros obrigatórios (4)
- JS registrado no arquivo central de estáticos
- SessionStorage registrada no mixin global do Vue
- Módulo e funcionalidades no DatabaseSeeder.cs
- Chaves de idioma no Resources.resx
Checklist "Não declare pronto" (3)
- Validação final automática: verifica VOs, cascades, flags, imports, helpers, views, registros
- Nenhum erro de compilação
- Nenhum teste falhando
Na prática a contagem cresce conforme adicionamos rules por camada (hoje são 13 arquivos de regras path-scoped que ativam automaticamente ao editar arquivos de cada camada). Os 49 do artigo são os cross-cutting — os que pegam os erros mais frequentes.
O ponto principal: nenhum desses gates foi inventado preventivamente. Todos nasceram de dor real — bugs em produção, code reviews repetitivos, ou correções que fazíamos manualmente toda vez. O SDD só formaliza isso em regras que a IA executa automaticamente.