teqo-backup/docs/roadmap.md
Francisco Ignácio Fontoura Solla b75daab498 Refactor campaign dashboard UX and add product discovery artifacts.
Extract dashboard cards into focused components (queues, upcoming plans, leadership status, recently visited, choropleth legend), compile the roadmap for outcome-oriented tracking, document the customer job and improve-app journey, and tighten roadmap skills with decision-quality gates.
2026-07-19 21:56:01 -03:00

17 KiB
Raw Blame History

Roadmap — Teqo

Atualizado em: 2026-07-19 (janela 1 vigente; foco: Onda 0 + ativação com dados reais; último compile)

Registro canônico dos próximos planos e débitos. Histórico de entregas: resumo abaixo + planos em docs/plans/ + notebook .cursor/rules/projects/nucleos-eleitorais.mdc.

Âncoras do calendário eleitoral 2026 (Res. TSE 23.760/2026)

Data Marco Consequência para o produto
20/07–05/08 Convenções partidárias Núcleos/coordenadores operando agora
15/08 Prazo final de registro de candidaturas TSE publica candidaturas 2026 → destrava A6 (dobradinha)
16/08 Início da propaganda eleitoral Base nominal, baseline e agenda em produção antes desta data
09–23/10 Propaganda gratuita rádio/TV Congelar mudanças arriscadas
04/10 1º turno GOTV (C5) — confirmação de comparecimento da base nominal
25/10 Eventual 2º turno Chapa majoritária; Solla decidido no 1º turno

Princípios e decisões travadas

  • Ownership de audiência e portabilidade de dados; módulos reutilizáveis em outros contextos políticos.
  • Um único app Next.js: site (frontend), admin (payload), /campanha (campaign). Sem Rust separado. Vercel por enquanto.
  • Doações só via CTA QueroApoiar (apoiar.me/jorgesolla). Pessoa = Contact + joins — nunca cadastro paralelo.
  • Núcleo = unidade operacional; Zona TSE = referência oficial distinta. Sem disparo em massa (Res. TSE 23.610 art. 33 / Meta).

Onda 0 — caminho crítico para dados reais

Engenharia de núcleos / C2 / C3 / baseline / PWA / Trilha E parcial já em main. Textos provisórios de Consent + /privacidade auto-provisionados (onda-0.md); hold de PII real até o lote jurídico final.

  1. Lote jurídico único (externo) — textos finais (substituem provisórios) + base LGPD art. 11: lideranca-autopreenchimento, apoiador-cadastro, apoiador-intencao-voto, campanha-notificacoes-push, Aviso de Privacidade, avaliação RIPD.
  2. Smoke pós-deploy — NEXT_PUBLIC_SITE_URL HTTPS, login /campanha, núcleo de teste; checklist no AGENTS.md.
  3. Ativação com dados reais assim que (1) liberar — lideranças/apoiadores reais e import em massa.
  4. Onboarding do time — usuários geral/coordenador, primeiros núcleos, treino de campo.

O0+ (escala/DRY pós-Onda 0) não bloqueia jurídico nem smoke fictício — plano.

Já entregue (resumo)

  • Núcleos MVP + Ciclo 2 — auth/campaignUser, território A1/A2, baseline A3/A4, overview B1, share C1, PWA D1, geometrias B2, Leaflet B3.
  • Operação — C2 (eng. pronta; prod. ↔ Onda 0), C3 agenda, C6–C9 escala apoiadores/planos.
  • Trilha A (parcial) — A5 conversão + classificação territorial + alavancagem/virada; A7 F1 agregação federal no detalhe.
  • Trilha E (parcial) — E1 metas/prioridade + E3 estratégia manual; E2 série TSE 2014/2018 + tendência; E7 F2 int loader.
  • Fill-ins — visitados recentemente, reset senha + perfil, Field Desk polish (Impeccable); B5 F1 lazy geometrias (com B3).

Próximos — Campanha (/campanha)

Por trilha (só abertos)

  • A — A5 restante: mobilização (brancos/nulos) e inteligência competitiva ainda sem insight no produto · mobilização · competitiva
  • A — A6 dobradinha 2026 automática quando o TSE publicar candidaturas · gatilho externo: pós-15/08 · plano
  • A — A7 F2–F5: cityCode TSE, Alert/Progress DRY, fetch 2022 único lista+mapa, batch flip na lista · gatilho F4: pós-B3 ✓; F5: pós-A5 · plano
  • A — A8 perfil médio do eleitorado (IBGE) na aba Eleitorado sem sobrescrever manuais · plano
  • B — B4 camada de zonas TSE no mapa coroplético · mapa
  • B — B5 F2–F3: cache CLI compartilhado + factory mun/TI · plano
  • B — B6 BahiaMap setStyle incremental ao trocar métrica · gatilho: troca frequente no overview · plano
  • C — C4 demandas de campanha (CRM de pedidos + custo) · plano
  • C — C10 lista de apoiadores sem N+1 de access / forms com errorProps · gatilho: base nominal crescendo · plano
  • C — C11 feed/loaders de planos sem O(n) no detalhe · gatilho: agenda com uso real / volume medido · plano
  • D — D2 push + sino in-app · soft: chave campanha-notificacoes-push (Onda 0) · plano
  • E — E4 import único da planilha de projeção sem criar Contact/leadership · plano
  • E — E6 aggregate metas/prioridade + DRY geo/UI na lista · gatilho: muitos núcleos / antes de E4 se lista lenta · plano
  • E — E7 F1/F3/F4 + extensões F2 pós-A5 (trend VM único, tipos, helpers de teste) · plano
  • Débitos / fill-ins — O0+, VR+, RS+, FD+, FD2, listas globais, higiene PascalCase (ver abaixo)

A validar (assumptions)

  • C5 — operação dia D / GOTV (check-off da base em 04/10) — validar com produto; design Dia-D-GOTV; sem plano ainda
  • E5 — Salvador por bairro (votacao_secao + DE-PARA) — valor pós-eleição?
  • FD2 — prioridades de UX pós-critique (bulk fila, glossário, …) — validar com produto · plano
  • Listas globais — lideranças/atualizações/territórios no raiz — sem plano detalhado

Referências de design (só itens abertos com ref)

Item Design Plano
A5 Insights (restantes) Baseline-Eleitoral-2022 mobilização · competitiva
A6 Dobradinha 2026 — (encomendar) insight-dobradinha-2026.md
A8 Perfis eleitorado IBGE — (reusa aba Eleitorado) perfil-eleitorado-ibge.md
C4 Demandas — (encomendar) demandas-campanha.md
C5 GOTV (validar) Dia-D-GOTV sem plano ainda
D2 Notificações Notificacoes-PWA notifications.md
E4 Import planilha — (reusa Baseline / Overview) mapa-projecao-municipios.md

Paleta dos PNGs UX Pilot é legado — implementação usa tokens data-theme='campaign'.

Grafo de dependências (abertos + predecessores mínimos)

flowchart TD
    subgraph Onda0["Onda 0 — produção"]
        JUR["Lote jurídico único<br/>(Consent finais + privacidade)"]
        O0DRY["O0+ Escala/DRY pós-Onda 0"]
    end

    subgraph TrilhaA["Trilha A"]
        A4["A4 Baseline + Gap ✓"]
        A5done["A5 conversão/classif./alavancagem ✓"]
        A5open["A5 mobilização + competitiva"]
        A7["A7 F2–F5 escala pós-A4"]
        A6["A6 Dobradinha 2026"]
        A8["A8 Perfis IBGE"]
    end

    subgraph TrilhaB["Trilha B"]
        B3["B3 Leaflet ✓"]
        B5["B5 F2–F3 cache/factory"]
        B6["B6 setStyle Leaflet"]
        B4["B4 Zonas TSE no mapa"]
    end

    subgraph TrilhaC["Trilha C"]
        C2["C2 Cadastro nominal ✓"]
        C3["C3 Agenda ✓"]
        C10["C10 Escala pós-C9"]
        C11["C11 Escala pós-C7"]
        C4["C4 Demandas"]
        C5["C5 GOTV _(validar)_"]
    end

    subgraph TrilhaD["Trilha D"]
        D1["D1 PWA ✓"]
        D2["D2 Push + sino"]
    end

    subgraph TrilhaE["Trilha E"]
        E1["E1+E3 Metas/estratégia ✓"]
        E2["E2 Tendência ✓"]
        E6["E6 Escala pós-E1"]
        E7["E7 Escala pós-E2"]
        E4["E4 Import planilha"]
        E5["E5 Salvador bairro _(validar)_"]
    end

    A4 --> A7
    A4 --> A5open
    A5done -.mesmo loader.-> A7
    A4 --> A6
    TSE2026["TSE candidaturas 2026<br/>(após 15/08)"] --> A6
    B3 --> B6
    B3 --> B4
    A7 -.fetch 2022.-> B3
    JUR --> C2prod["C2 dados reais"]
    C2 --> C2prod
    C2 --> C5
    C3 --> C11
    C3 -.relação opcional.-> C4
    C10 -.forms DRY.-> C11
    D1 --> D2
    JUR -.chave push.-> D2
    E1 --> E6
    E1 --> E4
    E2 --> E7
    E2 -.dataset.-> E5
    E6 -.perf.-> E4
    E7 -.int loader.-> E4

Sequência por janela (só pendentes)

Janela 1 — agora → 05/08 (convenções)

Ordem Item Plano Depende de Paralelizável com
1 Onda 0 (lote jurídico + smoke + onboarding) onda-0.md engenharia ✓ tudo
2 C2 dados reais (após Consent finais) cadastro-nominal-apoiadores.md Onda 0 jurídico A7, E6, C10, C11
3 C10 / C11 se base ou agenda crescerem C10 · C11 C9 ✓ / C7 ✓ E6, A7, O0+
4 E6 F1 se lista de núcleos ficar lenta escala-dry-pos-e1.md E1+E3 ✓ E7, A7, C10

Janela 2 — 05/08 → 16/08 (pré-propaganda)

Ordem Item Plano Depende de Paralelizável com
5 E4 import planilha mapa-projecao-municipios.md E1+E3 ✓ (suave: E6/E7) A5 resto, A7, A8
6 A5 mobilização + competitiva planos A5 acima A4 ✓ A7, A8, E4, C4, D2
7 A7 F2–F5 escala-dry-pos-a4.md A4 ✓ A5, A8, E4, C4
8 A8 perfis IBGE perfil-eleitorado-ibge.md A1 ✓ A5, A7, E4
9 E7 F1/F3/F4 escala-dry-pos-e2.md E2 ✓ E6, A7, E4
10 C4 Demandas demandas-campanha.md A1 ✓ (suave: C3) A5, A7, E4, D2
11 D2 Notificações notifications.md D1 ✓ + chave push A5, A7, E4, C4
12 B5 F2–F3 / B6 B5 · B6 B2 ✓ / B3 ✓ A7, E4

Janela 3 — 16/08 → set

Ordem Item Plano Depende de Paralelizável com
13 B4 Zonas no mapa mapa-bahia-geometrias.md A2 ✓ + B3 ✓ A6 prep, C5 prep

Janela 4 — set → 04/10

Ordem Item Plano / design Depende de
14 A6 Dobradinha 2026 insight-dobradinha-2026.md A4 ✓ + TSE pós-15/08
15 C5 GOTV (validar) design Dia-D-GOTV C2 dados reais
16 Congelamento ~20/09 — só bugfix / dados

Fill-ins abertos

  • O0+ — revalidate globals, módulo de chaves Consent, testes SQL, DRY Lexical/layout · plano
  • VR+ — refresh bfcache/storage do painel recentes + DRY de lista · gatilho F1: painel stale · plano
  • RS+ — auth read leve + shells/campos de senha compartilhados · gatilho F1: /campanha lento sob carga · plano
  • FD+ — shell size / heading / strips Field Desk · gatilho strips: 3ª strip no home ou Fase 3 VoteGoals · plano
  • FD2 (validar) — bulk fila Sem coordenador, glossário, outline, empty coordenador · plano
  • Listas globais (validar) — lideranças / atualizações / territórios no nível raiz
  • Higiene PascalCase — varredura de componentes legados

Cortes seguros / não cortáveis

Não cortáveis: Onda 0 (jurídico/Consent), C2 dados reais, C3 agenda (já ✓), A4 baseline (já ✓), E1+E3 paridade mínima com a planilha (já ✓) — risco legal, base nominal, operação e instrumento de alocação.

Cortes seguros (se o prazo apertar): E5; B4; B6; B5 F2–F3; E4 (preencher E1/E3 à mão); A8; E7 F1/F3/F4; E6 F2–F4 (preferir F1 se lista lenta); A7 F2–F5 (F4 vale mais com mapa na lista; F5 se filtros ≤10 núcleos); A5 restante (mobilização/competitiva); C4; D2 push (manter sino); C10/C11 se base/agenda pequenas; O0+/VR+/RS+/FD+ fases cosméticas; FD2 Fase 5 motion; fill-ins.

Bloqueadores atuais

Item Status Fonte
Lote jurídico final LGPD (Consent + privacidade + RIPD) — PII real em hold caminho crítico para dados reais notebook; onda-0; AGENTS
RBAC em users (admin Payload) antes de abrir /admin a equipe maior pendente AGENTS Known Gap #1
Consent público ainda por ID numérico (submitWhatsapp.ts etc.) pendente AGENTS Known Gap #2
Collection Pages + hero/copy da home editáveis pendente (não bloqueia /campanha) AGENTS Known Gap #3

Site público

Já entregue: post/tag, listagens/artigos, seed, cache posts; /privacidade (texto provisório Onda 0).

Próximos:

  • Textos finais de privacidade + polish O0+ (revalidate globals, DRY Lexical)
  • Pages institucionais (bio, mandato, propostas) + hero/copy editáveis
  • Agenda/multimídia via links oficiais; CTA Doar → QueroApoiar
  • Migrar Consent dos fluxos públicos para chave estável

Admin Payload

  • roles em users + access real antes de ampliar /admin
  • Seed reproduzível de Consent por chave (não por ID)

Plataforma white-label

  • Fase 2 do README (multi-tenant / marca por mandato) — depois da eleição

Fora de escopo (por enquanto)

  • Serviço Rust separado; self-host/Coolify enquanto Vercel atender; doações in-app
  • Núcleo = Zona TSE; PWA do site//admin; PostGIS sem query espacial real
  • WhatsApp Business API / disparo em massa; previsão estatística de votos neste ciclo

Fontes