Skip to content

Mutação ad-hoc não tem guarda de STALE, e a cara é justamente a que não tem #89

Description

@CRangelP

A dívida

As mutações comportamentais — as que provam que um caso de eval morde — são feitas à mão, em cópias descartáveis, com perl -0pi -e e sem nenhuma verificação de que a edição aconteceu.

O mutation_test.sh não tem esse problema: ele guarda cksum de MUTATED_FILES antes e depois e reporta STALE quando uma mutação não muda nada — guarda que existe desde a #37 exatamente porque uma mutação que não aplica reporta "a suíte pegou" para sempre, e o vermelho que ela deveria produzir nunca aparece.

Fora dali, nada protege. E o custo é assimétrico: mutação comportamental é a cara — minutos e cota de modelo por execução — e é a que produz as conclusões mais fortes do repositório ("o contrato do RED só cai quando as quatro sedes caem", "o teto de fase não morde neste fixture").

Não é hipótese: aconteceu hoje

Ao escrever o invariante da #85, a primeira mutação de verificação foi STALE. O perl não casou, o arquivo não mudou, e a suíte respondeu 465/465 invariants held — que eu quase li como "o invariante não morde".

Só apareceu porque conferi o cksum antes de acreditar no resultado. A leitura errada estava a um passo: "o invariante que acabei de escrever não reprova, então preciso reescrevê-lo" — e o invariante estava certo.

O mesmo risco vale na direção oposta e é pior: uma mutação STALE num caso de eval faria a run legítima rodar contra o texto original, e o verde resultante leria como "o caso não morde", quando o que houve foi uma edição que nunca existiu. Custo: uma run paga e uma conclusão invertida.

Escala do que está desprotegido

Só no lote do milestone anterior: doze mutações ad-hoc na #69, duas na #66 (célula única e conjunto das quatro sedes), uma na #67, uma na #65, mais as de verificação de invariante. Nenhuma com guarda. Que elas tenham aplicado foi verificado por hábito, lendo o trecho mutado de volta — não por mecanismo.

O que resolve

Um utilitário pequeno, na linha do que o mutation_test.sh já faz: aplica a edição, compara o checksum, aborta se não mudou. Três exigências que decidem se ele é útil ou decorativo:

  1. Aborta, não avisa. Guarda que imprime aviso e segue é guarda que some no scroll de uma run de quatro minutos.
  2. Serve para as duas metades. Mutação de texto (barata, para invariante) e mutação de comportamento (cara, para eval) têm o mesmo modo de falha silenciosa, e a distinção entre elas é o assunto da #80.
  3. Reporta o que mudou, não só que mudou. Uma regex gulosa que come metade do arquivo também muda o checksum, e o vermelho que ela produz não é o vermelho que se queria.

Critério de pronto

  • utilitário que aplica, verifica e aborta, usável fora do mutation_test.sh
  • piso próprio: mutação que não casa tem de abortar; mutação que casa demais tem de ser visível
  • o método escrito onde o processo mora — as instruções de mutação comportamental deixam de dizer só "mute e rode"

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions