Já passei por coisas parecidas. Perdi madrugadas com mudanças que "não deveriam ter quebrado nada". Dois casos que me marcaram:
Renomear Utils para utils: No Windows são a mesma pasta. No Linux (runner do CI), não são. O git mv no Windows nem registra a mudança de case. O build no CI falha com file not found e você gasta 2 horas achando que é cache. A solução é forçar em dois passos:
git mv Utils temp && git mv temp utils
Emoji no nome da branch: Um dev criou fix/🐛-null-ref. O Azure DevOps aceitou. O GitHub Actions aceitou. O script de deploy que usava o nome da branch como tag do Docker container... não aceitou. O registry rejeitou a tag silenciosamente. Deploy não aconteceu. Sem erro — simplesmente não fez nada.
O padrão que conecta esses casos: a pipeline assume que o input é "normal" e não valida na entrada. Hoje eu coloco um step de sanity check antes de tudo:
- Validar nome da branch com regex
dotnet format --verify-no-changes(pega formatação alterada por acidente)- Flag quando o diff tem mais de X arquivos (review manual obrigatório)
Pipeline resiliente não é a que nunca quebra — é a que te diz exatamente o que quebrou em menos de 30 segundos.