# Exemplo executável — o smoke test da skill

`render-prova.py` monta um mockup completo aplicando o que a skill manda, do
começo ao fim: escalas escolhidas pela heurística, formas determinísticas, specs
Vega-Lite com placeholder constante, chassi HTML do produto, e o assert
anti-vazamento em cada widget.

```bash
python3 exemplo/render-prova.py
```

Cobre cinco arquétipos: KPI (`Kpi`), barra vertical e ranking horizontal
(`Barline`), donut com exatamente 4 categorias (`Pie`, a trava), combo de 2
séries com `shape` (`Barline`), e tabela com coluna `#` e linha `Total`
(`Table`).

Saída esperada:

```
=== escalas desta tela ===
  receita  R$ 123.456,78   total R$ 1.234.567,89
  ticket   R$ 123,45       qtde  123

=== widgets ===
  [ok ] magnitude/Barline
  [ok ] ranking/Barline
  [ok ] parte-todo/Pie
  [ok ] tendencia/Barline

=== resumo ===
  mag          6725 bytes   Poppins=True   placeholder=True
  rank         5518 bytes   Poppins=True   placeholder=True
  donut        5215 bytes   Poppins=True   placeholder=False
  tend        11550 bytes   Poppins=True   placeholder=False
```

`placeholder=False` no donut e na tendência está correto: nenhum dos dois emite
data label, então não há número a exibir.

Ele escreve `mockup.html` no diretório corrente. Para gerar a imagem:

```bash
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
  --headless --disable-gpu --screenshot=mockup.png \
  --window-size=1480,1350 --hide-scrollbars \
  --default-background-color=FFFFFFFF mockup.html
```

## Use isto como regressão

Depois de mexer em `horus-theme.json`, `horus-chassi.json`, `scripts/placeholder.py`
ou em qualquer spec de `ficha-para-vega.md`, rode este script. O `assert` interno
quebra se algum widget passar a exibir um número que não seja placeholder
conhecido nem categoria declarada, que é a falha mais cara desta skill e a mais
fácil de introduzir sem perceber.

## Quatro armadilhas que este exemplo documenta em código

1. **`register_font_directory` antes de tudo.** Sem isso o PNG sai sem nenhum
   rótulo e nada é levantado (`pipeline.md` §6.4).
2. **`"text": {"value": ...}`, nunca `{"field": ...}`.** Amarrar o rótulo a um
   campo faz o número acompanhar a altura da barra, e aí o mockup deixa de ser
   placeholder e vira gráfico real.
3. **`shape` com `legend: None` no combo.** `color` e `shape` no mesmo campo,
   ambos com legenda, fazem o Vega-Lite desenhar **duas** legendas
   (`Meta, Realizado, Meta, Realizado`). O símbolo continua diferenciando a
   série no gráfico, que é o que a regra de deuteranopia exige; só a legenda
   dele é suprimida.
4. **A linha `Total` usa uma escala acima das linhas.** Com o mesmo placeholder
   das linhas, a tabela lê como erro de soma. `acima()` em
   `scripts/placeholder.py` resolve.

## O gerador de placeholder

`scripts/placeholder.py` é importável e roda sozinho:

```bash
python3 scripts/placeholder.py
```

```python
from placeholder import placeholder, escala_de, acima, contagem, TODOS

placeholder(escala_de("faturamento mensal"))   # 'R$ 123.456,78'
placeholder(acima("centenas-de-milhares"))     # 'R$ 1.234.567,89'  (linha Total)
contagem("milhares")                           # '1.234'
```

`TODOS` é a lista de todo placeholder válido, e é contra ela que o assert
compara.
