# História 11 — Core Web Vitals (orçamento)

## Objetivo

Provar que o portal entrega dentro do **orçamento de Core Web Vitals** sem depender de medição de
tempo (que é de campo/RUM): **CLS ≤ 0,1** e **zero recursos bloqueando a renderização** — o portal é
mínimo JS (ADR-010, plano 14 §2).

## Pré-condições

- `make up` + `make check` (assets compilados, com as variantes `.br`/`.gz`).

## Passos

1. Abrir a home (`/`) e a listagem (`/noticias`) com o observador de `layout-shift` já instalado.
2. Somar os shifts **sem** interação recente (CLS canônico) e conferir contra o orçamento.
3. Conferir que todo `<script src>` é `module`/`defer`/`async` e que há no máximo uma folha de estilo
   no `<head>`.
4. Medir a **caixa de linha** (`line-height: normal`, a 100px) do webfont e do `@font-face` de
   fallback e conferir a paridade (sem reflow no `swap`).

## Contrato verificado

- **CLS ≤ 0,1** nas duas páginas (dimensões explícitas nas imagens; sem injeção de conteúdo tardia —
  ADR-026/ADR-001).
- **Nada bloqueia a renderização** (`<script type="module">`, CSS crítico único) e o **JS do portal é
  mínimo** — o orçamento de bytes correspondente é medido no PHPUnit (`PerformanceBudgetTest`).
- O build entrega `.br`/`.gz` determinísticos, servidos pelo `file_server precompressed` do Caddy
  (ADR-008/ADR-022).
- O **fallback métrico** (`@font-face` local com `size-adjust`/`*-override`) reproduz as métricas do
  Atkinson Hyperlegible Next (caixa de linha e largura), então a troca pelo webfont não gera
  layout-shift — ADR-011 (`clamp`/métrica sempre em `rem`).
