# ADR-040 — Análise estática sem relaxamento (baseline zero)

| 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-002, ADR-010, ADR-023 (supersede o baseline), ADR-017, ADR-038 |

## Contexto

A ADR-023 aceitava um **baseline commitado que só encolhe** (87 erros suprimidos em 53 entradas,
em 2026-10-17) e o `phpstan.neon` carregava **relaxamentos**: `treatPhpDocTypesAsCertain: false`,
`excludePaths` para migrations/factories e nenhum `bleedingEdge`. O baseline é editável por humano
(`--update`) e a dívida fica invisível. O dono exige **rigor máximo sem relaxamento**: o que é do
projeto deve ser corrigido, não suprimido.

## Decisão

- **Baseline zerado e removido** (`phpstan-baseline.neon`/`phpstan-baseline.count` deixam de
  existir; o alvo `baseline zerado` é removido). PHPStan tem de passar com **0 erros**.
- **Sem relaxamento**: `treatPhpDocTypesAsCertain` volta ao padrão (`true`).
- **`bleedingEdge` ativo** (`vendor/phpstan/phpstan/conf/bleedingEdge.neon`).
- **Migrations e Factories entram** na análise — o padrão de migration do projeto é seguro por
  desenho (`Schema::hasTable`, `lock`, transação, `down()` → `backup_*`, ADR-017), então analisá-las
  **não** conflita com esse padrão.
- **Detecção de código morto** como gate (`shipmonk/dead-code-detector`, MIT; PHPStan ≥2.1.41).
- **Exceção única tolerada**: `ignoreErrors` **estreito** (`path`/`identifier`) apenas para o que
  foge ao controle do projeto (tipos internos do framework/Eloquent/Larastan). Cada exceção é
  **comentada com o motivo** e revisada. **Nada** de relaxamento global.

## Justificativa (alternativas descartadas)

- **Baseline “só encolhe” (ADR-023)** — descartada: dívida invisível e burlável.
- **Relaxar tipos de PHPDoc** — descartada: esconde bugs reais de fronteira.
- **Excluir migrations/factories** — descartada: o padrão seguro não depende de exclusão.
- **Mago** (`carthage-software/mago`, Apache-2.0/MIT) **como substituto** de PHPStan/Larastan —
  **descartada**: é *framework-agnostic* (sem plugin equivalente ao Larastan para facades/Eloquent/
  container) e trocaria **mais** rigor por **menos**. Também descartado como formatter (não é o
  estilo Laravel do Pint). Pode ser reavaliado como **gate complementar** em ADR futura, com demanda.
- **Hook de pré-commit** — descartado pelo dono: o CI + `make check` bastam; o agente não commita.

## Consequências

**Positivas**
- Zero dívida estática escondida; qualquer erro novo quebra o build local.
- Código morto vira gate (relevante ao eixo D14 da revisão).

**Custos / negativas**
- `bleedingEdge` + inclusão de migrations/factories elevam a contagem inicial (137 erros medidos em
  2026-10-17) — todos corrigidos antes de avançar a implementação.
- Exceções de framework exigem curadoria (comentadas), não supressão cega.
