# História 28 — Página estática no portal (fallback, render, SEO, prévia e transições)

## Objetivo

Provar o ciclo completo da página estática depois do CMS: o **rascunho** é pré-visualizado no shell
real (só autenticado, `noindex`), **publicar** faz a URL pública responder 200 com o AST renderizado
e a canônica/`hreflang`, **arquivar** devolve 404 real com `X-Robots-Tag: noindex` — e o fallback
`/{slug}` **nunca** sombreia uma rota viva (`/noticias` continua respondendo).

## Pré-condições

- `make up` + `php artisan db:seed` (perfil demo com `paginas.ver`/`paginas.editar`/`paginas.arquivar`).
- Migração `paginas.pages` aplicada (`php artisan migrate`).
- Assets compilados (`make check`).

## Passos

1. Entrar no painel (`cms.<host>/login`), abrir `/paginas/criar`, preencher o **Título** no idioma
   padrão e um **Endereço (slug)** único da execução; salvar.
2. Na tela de edição, conferir o painel **Visibilidade** (estado **Rascunho**) e rodar o axe.
3. Abrir a **Prévia autenticada** do idioma padrão: o documento aparece no shell do portal, com um
   `<h1>` só, `meta robots` `noindex` e **sem** canônica.
4. Clicar **Publicar página**; conferir o aviso e, na URL pública (`<base>/<slug>`), o 200 com o
   `<h1>` do título, `link rel=canonical` e `hreflang` (incluindo `x-default`); rodar o axe.
5. Abrir `/noticias` no portal: rota viva responde 200 (o fallback de página não a sombreia).
6. Voltar ao painel e clicar **Arquivar página**; conferir o aviso e que a URL pública responde
   **404** com `X-Robots-Tag: noindex`.

## Contrato verificado

- O portal é um **fallback** da área Portal (`Routes/portal-fallback.php`), registrado depois das
  rotas vivas e antes do 404 da área; o slug prefixado (`/en/<slug>`) é atendido pelo mesmo grupo.
- 404 real para slug inexistente, rascunho e arquivada (nunca soft-404) com `X-Robots-Tag: noindex`;
  só publicada responde 200.
- Render no `<x-layout::portal>`: **um** `<h1>` (o título da página; os títulos do conteúdo descem um
  nível), AST pelo `RichTextRenderer` (ADR-028), metadados do `seo` por locale, canônica por locale e
  `hreflang`/`x-default`; `GovernmentPage` no `@graph` (ADR-027).
- A prévia é **autenticada** (`paginas.ver`, sessão do CMS), sem token público, sempre `noindex,
  nofollow` e sem canônica; nenhum rascunho é servido a anônimo.
- Publicar/despublicar usam `paginas.editar`; arquivar usa `paginas.arquivar`; as mutações são `POST`
  com CSRF (nunca `GET`) e transições inválidas respondem **409**.
- Zero violações de acessibilidade (axe) na tela do CMS e na página pública.
