O que é uma falha determinística? Explicado
Uma falha determinística acontece em toda execução porque sua causa é fixa, está no código, na configuração ou nas entradas, e não no estado transitório do ambiente.
Falhas determinísticas são, paradoxalmente, o tipo bom. Elas são reproduzíveis, o que significa que você pode investigá-las, encontrar a causa e corrigi-la com confiança. O contraste que as define é com as falhas transitórias, que vêm e vão e são melhor tratadas com retries.
A propriedade que a define: reproduzível
Uma falha determinística se reproduz toda vez que você executa o mesmo job com as mesmas entradas. Essa consistência é exatamente o que a torna diagnosticável: você pode reproduzi-la localmente, fazer bisect e verificar uma correção. Nada relacionado ao ambiente influencia se ela acontece ou não.
Causas típicas
- Uma assertion de teste que falha: o código genuinamente não faz o que o teste espera.
- Um erro de compilação ou de tipo que falha de forma idêntica todas as vezes.
- Um arquivo, dependência ou variável de ambiente ausente.
- Uma configuração incorreta que está errada em toda execução.
Por que retries não ajudam
Fazer retry de uma falha determinística é inútil por definição: as mesmas entradas produzem a mesma falha, então uma segunda tentativa falha de forma idêntica. Pior, o retry desperdiça minutos e pode mascarar o sinal real. Falhas determinísticas devem falhar rápido e de forma visível.
Diferenciando de transitória
O melhor diagnóstico isolado é a reprodutibilidade. Se a falha recorre em toda execução, ela é determinística e precisa de uma correção. Se ela vem e vai, é transitória e um retry é apropriado. Classificar corretamente uma falha determina se você a depura ou faz retry.
A perspectiva da Latchkey
Os managed runners com autocorreção da Latchkey são conservadores por design: eles fazem retry de falhas transitórias e mecânicas para que um contratempo pontual não faça seu build falhar, mas deixam as falhas determinísticas falharem rápido, porque fazer retry de um bug real de código apenas adia a correção.
Principais conclusões
- Uma falha determinística se reproduz em toda execução com as mesmas entradas.
- Sua causa está no código, na configuração ou nas entradas, e não no ambiente.
- Retries não ajudam; falhas determinísticas devem falhar rápido.
- A reprodutibilidade é o teste-chave entre transitória e determinística.