# Prova: Fiação

> 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

A camada pura pode estar perfeita e o produto continuar quebrado, porque **ninguém ligou o fio**.
Mutar a função pura prova a função; não prova que o comando a chama, que o handler a expõe, nem que
o efeito é observável na saída.

A pergunta é: **existe um teste que vai da ENTRADA REAL ao EFEITO OBSERVÁVEL, e o inventário de
consumidores do eixo novo está completo?**

## Bandas 0-10

| 0-3 | 4-6 | 7-8 | 9-10 |
|---|---|---|---|
| Só testes de unidade da camada pura. Nenhum consumidor inventariado. Contagem de testes citada como total agregado, escondendo a perna que não rodou | Um teste de ponta a ponta existe, mas só de RECUSA — o caminho de sucesso segue intestável. Inventário por literal, que não vê argumento de helper | Um teste por comando/handler da entrada ao efeito. Inventário por `grep` presente mas incompleto (falta ação em massa, ou estado vazio, ou "limpar", ou chave de cache) | Entrada real → efeito observável em cada comando/handler; inventário de consumidores fechado, um a um; contagem de testes citada por `id` de nó, nunca agregada |

## Anti-padrões literais

- **Mutar a camada pura e concluir que o fix está ligado** — a mutação prova o módulo, nunca a
  fiação. Prove o fio com um teste que entra pela superfície real.
- **Só testes de recusa** — eles passam com a escrita quebrada. Medido: um caminho de escrita cujo
  corpo virou `return 0;` passou **23 de 23** testes, todos de recusa. O caminho de SUCESSO é o que
  precisa de teste.
- **Eixo novo no estado sem inventário de consumidores** — um campo novo tem N leitores. Levante-os
  por `grep` e percorra os quatro suspeitos de sempre: **ação em massa**, **estado vazio**,
  **"limpar"/reset** e **chave de cache**. Um deles fica de fora por descuido, sempre o mesmo.
- **Varredura por literal quando o valor viaja como argumento de helper** — procurar `"Gardim"` não
  encontra `Compose("Gardim")`. Medido: **11 call sites** sobraram numa varredura por literal.
  Procure pelo helper, não só pelo valor.
- **Campo novo em spec sem os pontos de wiring, um a um** — schema, parser, escritor, leitor,
  validador e superfície de exibição. Liste-os e marque cada um.
- **Citar um total agregado de testes** — o `verify` reporta `nodes.tests.runs[]` com um `count`
  **por `id`** (contrato de #90/8.35). Cite **por `id`**: `runs[dotnet].count`, `runs[node].count`.
  Um total esconde exatamente a perna que não rodou. E `count: null` é **contagem desconhecida**,
  nunca zero — um nó com `null` não autoriza nenhuma afirmação numérica sobre ele.

## Como registrar no relatório

Duas coisas, sempre:

```markdown
**Fiação verificada:** `POST /leads` → handler → `LeadService.Create` → linha em `leads` (teste
`LeadsEndpointTests:88`, caminho de SUCESSO, não só de recusa).

**Contagem por nó:** runs[node].count = 2712 · runs[dotnet].count = 41 · runs[e2e].count = null
(desconhecida — o nó pulou, razão `docker is not available`).
```

E, quando a feature acrescenta um eixo ao estado, o inventário de consumidores como lista fechada,
com o comando de `grep` que a produziu.
