# Prova: Verde Não É Coberto

> Escopo: Gate 3 (avaliador independente). Não é dimensão do score composto — impõe **teto** em
> Cobertura de Testes (`evals/rubrics/test-coverage.md`, seção "Tetos de prova").

## O que esta prova responde

Um teste que **nasce verde** nunca teve fase RED: ele afirma uma pós-condição que o backend já
garantia antes da mudança. Ele não está errado — está **vazio**. E é indistinguível, no relatório de
execução, de um teste que protege alguma coisa.

A pergunta é: **qual asserção deste teste teria falhado ANTES da mudança?** Se nenhuma, o teste
documenta, não cobre — e isso precisa estar **declarado**, não escondido no verde.

## Bandas 0-10

| 0-3 | 4-6 | 7-8 | 9-10 |
|---|---|---|---|
| Testes novos apresentados como cobertura sem que nenhum tenha tido fase RED. Pré-condições afirmadas em prosa/comentário, nunca medidas | Alguns testes nascem verdes e isso não é declarado. `DoesNotContain` de um item só, deixando os irmãos abertos | O relatório reconhece pelo enunciado quais testes nascem verdes e os declara. Falta a asserção positiva no campo novo ao lado do `DoesNotContain` | Cada teste que nasce verde está declarado como tal, com o motivo. Pré-condições medidas (`Assert.NotNull`), listas EXATAS em vez de negativas pontuais, e mudança de semântica coberta pelo par positivo+negativo |

## Anti-padrões literais

- **Pós-condição que o backend já garante apresentada como cobertura nova** — a fase RED não
  aconteceu. Reconheça pelo ENUNCIADO ("o campo X nunca vem nulo" num campo `NOT NULL` desde a
  migração) e **declare no relatório**. (memória: pós-condição verde-de-nascença numa feature cujo
  contrato já a garantia no schema)
- **Comentário que afirma um fato em vez de asserção** — `// aqui o id já existe` não falha nunca.
  Comentário que afirma fato vira asserção **ou some**.
- **`DoesNotContain` de UM item** — provar que "banana" sumiu deixa "maçã" e "pera" livres. Quando o
  contrato é "só isto e nada mais", asserte a **lista exata**.
- **Pré-condição afirmada em prosa** — "o registro existe neste ponto" precisa ser
  `Assert.NotNull(x)`. Sem isso, um teste que passa por vacuidade (coleção vazia, nulo silencioso)
  se lê como verde legítimo.
- **Mudar semântica e asserir só o lado novo** — ao trocar o texto/o campo, o par é obrigatório:
  asserção **positiva** no campo novo **e** `DoesNotContain` do texto substituído. Sem o negativo, o
  teste passa com os dois presentes.

## Como registrar no relatório

Na seção de análise de cobertura, uma linha por teste que nasce verde:

```markdown
- `test/x.test.js:41` — nasce VERDE: a pós-condição P3 já era garantida pelo `NOT NULL` da coluna
  desde a migração 0007. Documenta, não cobre. Não conta para a faixa 9-10 de Cobertura.
```

E no `**Proof-Scores:**`, a chave `verde`. Um relatório que não distingue "cobre" de "documenta"
não pode passar de 8 nesta prova, por mais testes que tenha.
