# ADR-038 — Cobertura de testes ≥90% e rigor de não-regressão

| Campo | Valor |
|---|---|
| **Status** | Aceito (2026-10-17) |
| **Data** | 2026-10-17 |
| **Plano de origem** | decisão do dono (revisão F3, 2026-10-17) |
| **Relacionadas** | ADR-001, ADR-023 (supersede a cobertura), ADR-025, ADR-039 |

## Contexto

A ADR-023 definia metas de cobertura **por camada** (core ≥90%, services ≥85%, layout ≥80%,
modules ≥75%) — média ~82% — mas **não havia gate**: `make check` gerava o relatório e o CI
publicava o número sem nunca bloquear. Medido em 2026-10-17: **47,65%** de linhas (`src/`), com
`modules` 46,7% · `services` 50,9% · `core` 51,7% · `layout` 36,6%. A regra existia só no papel;
dependia de disciplina humana. O dono exige que a validação seja **estrutural e local** (no fluxo
de desenvolvimento), não confiada ao CI/CD.

## Decisão

- **Cobertura de linhas ≥ 90%** para todo o `src/`, como **piso único** (sem metas por camada).
- O gate roda no **fluxo de desenvolvimento** (`make check`), não apenas no CI.
- **Prioridade de valor: e2e e testes de não-regressão > testes unitários.** Um teste unitário que
  apenas espelha a implementação, sem valor de regressão, **não conta como cobertura útil** e pode
  ser descartado — mas os **testes e2e e de feature/não-regressão são obrigatórios**.
- Medição com **PCOV** (já no projeto); o gate lê o relatório Clover e falha abaixo do piso.
- **Supersede** a tabela de metas por camada da ADR-023.

## Justificativa (alternativas descartadas)

- **Metas por camada (ADR-023)** — descartada: ambígua e, sem gate, inócua.
- **Cobertura só no CI** — descartada: o dono entrega o código validado no fluxo local.
- **“Ratchet” de cobertura (“não cair”)** — descartada pelo dono: a regra é **≥90%**, não “não cair”.
- **Contar cobertura de e2e** — não aplicável: PCOV mede PHPUnit; e2e entra como prioridade de
  esforço, não no percentual.

## Consequências

**Positivas**
- Piso objetivo e verificável; regressão de teste bloqueia **localmente** (`make check`).
- Foco no que dá valor: fluxos reais (e2e/feature) antes de unidade especulativa.

**Custos / negativas**
- Subir de 47,65% → 90% é um esforço dedicado; começa por e2e/não-regressão (maior valor).
- Enquanto o piso não é atingido, `make check` fica **vermelho por cobertura** — a dívida é
  explícita, não escondida.
