mirror of
https://github.com/fsolla/teqo.git
synced 2026-11-12 22:13:05 +00:00
docs(plans): planeja o site pós-eleição, o PL 5594/2026 e o cutover de domínio
S47 (#1442), S48 (#1443), OPS130 (#1444) e OPS131 (#1445). Inclui o design hi-fi do S47 e a regra pós-eleição no DESIGN.md.
This commit is contained in:
parent
321ac7b872
commit
ef9986340c
6 changed files with 1818 additions and 0 deletions
|
|
@ -296,6 +296,8 @@ This file is the living owner of Teqo's visual decisions — a working document,
|
|||
|
||||
**Public light-surface focus separation (C243, 2026-10-01).** When the campaign-yellow focus outline sits on a cream, white, or yellow-tinted public surface, keep the 3px yellow signal but add a dark blue outer separator. Yellow alone does not separate reliably from these backgrounds; the second edge preserves the archive's established focus identity while making keyboard location unmistakable without turning blue into a competing action color.
|
||||
|
||||
**Post-election mandate home (S47, 2026-10-21).** Once an election closes, the public home uses the name-only Jorge Solla lockup and reframes campaign red as a single, sober field of gratitude; cream carries the editorial chapters and yellow is limited to the one hero action plus focus/accent signals. The verified vote total may dominate the thank-you hero, but it must read as entrusted confidence rather than as a results dashboard: no ranking stack, electoral number, campaign CTA, or competing primary action. Content boards become flat editorial compositions with hairline divisions, and mandate themes use one continuous grid rather than a floating-card catalogue. This preserves recognition from the campaign identity while clearly changing the site's register from persuasion to institutional continuity.
|
||||
|
||||
How rules change:
|
||||
|
||||
- **Decide, then update the owner.** When a better pattern wins — anti-slop review (`design-taste-frontend` / `gpt-taste`), a reference study (`awesome-design-md`), a redesign pass (`redesign-existing-projects`), or implementation judgment — update this file in the **same change** and say why. A pattern that only lives in code or in an agent's head is drift, not design.
|
||||
|
|
|
|||
88
docs/plans/abaixo-assinado-pl-5594-2026.md
Normal file
88
docs/plans/abaixo-assinado-pl-5594-2026.md
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
# Abaixo-assinado do PL 5594/2026 — transparência dos presidenciáveis (S48)
|
||||
|
||||
Status: rascunho
|
||||
Atualizado em: 2026-10-21
|
||||
Issue: #1443
|
||||
Priority: P1
|
||||
Impeccable: A — sem UI nova; usa a página existente de abaixo-assinado (copy do template ajustada)
|
||||
Design UI: N/A — sem UI nova
|
||||
Appetite: ~0,5 dia eng; um outcome verificável (petição publicada, assinável e compartilhável)
|
||||
Responsável: —
|
||||
|
||||
## Intenção
|
||||
|
||||
Jorge Solla protocolou o PL 5594/2026 em 19/10/2026: candidatos à Presidência e à Vice-Presidência passam a ter de autorizar, no registro da candidatura, o acesso a seus sigilos bancário, fiscal, telefônico e de internet. O tema está no centro do debate desde 18/10, quando Lula desafiou Flávio Bolsonaro a abrir os sigilos. O Teqo já tem a ferramenta de abaixo-assinado; falta a petição do PL — com o texto oficial, a motivação e um pedido claro de tramitação/aprovação.
|
||||
|
||||
## Persona e fluxo
|
||||
|
||||
- **Persona / contexto:** eleitor que acompanhou o debate e quer cobrar transparência; chega pelo link no WhatsApp/redes, no celular.
|
||||
- **Job principal:** entender o que o PL faz, por que importa agora e assinar em menos de um minuto.
|
||||
- **Fluxo desejado:** abre `/abaixo-assinado/pl-5594-2026` → lê o resumo e a motivação → vê o contador → preenche nome/e-mail/celular/estado/cidade/CEP → assina → vê a confirmação e compartilha.
|
||||
- **Anti-goals de produto:** não é um novo cadastro de pessoa (usa `Contact`); não acusa ninguém de crime; não promete aprovação; não cria um segundo mecanismo de consentimento.
|
||||
|
||||
## Objetivo e aceite
|
||||
|
||||
- A petição `pl-5594-2026` existe, está `enabled`, com título/subtítulo/corpo/consent e página pública em `/abaixo-assinado/pl-5594-2026` (200).
|
||||
- O corpo explica, com o texto oficial: autorização no registro; 5 anos de IR; dados bancários/fiscais/telefônicos/de conexão; conteúdo das comunicações excluído; acesso só por órgãos competentes com auditoria; LGPD; divulgação pela Justiça Eleitoral.
|
||||
- A motivação menciona o debate de 18/10 e o desafio de Lula a Flávio Bolsonaro, sem afirmar crime ou irregularidade.
|
||||
- O formulário assina de verdade (contato + assinatura + inscrição na mesma transação, padrão existente), com consent válido e contador.
|
||||
- A página tem canonical/OG/JSON-LD coerentes com o site atual e link para o texto oficial na Câmara.
|
||||
- Nenhuma migration, nenhuma collection nova, nenhuma PII em log.
|
||||
|
||||
## Dados (intenção)
|
||||
|
||||
- **Vou apresentar dados?** Sim, o contador de assinaturas (já existente).
|
||||
- **Decisões desbloqueadas:** o visitante decide assinar; a equipe mede adesão.
|
||||
- **Forma:** contador absoluto; sem percentual, sem ranking, sem meta inventada.
|
||||
|
||||
## Dados da decisão (literais)
|
||||
|
||||
- `id` da petição: `pl-5594-2026` (URL `/abaixo-assinado/pl-5594-2026`).
|
||||
- Título: `Quem quer ser presidente deve abrir os sigilos`.
|
||||
- Subtítulo: `Apoie o PL 5594/2026: candidatos à Presidência e à Vice-Presidência devem autorizar o acesso aos sigilos bancário, fiscal, telefônico e de internet.`
|
||||
- PL: **5594/2026**, apresentado em **19/10/2026**, autor **Dep. Jorge Solla (PT/BA)**; ementa oficial: "Dispõe sobre a transparência patrimonial, fiscal e financeira dos candidatos à Presidência da República, estabelece mecanismos de autorização de acesso a informações protegidas por sigilo e altera a Lei nº 9.504, de 30 de setembro de 1997."
|
||||
- Ficha oficial: `https://www.camara.leg.br/proposicoesWeb/fichadetramitacao?idProposicao=2648344`; inteiro teor: `https://www.camara.leg.br/proposicoesWeb/prop_mostrarintegra?codteor=3184912`.
|
||||
- Status em 21/10/2026: apenas apresentação na Mesa, sem tramitação posterior.
|
||||
- Consent: usar o mesmo Consent das 3 petições existentes (`form.consent` id 2, chave `whatsapp-inscricao`), como está em produção; não criar Consent novo sem revisão jurídica.
|
||||
- Copy do formulário (ajustar o hardcoded "campanha"): `Sua assinatura fortalece esta mobilização.` / `Os dados serão usados para registrar sua participação e a comunicação de conteúdos relacionados.`
|
||||
- Motivação: debate de **18/10/2026**, Lula desafiou Flávio Bolsonaro a abrir os sigilos; Solla protocolou o PL no dia seguinte. Não afirmar que houve crime, ilícito ou recusa não comprovada.
|
||||
- Texto do corpo: 5 blocos — (1) o que é; (2) por que agora; (3) o que o PL não faz; (4) o pedido; (5) link oficial.
|
||||
|
||||
## Direção no codebase (hipótese)
|
||||
|
||||
- **Áreas prováveis:** collection `petition` (admin), página `src/app/(frontend)/abaixo-assinado/[id]/page.tsx`, `PetitionForm`, `submitPetitionSignature`, `getSignatureCount`; conteúdo criado no admin (sem código novo, salvo o ajuste de copy do template).
|
||||
- **Precedente a olhar:** petições `fim-escala-6x1`, `contra-reducao-maioridade-penal`, `nao-a-privatizacao-da-orla-de-salvador` (produção); o fluxo de Consent das petições existentes.
|
||||
- **Risco de acoplamento:** o `id` é a URL pública; trocar depois quebra links. O consent é o do documento; o cliente não pode escolher. A action já abre transação.
|
||||
|
||||
## Dependências
|
||||
|
||||
- Nenhuma dura. Suave: S47 (se o gate quiser um CTA na home/footer para a petição).
|
||||
|
||||
## Fora de escopo
|
||||
|
||||
- Página de listagem de abaixo-assinados.
|
||||
- Meta de assinaturas, campos novos, upload de imagem/mídia.
|
||||
- Nova identidade visual da petição.
|
||||
- Divulgação paga/WhatsApp em massa.
|
||||
- Alterar o texto do Consent existente.
|
||||
|
||||
## Rabbit holes de produto
|
||||
|
||||
- **"Vamos fazer uma campanha de mídia junto."** Vira operação de tráfego. **Corte:** só a página + link direto.
|
||||
- **"Criar um consent específico e uma nova finalidade."** Exige revisão jurídica. **Corte:** reutilizar o Consent das petições existentes.
|
||||
- **"Prometer que o PL será aprovado."** **Corte:** pedir apoio à tramitação, sem promessa.
|
||||
|
||||
## Questões em aberto (produto)
|
||||
|
||||
- **Usar o Consent existente (id 2) ou criar um novo?** **Opções:** A) reutilizar (padrão das 3 petições); B) novo texto. **Recomendação:** A — mantém o fluxo e evita mudança jurídica; se o texto não cobrir a finalidade, o jurídico decide. _(assumido)_
|
||||
- **Adicionar CTA na home/footer?** **Opções:** A) só link direto agora; B) CTA na home (depende de S47). **Recomendação:** A — a página é compartilhável; o CTA entra quando o design da S47 for aprovado. _(assumido)_
|
||||
- **Imagem/OG?** **Opções:** A) sem imagem nova (OG do site); B) arte oficial do kit. **Recomendação:** A — não inventar arte; o texto oficial é o herói.
|
||||
|
||||
## Referências
|
||||
|
||||
- GitHub Issue #1443
|
||||
- Texto oficial: `https://www.camara.leg.br/proposicoesWeb/prop_mostrarintegra?codteor=3184912`
|
||||
- Ficha: `https://www.camara.leg.br/proposicoesWeb/fichadetramitacao?idProposicao=2648344`
|
||||
- Votação de Solla: TSE/G1, totalização de 05/10/2026
|
||||
- Cobertura do PL e do debate: BPMoney (21/10/2026), A Tarde (20/10/2026), Brasil 247 (21/10/2026)
|
||||
- `AGENTS-public.md` (Posts & Tags), `AGENTS.md` (Consent/LGPD), `src/collections/Petition.ts`, `src/app/(frontend)/abaixo-assinado/[id]/page.tsx`, `src/app/(frontend)/actions/submitPetitionSignature.ts`
|
||||
82
docs/plans/ops130-sincronizar-artigos-jorgesolla.md
Normal file
82
docs/plans/ops130-sincronizar-artigos-jorgesolla.md
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
# OPS130 — Sincronizar todos os artigos do jorgesolla.com.br e revisar os escondidos
|
||||
|
||||
Status: rascunho
|
||||
Atualizado em: 2026-10-21
|
||||
Issue: #1444
|
||||
Priority: P1
|
||||
Impeccable: A — N/A sem UI
|
||||
Design UI: N/A — sem UI
|
||||
Appetite: ~0,5–1 dia (operação no homeserver + revisão de taxonomia)
|
||||
Responsável: —
|
||||
|
||||
## Intenção
|
||||
|
||||
O site antigo (`jorgesolla.com.br`, WordPress) é a fonte dos artigos do mandato e será desativado no cutover (OPS131). O Teqo tem hoje 43 posts publicados, todos visíveis; o seed `pnpm db:seed:posts` é create-only e já sincronizou o lote de agosto. Antes de desligar o WordPress, o Teqo precisa ter todos os artigos publicados lá — inclusive os que ficaram de fora ou estavam escondidos no período eleitoral — para que o acervo não se perca e o leitor encontre o mesmo conteúdo no novo domínio.
|
||||
|
||||
## Persona e fluxo
|
||||
|
||||
- **Persona / contexto:** equipe de comunicação do mandato; leitor que chega pelo Google/links antigos.
|
||||
- **Job principal:** garantir que todo artigo disponível no jorgesolla.com.br exista no Teqo, com capa e URL canônica, antes de o WordPress sair do ar.
|
||||
- **Fluxo desejado:** dry-run (o que seria criado/saltado) → revisão dos slugs novos/classificação → sync em produção (create-only, idempotente) → bust do cache `posts` → verificação de contagem/capas/páginas → auditoria dos "escondidos" → runbook atualizado.
|
||||
- **Anti-goals de produto:** não é upsert nem espelho bidirecional; não importa páginas institucionais do WP (PUB2); não publica rascunho/privado do WP sem revisão; não toca PII; não muda o contrato de URL dos artigos.
|
||||
|
||||
## Objetivo e aceite
|
||||
|
||||
- Todo post publicado no WP REST (`/wp-json/wp/v2/posts`) existe no Teqo como post publicado; a diferença é zero ou está documentada no runbook.
|
||||
- Os posts já existentes permanecem intocados (create-only, idempotente por slug).
|
||||
- As capas dos novos carregam em `/api/media/file/...` (bucket de produção), e o cache `posts` é bustado.
|
||||
- A lista de "escondidos" é auditada com evidência: hoje (21/10) há **0 tags com `hidden = true`**, **43 posts publicados**, **10 com a tag `eleitoral`**; não há drafts. Se a intenção do humano for posts em rascunho/privado do WordPress, eles não são importáveis pela API pública — precisam ser publicados no WP antes do sync ou exportados à parte.
|
||||
- Nenhum conteúdo de campanha que a S47 decidir retirar é reexposto por este item; a decisão de visibilidade editorial é da S47.
|
||||
- O runbook de sync (OPS58) é reutilizado e atualizado com o estado encontrado.
|
||||
|
||||
## Dados (intenção)
|
||||
|
||||
- **Vou apresentar dados?** Sim, no runbook: contagem WP × Teqo, criados/saltados, capas, escondidos.
|
||||
- **Decisões desbloqueadas:** a equipe sabe se pode desligar o WordPress sem perder artigo; o leitor não encontra 404.
|
||||
- **Forma:** contagens absolutas e lista de slugs; sem percentual.
|
||||
|
||||
## Dados da decisão (literais)
|
||||
|
||||
- WP REST: `https://jorgesolla.com.br/wp-json/wp/v2/posts?per_page=100` (paginado por `x-wp-totalpages`).
|
||||
- Seed: `pnpm db:seed:posts --dry-run`; execução em produção (homeserver) com `ALLOW_REMOTE_DB=true` e `SEED_MEDIA_CONFIRM=1` (S3 de prod).
|
||||
- Cache: `POST /api/revalidate` com `x-revalidate-secret` (tag default `posts`).
|
||||
- Controle de visibilidade: `tag.hidden` + `isPostVisible`; tag de campanha: slug `eleitoral`.
|
||||
- Estado de produção em 2026-10-21 (leitura read-only): 43 posts publicados; 0 drafts; 8 tags, todas `hidden = false`; 10 posts com `eleitoral`; categorias: politica 13, desenvolvimento 9, saude 8, educacao 7, direitos-trabalhistas 3, cultura 2, seguranca 1.
|
||||
- Runbook de referência: `docs/plans/ops58-sincronizar-posts-prod-impl.md` (dry-run → sync → bust → verify).
|
||||
|
||||
## Direção no codebase (hipótese)
|
||||
|
||||
- **Áreas prováveis:** `scripts/seed-posts.mjs`, `scripts/lib/wpArticles.mjs`, `scripts/seed-loader.mjs`, `docs/plans/ops58-sincronizar-posts-prod-impl.md`, `docs/ops/teqo-1313-deploy.md` (runbook); homeserver (`~/stack/teqo-1313.env`).
|
||||
- **Precedente a olhar:** OPS58 (sync create-only), OPS52-media (execução no homeserver), OPS60 (guard `SEED_MEDIA_CONFIRM`).
|
||||
- **Risco de acoplamento:** o Postgres de prod não é exposto ao host; rodar no homeserver, na rede do compose, com as `S3_*` de prod. Sem isso, capas caem no disco local e quebram em produção.
|
||||
|
||||
## Dependências
|
||||
|
||||
- Nenhuma dura. OPS131 (cutover) depende deste: não desligar o WordPress antes de o acervo estar no Teqo.
|
||||
|
||||
## Fora de escopo
|
||||
|
||||
- Atualizar/sobrescrever o corpo de posts já existentes (create-only).
|
||||
- Importar páginas institucionais do WP (PUB2).
|
||||
- Automação agendada do sync.
|
||||
- Publicar rascunhos/privados do WP sem decisão editorial.
|
||||
- Corrigir a taxonomia de todos os slugs antigos; só os novos que o dry-run apontar.
|
||||
|
||||
## Rabbit holes de produto
|
||||
|
||||
- **"Fazer upsert completo do WP."** Diff de richText, mídia, datas; vira migração de conteúdo. **Corte:** create-only.
|
||||
- **"Importar tudo, inclusive drafts."** Publica conteúdo não revisado. **Corte:** só `published`; drafts exigem decisão.
|
||||
- **"Automatizar o sync agora."** Infra nova para uma frequência que vai acabar com o WordPress. **Corte:** execução manual com runbook.
|
||||
|
||||
## Questões em aberto (produto)
|
||||
|
||||
- **"Escondidos" = tag `hidden` do Teqo ou posts em draft/private do WordPress?** **Opções:** A) o Teqo não tem nada escondido hoje (0 tags hidden, 0 drafts), então o pedido é no-op e o foco é o sync; B) são posts do WP em draft/private, que precisam ser publicados lá antes. **Recomendação:** A + auditoria do WP; se B, listar os posts e decidir um a um. _(assumido — validar no gate)_
|
||||
- **Slugs novos fora da taxonomia:** **Opções:** A) default `politica` + warning; B) bloquear até classificar. **Recomendação:** A, com revisão dos slugs no dry-run. _(assumido)_
|
||||
- **Posts com tag `eleitoral`:** **Opções:** A) manter publicados como notícia histórica; B) esconder/retirar. **Recomendação:** A — são notícia, não pedido de voto; a S47 cuida das superfícies de campanha. _(assumido)_
|
||||
|
||||
## Referências
|
||||
|
||||
- GitHub Issue #1444
|
||||
- `docs/plans/ops58-sincronizar-posts-prod.md` e `-impl.md`
|
||||
- `AGENTS-public.md` §Posts & Tags; `scripts/seed-posts.mjs`; `scripts/lib/wpArticles.mjs`
|
||||
- Produção (leitura read-only, 2026-10-21): DB `teqo_1313`, tags/posts; `~/stack/teqo-1313.env`
|
||||
91
docs/plans/ops131-cutover-dominio-jorgesolla.md
Normal file
91
docs/plans/ops131-cutover-dominio-jorgesolla.md
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
# OPS131 — Cutover do domínio jorgesolla.com.br para o Teqo e desativação do WordPress
|
||||
|
||||
Status: rascunho
|
||||
Atualizado em: 2026-10-21
|
||||
Issue: #1445
|
||||
Priority: P1
|
||||
Impeccable: A — N/A sem UI
|
||||
Design UI: N/A — sem UI
|
||||
Appetite: ~1–2 dias + propagação DNS; um outcome verificável (o domínio canônico serve o Teqo e o WordPress não serve mais)
|
||||
Responsável: —
|
||||
|
||||
## Intenção
|
||||
|
||||
O site do mandato ainda vive em duas casas: o Teqo em `jorgesolla1313.com.br` (campanha) e o WordPress em `jorgesolla.com.br` (site antigo, fonte dos artigos). Com a eleição encerrada e o acervo sincronizado (OPS130), o endereço definitivo deve ser `jorgesolla.com.br` — o domínio que as pessoas conhecem, que já está nos materiais e no e-mail do mandato. O `jorgesolla1313.com.br` cumpriu o papel de campanha e deve redirecionar; o WordPress deve ser desativado sem perder SEO, e-mail ou o acesso da equipe.
|
||||
|
||||
## Persona e fluxo
|
||||
|
||||
- **Persona / contexto:** eleitor/leitor que digita `jorgesolla.com.br` ou clica num link antigo; equipe do mandato que usa `/campanha`; ops que opera o homeserver.
|
||||
- **Job principal:** abrir o domínio oficial e ver o site novo, com os links antigos funcionando; a equipe continua entrando em `/campanha`.
|
||||
- **Fluxo desejado:** pré-flight (DNS, URLs do WP, mídia, auth) → congela escritas no WP → sync final (OPS130) → troca `NEXT_PUBLIC_SITE_URL`/`metadata.URL` → deploy → ingress/DNS do novo domínio → 301 dos links antigos e do domínio 1313 → verificação → desliga o WordPress.
|
||||
- **Anti-goals de produto:** não migrar plugins/temas/usuários do WordPress; não mudar o e-mail (`@jorgesolla.com.br` já é o domínio do mandato); não perder artigos; não deixar duas fontes de verdade; não quebrar o login da equipe em silêncio.
|
||||
|
||||
## Objetivo e aceite
|
||||
|
||||
- `https://jorgesolla.com.br` e `https://www.jorgesolla.com.br` servem o Teqo (200), com canonical/OG no domínio novo.
|
||||
- `https://jorgesolla1313.com.br` responde 301 para o domínio novo, preservando o path (incluindo `/campanha`, conforme a decisão de auth abaixo).
|
||||
- URLs antigas do WordPress (`/YYYY/MM/DD/<slug>/`) respondem 301 para o caminho canônico do artigo no Teqo (`/[type]/[category]/[slug]`); páginas antigas vão para o equivalente ou para `/`; nenhuma URL indexada fica 404 sem decisão.
|
||||
- O WordPress deixa de servir o site depois da janela de rollback; o DNS/ingress do novo domínio aponta para o túnel do homeserver.
|
||||
- MX/TXT/SPF/DKIM/DMARC e subdomínios que não são o site ficam intocados; o e-mail `campanha@jorgesolla.com.br` continua funcionando.
|
||||
- `NEXT_PUBLIC_SITE_URL=https://jorgesolla.com.br` no env de produção (rebuild, pois é inlined) e `metadata.URL` no admin com o mesmo valor; convites, calendário e OAuth usam o novo origin.
|
||||
- WebAuthn/passkeys: a decisão do gate é explícita — reenrollment dos usuários de campanha no novo domínio ou manutenção do `/campanha` no domínio antigo; nenhuma credencial quebra em silêncio.
|
||||
- Mídia/OG: `/api/media/file/...` e as imagens OG continuam 200 no domínio novo; o `next.config.mjs` aceita o host do novo domínio.
|
||||
- O runbook de cutover/rollback fica em `docs/ops/teqo-1313-deploy.md`, com a evidência do pré-flight.
|
||||
|
||||
## Dados (intenção)
|
||||
|
||||
- **Vou apresentar dados?** Sim, no pré-flight/runbook: inventário de DNS, contagem de URLs do WP, mapa de redirects, contagem de usuários com passkey.
|
||||
- **Decisões desbloqueadas:** ops decide o momento do corte; a equipe sabe o que reenrolar; o leitor não perde o link.
|
||||
- **Forma:** contagens absolutas e mapa URL→URL; sem dashboard.
|
||||
|
||||
## Dados da decisão (literais)
|
||||
|
||||
- Domínio canônico: `https://jorgesolla.com.br` (apex); `www` → 301 para o apex.
|
||||
- Domínio de campanha: `https://jorgesolla1313.com.br` → 301 para o canônico.
|
||||
- Env de produção: `NEXT_PUBLIC_SITE_URL=https://jorgesolla.com.br` (inlined no build; exige rebuild) e `metadata.URL=https://jorgesolla.com.br` (global no admin).
|
||||
- Cloudflare: o túnel é remotely-managed; o ingress do novo domínio aponta para `http://localhost:1313`; a zona `jorgesolla1313.com.br` hoje é `2ae7416abc4ea930db5ce6782504c578` — a zona de `jorgesolla.com.br` deve ser lida no dashboard, não hardcoded.
|
||||
- WordPress: `https://jorgesolla.com.br` hoje resolve para `128.201.75.110`; a API de posts é a fonte do OPS130; o site antigo usa permalinks `/<ano>/<mês>/<dia>/<slug>/`.
|
||||
- Auth: o RP ID do WebAuthn é o hostname de `NEXT_PUBLIC_SITE_URL` (`src/utilities/webauthn/campaignWebAuthnConfig.ts:87`); credenciais criadas em `jorgesolla1313.com.br` não valem em `jorgesolla.com.br`.
|
||||
- SEO: o canonical prefere `metadata.URL` e cai para `NEXT_PUBLIC_SITE_URL` (`src/utilities/seo.ts:60-72`); o origin das imagens OG é o deployment (`seo.ts:86-93`).
|
||||
- Redirects: não há redirects em `next.config.mjs` nem middleware hoje; o único redirect in-app é o canonical de artigo (`[type]/[category]/[slug]/page.tsx:140-142`).
|
||||
|
||||
## Direção no codebase (hipótese)
|
||||
|
||||
- **Áreas prováveis:** `src/utilities/seo.ts`, `src/utilities/campaignInviteOrigin.ts`, `src/utilities/webauthn/campaignWebAuthnConfig.ts`, `src/payload.config.ts` (serverURL, se aplicável), `next.config.mjs` (host de imagem), `src/app/robots.ts` (robots/sitemap), `docs/ops/teqo-1313-deploy.md`, `~/stack/teqo-1313.env`, Cloudflare tunnel/DNS.
|
||||
- **Precedente a olhar:** OPS51/OPS52 (cutover de DB/mídia), OPS80/OPS81 (cutoff de `pt.jorgesolla.com.br`, que deixou `jorgesolla.com.br`/SEO fora de escopo), OPS103 (staging/noindex), OPS130 (sync).
|
||||
- **Risco de acoplamento:** `NEXT_PUBLIC_SITE_URL` governa convite/WebAuthn/calendar/OAuth; trocar sem reenrollment quebra o login por passkey; `metadata.URL` governa canonical/OG; o e-mail usa o mesmo domínio (não tocar em MX/TXT).
|
||||
|
||||
## Dependências
|
||||
|
||||
- **OPS130 (dura):** o acervo precisa estar no Teqo antes de desligar o WordPress.
|
||||
- **S47 (dura ou suave):** o site deve estar pós-eleição antes de virar o domínio oficial; se o corte vier antes, o domínio novo abriria com a home de campanha.
|
||||
- **S48 (suave):** a petição pode estar no ar antes do corte para o link já nascer no domínio novo.
|
||||
|
||||
## Fora de escopo
|
||||
|
||||
- Migrar páginas institucionais/plugins/usuários do WordPress (PUB2).
|
||||
- Redesenho do site (S47).
|
||||
- Migração de e-mail (já está no domínio).
|
||||
- Apagar o backup do WordPress; o conteúdo antigo fica arquivado.
|
||||
- SEO além do canonical/redirects mínimos (sitemap completo é follow-up).
|
||||
- Manter os dois domínios como canônicos.
|
||||
|
||||
## Rabbit holes de produto
|
||||
|
||||
- **"Migrar o WordPress inteiro."** Vira reescrita de páginas/plugins. **Corte:** só posts + redirects; páginas são PUB2.
|
||||
- **"Resolver o passkey com um RP ID pai."** `jorgesolla1313.com.br` não é subdomínio de `jorgesolla.com.br`; não existe RP ID comum. **Corte:** decisão explícita de reenrollment OU manter `/campanha` no domínio antigo.
|
||||
- **"Cortar DNS e ver depois."** Sem mapa de redirects e sem pré-flight, perde SEO e links. **Corte:** pré-flight + 301 + verificação antes de desligar.
|
||||
|
||||
## Questões em aberto (produto)
|
||||
|
||||
- **Passkeys:** **Opções:** A) cutover total + reenrollment dos usuários de campanha; B) manter `/campanha` em `jorgesolla1313.com.br` e só o site público no novo domínio; C) adiar o cutover até um mecanismo de migração. **Recomendação:** A — a eleição acabou e a equipe é pequena; reenrollment assistido é aceitável, com aviso prévio. _(assumido — decisão humana obrigatória)_
|
||||
- **Janela do WordPress:** **Opções:** A) desligar após a verificação, com backup/arquivo; B) manter read-only por 30 dias. **Recomendação:** B — janela curta de rollback, sem escritas. _(assumido)_
|
||||
- **Redirect de `jorgesolla1313.com.br`:** **Opções:** A) 301 permanente; B) 302 por 90 dias. **Recomendação:** A — o 1313 não volta; 301 preserva o SEO. _(assumido)_
|
||||
- **Escopo dos redirects antigos:** **Opções:** A) posts + páginas conhecidas; B) todas as URLs do sitemap do WP. **Recomendação:** B — inventariar o sitemap e mapear; o que não tiver equivalente vai para `/`. _(assumido)_
|
||||
|
||||
## Referências
|
||||
|
||||
- GitHub Issue #1445
|
||||
- `docs/ops/teqo-1313-deploy.md` (homeserver, tunnel, envs, staging); `AGENTS-infra.md`
|
||||
- `src/utilities/seo.ts`, `src/utilities/campaignInviteOrigin.ts`, `src/utilities/webauthn/campaignWebAuthnConfig.ts`, `next.config.mjs`
|
||||
- OPS80/OPS81 (`pt.jorgesolla.com.br`), OPS130 (sync), S47 (site pós-eleição)
|
||||
1448
docs/plans/site-pos-eleicao-agradecimento-ui-design.html
Normal file
1448
docs/plans/site-pos-eleicao-agradecimento-ui-design.html
Normal file
File diff suppressed because it is too large
Load diff
107
docs/plans/site-pos-eleicao-agradecimento.md
Normal file
107
docs/plans/site-pos-eleicao-agradecimento.md
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
# Site público pós-eleição — retirar a propaganda e agradecer os 152.049 votos (S47)
|
||||
|
||||
Status: rascunho
|
||||
Atualizado em: 2026-10-21
|
||||
Issue: #1442
|
||||
Priority: P1
|
||||
Impeccable: C — novo fluxo na home (hero de agradecimento + retirada das seções de campanha)
|
||||
Design UI: docs/plans/site-pos-eleicao-agradecimento-ui-design.html
|
||||
Appetite: ~1–2 dias eng; um outcome verificável (nenhuma propaganda/1313 visível no site público + agradecimento no ar)
|
||||
Responsável: —
|
||||
|
||||
## Intenção
|
||||
|
||||
A eleição para deputado federal terminou em 04/10/2026 e Jorge Solla foi reeleito com 152.049 votos. O site público ainda é uma peça de campanha: hero de candidato, pedido de voto, "1313" em títulos/rodapé/metadados, CTAs de apoio e páginas de material eleitoral. Manter isso no ar depois da eleição confunde o visitante, desatualiza a identidade do mandato e mantém propaganda eleitoral ativa sem campanha. O site precisa virar a casa institucional do deputado: agradecer os votos e seguir publicando o mandato (notícias, fotos, trajetória, bandeiras), sem pedir voto e sem o número 1313.
|
||||
|
||||
## Persona e fluxo
|
||||
|
||||
- **Persona / contexto:** eleitor que chega pelo link compartilhado/WhatsApp, jornalista que busca o mandato, apoiador que quer acompanhar o trabalho — no celular, logo depois da eleição.
|
||||
- **Job principal:** entender que a eleição acabou, sentir-se agradecido e encontrar o conteúdo do mandato.
|
||||
- **Fluxo desejado:** abre o site → vê "Obrigado, Bahia — 152.049 votos" e um texto curto de agradecimento → rola para as notícias/"Acompanhe de perto", a trajetória, as bandeiras e as fotos → encontra o rodapé institucional e as redes.
|
||||
- **Anti-goals de produto:** não é uma nova campanha; não é um site institucional completo (bio/propostas é PUB2); não cria cadastro de pessoa novo; não vira dashboard de resultados; não apaga o acervo editorial.
|
||||
|
||||
### Esboço de fluxo (C)
|
||||
|
||||
```text
|
||||
[chega] → hero "Obrigado, Bahia" (152.049) → notícias → trajetória → bandeiras do mandato → fotos → rodapé institucional
|
||||
```
|
||||
|
||||
### Design UI (C)
|
||||
|
||||
- Design UI (gate): `docs/plans/site-pos-eleicao-agradecimento-ui-design.html` (+ assets em `site-pos-eleicao-agradecimento-ui-design-assets/`)
|
||||
- Cenas: 1280 e 390; estados: home completa, hero de agradecimento, rodapé. NEEDS ASSET para foto nova se o design pedir; usar `JOA00162.webp` como padrão.
|
||||
|
||||
## Objetivo e aceite
|
||||
|
||||
- Nenhuma superfície pública exibe "1313" como número eleitoral, pedido de voto, "candidato", "propaganda eleitoral" ou CTA de campanha (hero, cards, rodapé, títulos/metadados).
|
||||
- A home abre com o agradecimento: "152.049 votos" (literal TSE) e texto de agradecimento a quem votou e a quem ajudou na campanha.
|
||||
- A identidade visível passa a "Jorge Solla — Deputado Federal · PT · Bahia"; o logo usado é o lockup de nome (`jorge-solla-positivo/negativo`), nunca a marca completa com 1313.
|
||||
- As seções de campanha saem da home: "Por que essa eleição importa", newsletter "da campanha", cards "Mostre que você está com Solla", jingles/rádio 1313 e a seção da Central de Conteúdos.
|
||||
- As páginas de campanha (`/conteudos`, `/jingles`, `/cards`) saem do ar/do menu; `/fotos`, `/artigos`, `/privacidade` e o acervo de fala continuam. `/potencial` e a Plenária ficam até 25/10 (2º turno) e saem depois — decisão a confirmar no gate.
|
||||
- O rodapé vira institucional: nome, cargo, partido/estado, redes, artigos, fotos, privacidade; sem "Quero apoiar", sem CNPJ de campanha, sem "1º turno".
|
||||
- Metadados/SEO: títulos e descrições sem 1313; a URL canônica continua a atual até o cutover (OPS131).
|
||||
- Nada de PII nova, nenhum Consent novo, nenhuma migration.
|
||||
- O design hi-fi aprovado é o alvo do port.
|
||||
|
||||
Guardrails:
|
||||
|
||||
- Não apagar posts/fotos/jingles do CMS; despublicar/retirar da navegação é suficiente (reversível).
|
||||
- A página do abaixo-assinado (S48) não é tocada aqui.
|
||||
- O domínio não muda aqui (OPS131).
|
||||
|
||||
## Dados (intenção)
|
||||
|
||||
- **Vou apresentar dados?** Sim, na superfície: o número de votos no agradecimento.
|
||||
- **Decisões desbloqueadas:** o visitante entende o resultado e o novo papel do site; a equipe decide o que continua público no mandato.
|
||||
- **Forma:** número absoluto, sem percentual estadual; o dado é o total de votos, não um ranking. Fonte TSE/G1 (05/10/2026).
|
||||
|
||||
## Dados da decisão (literais)
|
||||
|
||||
- Votos: **152.049** (TSE, totalização de 05/10/2026; 1,84% dos válidos; 11º mais votado da BA; 417 municípios; Salvador 26.082).
|
||||
- Mandato: **4º mandato consecutivo** (reeleito em 2026; posse em 01/02/2027).
|
||||
- Copy do hero (proposta): eyebrow `Obrigado, Bahia`; título `152.049 votos de confiança`; texto `Obrigado a quem votou, a quem caminhou, a quem compartilhou e a quem acreditou. A eleição terminou; o trabalho continua.`; CTA primário `Acompanhe o mandato` → `/artigos`.
|
||||
- Identidade: `Jorge Solla` · `Deputado Federal` · `PT · Bahia`; o slogan `Mais Saúde, Mais Futuro` pode permanecer como assinatura (não é número/pedido de voto).
|
||||
- Seções que saem: `problem` (`Por que essa eleição importa`), `cards`, `sound` (jingles/rádio), `contentPieces` (Central), newsletter de campanha; `story` e `flags` ficam com copy de mandato; `content` (Acompanhe de perto), `fotos` e `selfie` ficam.
|
||||
- Rotas de campanha: `/conteudos`, `/jingles`, `/cards` → fora do ar (404 ou redirect para `/`, decisão do impl plan); `/potencial` e share link `plenaria-vitoria` → até 25/10.
|
||||
- Arquivos com literais 1313 a limpar: `CampaignHero.tsx`, `CampaignFooter.tsx`, `CampaignPageHeader.tsx`, `CampaignLogoLink.tsx`, `JingleHomeSection.tsx`, `RadioPlayer.tsx`, `ContentPiece*`, `fotos/page.tsx`, `fotos/encontre/page.tsx`, `conteudos/*`, `jingles/page.tsx`, `(home)/page.tsx`, `SITE_METADATA_DEFAULTS` (description "campanhas" → "mandato").
|
||||
- Download de foto: `jorge-solla-foto-<id>.<ext>` (sem 1313).
|
||||
- O `1313` em assets do kit (`numero-*`, `marca-*-completa`, `radio/*`) pode permanecer no repositório como acervo, mas nenhum deles é renderizado em superfície pública.
|
||||
|
||||
## Direção no codebase (hipótese)
|
||||
|
||||
- **Áreas prováveis:** `src/app/(frontend)/(home)/page.tsx`, `src/components/CampaignHero.tsx`, `CampaignFooter.tsx`, `CampaignPageHeader.tsx`, `CampaignLogoLink.tsx`, `JingleHomeSection.tsx`, `ContentPiece*`, `src/app/(frontend)/fotos/page.tsx`, `conteudos/*`, `jingles/page.tsx`, `src/utilities/seo.ts`/global `metadata`.
|
||||
- **Precedente a olhar:** S36 (crop do logo), S21/S22 (jingles), S27/S39 (Central), C233 (fotos), `DESIGN.md` §7 e `public/campaign-kit/README.md`.
|
||||
- **Risco de acoplamento:** `CampaignFooter` é compartilhado por `/fotos`, `/jingles`, `/potencial`, `/cards`, `/conteudos` — a mudança de assinatura afeta todas; `CampaignLogoLink` é o dono do crop do logo; `isPostVisible`/posts não podem ser tocados por engano.
|
||||
|
||||
## Dependências
|
||||
|
||||
- Nenhuma dura. Suave: S48 (abaixo-assinado) para o CTA de participação, se o gate quiser; OPS130 para o acervo completo de artigos.
|
||||
|
||||
## Fora de escopo
|
||||
|
||||
- Bio/propostas institucionais novas (PUB2).
|
||||
- Cutover do domínio (OPS131).
|
||||
- Conteúdo do abaixo-assinado (S48) e sincronização de artigos (OPS130).
|
||||
- Apagar dados do CMS ou do acervo de fotos.
|
||||
- Redesenho de todas as páginas internas do mandato.
|
||||
|
||||
## Rabbit holes de produto
|
||||
|
||||
- **"Vamos aproveitar e redesenhar o site inteiro."** Vira um projeto institucional. **Corte:** só a home/shell + retirada das campanhas; o resto é PUB2.
|
||||
- **"Apagar todos os posts de campanha."** Perde histórico e notícia. **Corte:** retirar a propaganda de campanha das superfícies; o acervo editorial fica.
|
||||
- **"Criar uma nova marca."** O kit 1313 não tem marca de mandato sem o número. **Corte:** usar os lockups de nome existentes; NEEDS ASSET se o humano quiser marca nova.
|
||||
|
||||
## Questões em aberto (produto)
|
||||
|
||||
- **O que fazer com o 2º turno (Lula) que ainda está no ar?** **Opções:** A) manter `/potencial` e a Plenária até 25/10 e retirar depois; B) retirar tudo agora. **Recomendação:** A — o 2º turno ainda não acabou; o corte imediato é o de Solla/1313. _(assumido — validar no gate)_
|
||||
- **Manter a seção "Bandeiras"?** **Opções:** A) manter, reescrita como bandeiras do mandato; B) remover junto com o bloco "Por que essa eleição importa". **Recomendação:** A — é conteúdo de posição, não pedido de voto; a copy eleitoral sai. _(assumido)_
|
||||
- **Newsletter:** **Opções:** A) remover a captura de campanha (sem novo Consent); B) manter com copy de mandato. **Recomendação:** A — evita mudar a finalidade do consentimento sem revisão. _(assumido)_
|
||||
- **Central/Jingles/Cards:** **Opções:** A) despublicar e tirar do ar; B) manter internos. **Recomendação:** A — são material de campanha; o CMS continua com os registros. _(assumido)_
|
||||
|
||||
## Referências
|
||||
|
||||
- GitHub Issue #1442
|
||||
- Design UI (gate): `docs/plans/site-pos-eleicao-agradecimento-ui-design.html`
|
||||
- TSE/G1: `https://g1.globo.com/ba/bahia/eleicoes/2026/noticia/2026/10/05/eleicoes-2026-jorge-solla-pt-e-eleito-deputado-federal-pela-bahia.ghtml` (152.049 votos, 1,84%, 11º, 417 municípios, Salvador 26.082)
|
||||
- `AGENTS-public.md` (Posts & Tags), `AGENTS.md` (campaign/public), `DESIGN.md` §7, `public/campaign-kit/README.md`
|
||||
- `src/app/(frontend)/(home)/page.tsx`, `src/components/CampaignFooter.tsx`, `src/components/CampaignHero.tsx`
|
||||
Loading…
Reference in a new issue