Files
amare/openspec/changes/build-public-site/tasks.md
manoel freitas 27f3cee855 feat: ship public site with SEO and visuals
Publish CMS content on public routes with responsive media,
accessibility checks, and deterministic visual baselines.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-29 08:36:59 -03:00

6.1 KiB
Raw Blame History

1. Fundação de leitura e layout público

  • 1.1 Criar app/Application/Queries/Marketing/GetPublishedServices e GetPublishedPortfolioCases (scope published(), ordenação por sort_order, eager loading explícito) com feature tests cobrindo exclusão de rascunho e ordem
  • 1.2 Criar FindPublishedPortfolioCaseBySlug retornando null para rascunho, com teste
  • 1.3 Criar app/Application/Data/PageMeta com fallback para site_settings e unit test sem banco (title/description/canonical/OG)
  • 1.4 Estender layouts/public.blade.php com head de SEO (components/seo/meta.blade.php), landmarks completos, navegação e footer alimentados por site_settings; feature test do head
  • 1.5 Rodar composer pint, composer phpstan e composer test:feature

2. Mídia responsiva

  • 2.1 Adicionar extensão gd ao Dockerfile e às matrizes de PHP do CI; adicionar intervention/image ao composer.json
  • 2.2 Criar app/Support/ResponsiveImage gerando variantes 480/960/1440 com nome derivado do original, e removendo variantes quando o original é substituído/excluído; unit test com Storage::fake
  • 2.3 Plugar a geração no saveUploadedFileUsing de PublicImageUploadRules e cobrir com feature test em um Resource do CMS
  • 2.4 Criar componente <x-media.image> com srcset, sizes, width/height, alt e loading configurável; feature test verificando lazy fora da dobra e eager no hero
  • 2.5 Criar comando php artisan media:generate-variants para backfill, com teste
  • 2.6 Adicionar php artisan storage:link idempotente ao docker/entrypoint.sh e validar no job container
  • 2.7 Rodar composer quality

3. Home editorial (WEB-01)

  • 3.1 Criar GetHomeContent + DTO HomeContent (hero de site_settings, serviços/casos em destaque, depoimentos publicados) com feature test
  • 3.2 Criar HomeController e substituir Route::view('/') pela rota nomeada home
  • 3.3 Implementar as seções do SPEC §6.2 como componentes Blade reutilizáveis (hero, prova visual, serviços, método, casos, depoimentos, CTA final)
  • 3.4 Feature tests: conteúdo publicado exibido em ordem, rascunho ausente, seções omitidas quando não há conteúdo, CTA aponta para a rota contact
  • 3.5 Rodar composer quality

4. Serviços, portfólio e páginas institucionais (WEB-02, WEB-03, WEB-07)

  • 4.1 Rota + controller + view de /servicos listando serviços publicados; feature test
  • 4.2 Rota + controller + view de /portfolio com paginação; feature test incluindo paginação e exclusão de rascunho
  • 4.3 Rota + view de /portfolio/{slug} com desafio, solução, resultado e galeria ordenada; feature tests de 200 publicado, 404 rascunho e ordem da galeria
  • 4.4 Rotas + views de /sobre e /privacidade usando site_settings; feature tests
  • 4.5 Rota + view de /contato exibindo e-mail, telefone e redes de site_settings, sem criação de lead; feature test
  • 4.6 Views errors/404.blade.php e errors/500.blade.php com layout público; feature tests de 404 branded e de 500 sem stack trace com APP_DEBUG=false
  • 4.7 Teste de contagem de queries no detalhe do caso para garantir ausência de N+1
  • 4.8 Rodar composer quality

5. SEO, sitemap e analytics

  • 5.1 Aplicar PageMeta em todos os controllers públicos (title, description, canonical, OG) com feature tests de override por caso e de fallback para os padrões do site
  • 5.2 Emitir JSON-LD Organization na home e Article/creative work no detalhe do caso; feature test validando JSON parseável
  • 5.3 Criar GetSitemapEntries, rota /sitemap.xml e view XML; feature tests de inclusão de publicado, exclusão de rascunho e entrada após publicação
  • 5.4 Substituir public/robots.txt por rota text/plain referenciando o sitemap absoluto; feature test
  • 5.5 Injetar o snippet de analytics apenas com analytics_enabled verdadeiro; feature tests dos dois estados
  • 5.6 Rodar composer quality

6. Acessibilidade

  • 6.1 Feature tests estruturais de HTML: um único h1, landmarks header/nav/main/footer, alt presente nas imagens de conteúdo
  • 6.2 Garantir skip link funcional e foco visível em todos os elementos interativos das páginas novas
  • 6.3 Adicionar verificação axe na suíte browser para home, serviços, portfólio e detalhe do caso, falhando em issues critical/serious
  • 6.4 Teste browser de navegação por teclado até o CTA principal e ativação por teclado
  • 6.5 Teste browser garantindo ausência de erros no console nas rotas cobertas
  • 6.6 Verificar prefers-reduced-motion: reduce desabilitando transições; teste browser com emulação
  • 6.7 Rodar composer test:browser

7. Regressão visual

  • 7.1 Adicionar fontes self-hosted via Vite e remover qualquer dependência de fonte de sistema ou CDN
  • 7.2 Implementar APP_FROZEN_NOW (provider que chama CarbonImmutable::setTestNow() fora de produção) e documentar em .env.example; unit test do provider
  • 7.3 Criar VisualContentSeeder determinístico (textos, datas e imagens fixture fixas), separado do ContentSeeder
  • 7.4 Criar testes de snapshot para Home, Serviços, Portfólio e Detalhe do portfólio em 1440×1000 e 390×844; gravar baselines versionadas
  • 7.5 Confirmar que duas execuções consecutivas no mesmo commit não produzem diff
  • 7.6 Verificar que composer visual:update grava baselines e que a suíte padrão roda em modo assertivo

8. Gate de CI e fechamento da fase

  • 8.1 Job browser do CI: executar php artisan db:seed --class=VisualContentSeeder --force antes da suíte
  • 8.2 Job browser do CI: publicar screenshots, diffs de snapshot, logs da aplicação e logs do browser com if: failure()
  • 8.3 Confirmar os cinco jobs verdes (static, unit, feature, browser, container) em pull request
  • 8.4 Rodar composer quality completo e registrar o resultado no PR
  • 8.5 Revisar o critério de saída da Fase 1 (conteúdo gerenciável no Filament e site público aprovado visualmente) e atualizar SPEC.md §18 marcando apenas itens comprovados