From f27e801e2568eb6ef8f3f9bd829d3fbaabed579e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Ign=C3=A1cio=20Fontoura=20Solla?= Date: Fri, 31 Jul 2026 13:49:46 -0300 Subject: [PATCH] docs: restore A6-pre dobradinha baseline plan Needed by open issue A6-pre; file lived only on a filtered agent branch tip. --- .../dobradinha-baseline-2022-pre-reconcile.md | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 docs/plans/dobradinha-baseline-2022-pre-reconcile.md diff --git a/docs/plans/dobradinha-baseline-2022-pre-reconcile.md b/docs/plans/dobradinha-baseline-2022-pre-reconcile.md new file mode 100644 index 00000000..e6553712 --- /dev/null +++ b/docs/plans/dobradinha-baseline-2022-pre-reconcile.md @@ -0,0 +1,82 @@ +# Dobradinhas potenciais — baseline 2022 até conciliação TSE 2026 + +Status: rascunho +Atualizado em: 2026-07-31 +Item do roadmap: follow-up de A6 (PR #82 / Issue #27) +Responsável: — + +## Contexto + +O PR #82 (A6) entrega o card **"Dobradinhas potenciais para 2026"** na aba Eleições do detalhe do município: candidatos proporcionais com `runningAgain2026 = sim`, ranqueados por score `0,6 alinhamento + 0,4 força local 2022`. Enquanto o TSE não publica as candidaturas de 2026 e a Fase 5 não reconcilia `runningAgain2026`, o loader retorna `{ status: 'pending2026' }` e o card mostra *"Indisponível até as candidaturas de 2026"*. + +Os dados de **2022 já estão no banco** (`electionCandidate` + `electionCandidateVote` via `pnpm db:seed:tse`). O staff precisa da inteligência **agora** — quem teve força local em 2022 e qual o alinhamento partidário — para priorizar dobradinhas antes de agosto. + +## Objetivos + +- Exibir **desde já** a lista ranqueada por município usando candidatos proporcionais de **2022** com votos na geografia (mesma fórmula de score e tiers de A6). +- Quando a conciliação TSE 2026 popular `runningAgain2026`, **sobrepor** o modo provisório: manter só `sim`, **excluir** `nao` (quem concorreu em 2022 mas não volta em 2026). +- Comunicar claramente na UI se a lista é **provisória (baseline 2022)** ou **confirmada (candidaturas 2026 reconciliadas)**. + +## Decisões travadas + +- **Leitura derivada** — sem migration, sem Consent, sem escrita. Reusa `ticketPartnerOpportunities.ts` e o card de A6. +- **Mesma fórmula de score e tiers** de A6 (`campoParties` 2026 + `electionPartySpectrum` 2022; Solla excluído). +- **Mesmos cargos** — só proporcionais (`deputado_federal` + `deputado_estadual`, 1º turno). +- **Dois modos de dados**, um componente: + - `provisional2022` — nenhum `runningAgain2026 ∈ {sim,nao}` no registry 2026; fonte = candidatos 2022 com voto local. + - `confirmed2026` — Fase 5 reconciliada; fonte = `runningAgain2026 = sim` apenas; `nao` fora da lista. +- **Staff-only** — `leader` continua lockdown (igual A6). +- **Cache** — mesmo `unstable_cache` tag `election-tse`; bust pós-reconcile inalterado. + +## Questões em aberto — RESOLVIDAS (proposta) + +- **Copy do estado provisório** — RESOLVIDA. Título mantém "Dobradinhas potenciais para 2026"; subtítulo/aviso: *"Lista provisória com base em quem concorreu aqui em 2022. Atualiza automaticamente quando o TSE publicar as candidaturas de 2026."* +- **Candidatos `runningAgain2026 = desconhecido` após reconcile** — RESOLVIDA. Fora da lista confirmada (mesmo critério conservador de A6: só `sim` entra). Não inventar parceiro sem confirmação. +- **Badge "eleito em 2022"** — RESOLVIDA. Mantém no modo provisório e confirmado (campo `elected` já no registry). + +## Abordagem proposta + +```mermaid +flowchart TD + Probe["Sonda: existe runningAgain2026 ∈ {sim,nao}?"] + Probe -->|não| P2022["Modo provisional2022
candidatos 2022 com voto local"] + Probe -->|sim| C2026["Modo confirmed2026
runningAgain2026 = sim"] + P2022 --> Score["computeTicketPartnerOpportunities(...)"] + C2026 --> Score + Score --> Card["MunicipalityTicketPartnersCard
copy por modo"] +``` + +- **Loader** `municipalityTicketPartnerData.ts`: trocar o early-return `pending2026` por ramo `provisional2022` que lê o registry 2022 (year=2022, offices proporcionais) cruzado com votos na geografia — sem exigir registry 2026. +- **Tipos** `TicketPartnerResult`: substituir `pending2026` por `provisional2022 | confirmed2026` (ambos com `opportunities[]`; vazio continua válido). +- **Card** `MunicipalityTicketPartnersCard.tsx`: remover parágrafo "indisponível"; aviso contextual por modo; lista idêntica nos dois modos. +- **Testes:** int — sem reconcile → `provisional2022` com candidatos 2022; com reconcile `sim`/`nao` → `confirmed2026` exclui `nao`; unit inalterado (puro não muda). + +## Arquivos a alterar + +- `src/utilities/municipality/municipalityTicketPartnerData.ts` — ramo provisório + rename de status. +- `src/lib/ticketPartnerOpportunities.ts` — tipos de resultado (`TicketPartnerResult`). +- `src/components/campaign/municipality/MunicipalityTicketPartnersCard.tsx` — copy por modo. +- `tests/int/municipalityTicketPartnerData.int.spec.ts` — cenário provisório 2022 (substitui assert de `pending2026`). +- `docs/plans/insight-dobradinha-2026.md` — nota de follow-up (A6-pre cobre o gap pré-15/08). + +## Dependências + +- **A6** (PR #82) mergeado em `stage` — infra de score, card e loader existem. + +## Não escopo + +- Overview agregado na lista de municípios (permanece follow-up pós-Fase 5, igual A6). +- Criar `stateDeputy` automaticamente — insight sugere, registro continua em `/campanha/dobradinhas`. +- Majoritários ou cargos fora de federal/estadual. + +## Dados + +- **Dado:** ranking local de candidatos proporcionais por força 2022 + tier de alinhamento. +- **Decisão:** priorizar com quem fechar dobradinha no município antes do registro TSE 2026. +- **Forma:** lista ordenada top-10 na aba Eleições (mesma de A6); aviso de provisionalidade até reconcile. + +## Referências + +- PR #82 — implementação A6 +- [`docs/plans/insight-dobradinha-2026.md`](insight-dobradinha-2026.md) +- [`docs/plans/baseline-eleitoral-tse.md`](baseline-eleitoral-tse.md) — Fase 5 / `runningAgain2026`