# ADR-008 — Otimização nativa obrigatória (optimize, OPcache e strict types)

| Campo | Valor |
|---|---|
| **Status** | Aceito (2026-10-16) |
| **Data** | 2026-10-14 |
| **Plano de origem** | `wiki/plan/01-analise-e-decisoes.md` |
| **Relacionadas** | ADR-005, ADR-020 |

## Contexto

O `tecvoto-monorepo` teve problemas com `config:cache`/`route:cache` por **troca de contexto em
runtime**. Como o V7 é **single-tenant físico** (ADR-005), esse risco não se aplica — então o
modo otimizado pode (e deve) ser o padrão. Otimização deixada "para depois" raramente acontece.

## Decisão

O projeto entrega **sempre no modo otimizado**:

- **`php artisan optimize`** é passo obrigatório de build/deploy (config, rotas, views, eventos).
  Pré-condições verificadas no CI: zero `env()` fora de `config/*.php`, zero closure em rotas,
  zero mutação de config em runtime. Rollback: `php artisan optimize:clear`.
- **Autoload de produção:** `composer install --no-dev --optimize-autoloader --classmap-authoritative`.
- **OPcache** ligado (`validate_timestamps=0` em prod, `max_accelerated_files` alto,
  `zend.assertions=-1`, `realpath_cache_size=4096K`); `jit=tracing` **só após medir** (ganho
  pequeno em cargas I/O-bound); `make reload`/`up_prod.sh` recarrega após editar código.
- **`declare(strict_types=1)`** em todo arquivo PHP (forçado pelo Pint).
- **Eloquent Strict Mode** (`Model::shouldBeStrict()`) e **`DB::prohibitDestructiveCommands()`**
  em produção.
- **Assets (Vite 8):** Rolldown/Oxc + Lightning CSS; code-splitting por rota; só `VITE_*` no
  cliente; hash imutável + precompressão brotli/gzip.
- **Entrega:** compressão brotli/gzip (Caddy `encode` + `precompressed`), **HTTP/2/3 no Apache do WHM** (termina TLS; o Caddy fala h1), cache imutável (headers/CSP/TLS no ADR-020).

## Justificativa (alternativas descartadas)

- **Otimizar "depois"** — descartada: dívida que não se paga.
- **`config:cache` só quando "seguro"** — descartada: single-tenant torna seguro por construção.
- **Sem strict types** — descartada: menos segurança de tipos, mais bugs.

## Consequências

**Positivas**
- Performance e segurança nativas; menos surpresas em produção.

**Custos / negativas**
- Exige disciplina (sem `env()` em runtime, sem closure em rotas).
- Em dev, `make reload` após editar (OPcache).

## Exemplo mínimo (comparativo)

```bash
# ❌ Otimização manual, esquecida no deploy
php artisan config:cache   # talvez

# ✅ Obrigatório e verificável
composer install --no-dev --optimize-autoloader --classmap-authoritative
php artisan migrate --force && php artisan optimize
# evidência: php artisan about (config/route/view/event cacheados)
```

## Verificação

- `php artisan optimize` verde no CI; `php artisan about` mostra os caches.
- Gate: PHP sem `declare(strict_types=1)` e `env()` fora de `config/` falham.

## Referências

- `wiki/plan/04-runtime-containers.md`, `wiki/plan/15-cicd-deploy-legado.md`.
