From 387cd46fd342b9c93f2da4ed2c74c2cdb55c275d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Ign=C3=A1cio=20Fontoura=20Solla?= Date: Sun, 19 Jul 2026 22:06:25 -0300 Subject: [PATCH] Mark E4 spreadsheet import as cut in roadmap and project docs. Product decision: strategic nucleus data will be entered manually via E1+E3 UI instead of a one-shot pnpm db:seed:mapa import. --- .cursor/rules/projects/nucleos-eleitorais.mdc | 3 +- docs/plans/escala-dry-pos-e1.md | 4 +- docs/plans/escala-dry-pos-e2.md | 2 +- docs/plans/mapa-projecao-municipios.md | 22 ++++++----- docs/roadmap.md | 37 ++++++++++--------- 5 files changed, 36 insertions(+), 32 deletions(-) diff --git a/.cursor/rules/projects/nucleos-eleitorais.mdc b/.cursor/rules/projects/nucleos-eleitorais.mdc index dd6246aa..d2185b41 100644 --- a/.cursor/rules/projects/nucleos-eleitorais.mdc +++ b/.cursor/rules/projects/nucleos-eleitorais.mdc @@ -20,6 +20,7 @@ alwaysApply: false - **Trilha E registrada (2026-07-19) — mapa de projeção por município:** plano E1–E5 para equiparar e superar as planilhas "Mapa de projeção de votos Solla 2026" (`docs/sheets/`): E1 metas em cenários (`voteGoals` Bom/Regular/Mínimo) + `priority` no núcleo (migration compartilhada com E3), E2 série histórica TSE 2014/2018 + `computeVoteTrend` derivado (sem migration), E3 `dobradinhaNotes`/`nextSteps` staff-only na inteligência, E4 import único `pnpm db:seed:mapa` (sem criar `Contact`/`leadership`), E5 Salvador por bairro registrado como futuro. Plano: [`docs/plans/mapa-projecao-municipios.md`](../../../docs/plans/mapa-projecao-municipios.md). - **E1+E3 entregues e mesclados em `main` (2026-07-19):** migration `20260719_054522_add_nucleus_goals_strategy` (`voteGoals` Bom/Regular/Mínimo + `priority` `alta|normal` + `dobradinhaNotes`/`nextSteps` staff-only); card "Metas 2026" no detalhe, filtro `?priority=alta`, somas no overview B1 e KPI no dashboard; edição de dobradinhas/encaminhamentos em `NucleusIntelligenceDialog` + cards staff na Visão geral; campos E3 excluídos dos view models de `lideranca`. Domínio em `voteGoals.ts`; débitos pós-`/simplify` → **E6** ([`escala-dry-pos-e1.md`](../../../docs/plans/escala-dry-pos-e1.md)). - **E2 entregue (2026-07-19):** seed TSE parametrizado (`pnpm db:seed:tse -- --year=2014|2018|2022`; anos históricos só dep. federal T1 BA), `computeVoteTrend` ±10% (`increase|stable|decline|noBaseline`), loader candidate-only multi-ano, série + badge no `NucleusElectoralBaseline`, Alert de tendência no `NucleusInsights`, card "Tendência histórica" no overview da lista. Sem migration. +- **E4 cortado (2026-07-19):** import único `pnpm db:seed:mapa` da planilha de projeção **não será implementado** — decisão de produto; metas/prioridade/dobradinhas/encaminhamentos via UI manual (E1+E3). Plano: [`docs/plans/mapa-projecao-municipios.md`](../../../docs/plans/mapa-projecao-municipios.md). - Fluxos operacionais cobertos: login isolado, CRUD/arquivo de núcleos por slug, designação de coordenador (`geral`), CRM de lideranças, estimativas sugerir/confirmar com versão UUID, feed de atualizações, convites WhatsApp (`wa.me` + hash de uso único), dashboard com agregados só de núcleos ativos. - Pendência operacional (não de código): textos provisórios Onda 0 provisionados por migration ([`docs/plans/onda-0.md`](../../../docs/plans/onda-0.md)); substituição pela assessoria jurídica eleitoral + hold de PII real de lideranças/apoiadores até lá; smoke pós-deploy Vercel. Ver Onda 0 em [`docs/roadmap.md`](../../../docs/roadmap.md). - Em 2026-07-17, a listagem de Núcleos passou a aplicar filtros automaticamente pelo estado da URL, sem botão de confirmação, com comboboxes territoriais estritos compartilhados com o formulário. @@ -107,7 +108,7 @@ alwaysApply: false - Em 2026-07-18, **A1 entregue:** `regions`/`cities`/`neighborhoods` como `text` + `hasMany` (tabela `electoral_nucleus_texts`); migration `20260718_190559_territorio_multi_municipio_bairro` com backfill; filtros da lista permanecem single-select na URL e consultam com `{ equals }` (associação ao array — não o operador substring `contains`); UI de `/campanha` com chips multi + bairros só com 1 município; dashboard e criação de liderança atualizados (`Contact.city` só quando `cities.length === 1`). - O DTO paginado de atualizações contém somente filtro/paginação/feed; a visão geral chama um loader dedicado que busca `limit: 3` e apenas os autores necessários à prévia. - A lista paginada de lideranças seleciona e serializa somente os campos da linha; avaliação interna e dados completos de contato são carregados apenas para a liderança selecionada. O fechamento usa `onCloseAutoFocus` no Sheet e `finalFocus` no Drawer, focaliza a linha de origem (ou o título do Núcleo) antes de navegar para a URL canônica, sem RAF/timeout. -- Em 2026-07-19, decisões de produto da Trilha E (mapa de projeção): **sem entidade nova por município** — `electoralNucleus` absorve a camada estratégica (metas, prioridade, dobradinhas) e a visão município-a-município é derivada de núcleos + baseline TSE agregados por `cities[]`; **série histórica 2014/2018 vem do TSE oficial** (seed A3 parametrizado por ano, só dep. federal turno 1 BA), não dos números da planilha; **lideranças/assessores da planilha entram como texto staff-only no import E4, nunca como `Contact`/`leadership`** (sem telefone nem consent — bloqueador LGPD da Onda 0 se aplica; o CRM real é alimentado depois pelo fluxo com Consent); tendência (Queda/Mantém/Aumento) é **derivada em leitura** (`computeVoteTrend`, limiares versionados), não persistida. +- Em 2026-07-19, decisões de produto da Trilha E (mapa de projeção): **sem entidade nova por município** — `electoralNucleus` absorve a camada estratégica (metas, prioridade, dobradinhas) e a visão município-a-município é derivada de núcleos + baseline TSE agregados por `cities[]`; **série histórica 2014/2018 vem do TSE oficial** (seed A3 parametrizado por ano, só dep. federal turno 1 BA), não dos números da planilha; **E4 import da planilha cortado** — dados estratégicos entram manualmente via UI E1+E3 (metas, prioridade, dobradinhas, encaminhamentos); o CRM real (`Contact`/`leadership`) continua pelo fluxo com Consent; tendência (Queda/Mantém/Aumento) é **derivada em leitura** (`computeVoteTrend`, limiares versionados), não persistida. - Em 2026-07-19, insight “oportunidade de virada” absorvido como **Fase 2** de [insight-alavancagem-chapa.md](../../../docs/plans/insight-alavancagem-chapa.md) (A5): majoritários locais de esquerda + (vencedor federal de direita **ou** share da direita nos nominais ≥ limiar); mapa estático de espectro partidário; sem item paralelo. - Em 2026-07-19, **A8 Perfis do eleitorado IBGE registrado:** perfil médio/comum derivado de indicadores municipais do Censo (artefato estático + ponderação por `cities[]`), exibido na aba Eleitorado junto com `voterProfiles` manuais; calculado não sobrescreve o array; sem migration/Consent. Plano: [`docs/plans/perfil-eleitorado-ibge.md`](../../../docs/plans/perfil-eleitorado-ibge.md). - Fonte: `/Users/francisco.solla/.cursor/plans/núcleos_eleitorais_mvp_7f788d29.plan.md`. diff --git a/docs/plans/escala-dry-pos-e1.md b/docs/plans/escala-dry-pos-e1.md index 29d5151e..57fdbc3d 100644 --- a/docs/plans/escala-dry-pos-e1.md +++ b/docs/plans/escala-dry-pos-e1.md @@ -1,7 +1,7 @@ # Escala e DRY pós-E1+E3 (metas, prioridade, estratégia manual) Status: registrado no roadmap (fases pendentes) -Atualizado em: 2026-07-19 (`capture-review-debts` pós-A5: labels conversão/tendência no overview → F3) +Atualizado em: 2026-07-19 (`capture-review-debts` pós-A5: labels conversão/tendência no overview → F3; **E4 import planilha cortado** — gatilho E6 F1 permanece volume manual de núcleos / lista lenta) Item do roadmap: [docs/roadmap.md](../roadmap.md) (Trilha E, item E6) Responsável: — @@ -11,7 +11,7 @@ O E1+E3 ([mapa-projecao-municipios.md](mapa-projecao-municipios.md)) entrega `vo Duas passagens `/simplify` no mesmo branch já limparam o que cabia em cleanup: select fragment único, remoção de `voteGoals` do `nucleusListSelect` (lista só usa `priority`), remoção de `priority` do select do dashboard geral, `aggregateVoteGoals` em um passe no overview VM, labels E3 em `nucleusUi.ts` (client-safe), `step={1}` nos inputs de meta, testes esparsos de ordem. -Os revisores (performance / reuse / quality) marcaram como **importantes e maiores que simplify** os follow-ups abaixo. Sem registro, E2/E4 e B3 (coroplético com metas) herdam o mesmo custo de I/O na lista de núcleos. +Os revisores (performance / reuse / quality) marcaram como **importantes e maiores que simplify** os follow-ups abaixo. Sem registro, E2 e B3 (coroplético com metas) herdam o mesmo custo de I/O na lista de núcleos. _(E4 import planilha cortado 2026-07-19.)_ 1. **Query duplicada na página `/campanha/nucleos`.** `page.tsx` chama em paralelo `loadNucleusListPageData` (paginado, `depth: 1`) e `loadNucleusListOverviewData` (`pagination: false`, conjunto filtrado inteiro). Overview precisa do agregado; a lista precisa da página — mas hoje são **dois round-trips** sobre linhas sobrepostas. Em filtros amplos, o fetch unpaginado do overview domina. 2. **Geografia resolvida duas vezes para baseline no overview.** `nucleusListOverviewPageData.ts` mapeia com `toNucleusElectionGeographyInput`; `loadNucleusBaseline2022Overview` chama `resolveNucleusElectionGeography` de novo por núcleo (mais pesado: `tseZonesForCity`, interseções). diff --git a/docs/plans/escala-dry-pos-e2.md b/docs/plans/escala-dry-pos-e2.md index 22e50864..cc694517 100644 --- a/docs/plans/escala-dry-pos-e2.md +++ b/docs/plans/escala-dry-pos-e2.md @@ -1,7 +1,7 @@ # Escala e DRY pós-E2 (série TSE 2014/2018 + tendência) Status: Fase 2 entregue (2026-07-19); extensão F2 pós-A5 pendente; Fases 1, 3 e 4 pendentes -Atualizado em: 2026-07-19 (extensão int leverage/flip/**classification** registrada via `capture-review-debts` pós-A5 `/simplify` + pós-A5-2) +Atualizado em: 2026-07-19 (extensão int leverage/flip/**classification** registrada via `capture-review-debts` pós-A5 `/simplify` + pós-A5-2; **E4 import planilha cortado**) Item do roadmap: [docs/roadmap.md](../roadmap.md) (Trilha E, item E7) Responsável: — diff --git a/docs/plans/mapa-projecao-municipios.md b/docs/plans/mapa-projecao-municipios.md index 522569e4..16a91c3f 100644 --- a/docs/plans/mapa-projecao-municipios.md +++ b/docs/plans/mapa-projecao-municipios.md @@ -1,7 +1,7 @@ # Mapa de projeção de votos por município (equiparar e superar as planilhas 2026) -Status: E1, E2 e E3 implementados e mesclados em `main` (2026-07-19); E4 e E5 pendentes -Atualizado em: 2026-07-19 (revisão entrega E1+E3 — marcar como entregues no roadmap; access E1/E3 sem `canSetDerivedNucleusField`; escrita via `canUpdateElectoralNucleus` + selects/VMs) +Status: E1, E2 e E3 implementados e mesclados em `main` (2026-07-19); **E4 cortado** (2026-07-19 — preenchimento manual via E1+E3); E5 pendente +Atualizado em: 2026-07-19 (revisão entrega E1+E3 — marcar como entregues no roadmap; access E1/E3 sem `canSetDerivedNucleusField`; escrita via `canUpdateElectoralNucleus` + selects/VMs; **E4 cortado** — decisão de produto: sem `pnpm db:seed:mapa`, dados via UI manual) Item do roadmap: [docs/roadmap.md](../roadmap.md) (Trilha E — itens E1–E5, "Ciclo 3") Responsável: — @@ -16,7 +16,7 @@ A vertical `/campanha` já cobre ou supera parte disso: baseline TSE 2022 por ge - Metas de votos em três cenários e flag de prioridade por núcleo, com escrita staff e leitura pelos três papéis (E1). - Série histórica TSE 2014/2018/2022 (deputado federal, turno 1, BA) com classificação automática de tendência por núcleo (E2) — dado público, sem `Consent`. - Campos manuais staff-only de dobradinhas e encaminhamentos na inteligência do núcleo (E3), excluídos dos view models de `lideranca`. -- Import único e idempotente da planilha rica para núcleos (E4), **sem criar `Contact`/`leadership`** (sem telefone nem consent — bloqueador LGPD da Onda 0 se aplica). +- ~~Import único e idempotente da planilha rica para núcleos (E4)~~ — **cortado 2026-07-19** (preenchimento manual via UI E1+E3; ver [roadmap](../roadmap.md) § Itens cortados). - Registrar Salvador por bairro como item futuro (E5), sem implementar. - Migrations somente em E1+E3 (campos novos em `electoralNucleus`); E2 e E4 não alteram schema. @@ -31,7 +31,7 @@ A vertical `/campanha` já cobre ou supera parte disso: baseline TSE 2022 por ge ## Questões em aberto - **Banda de estabilidade da tendência?** **Resolvido (2026-07-19):** ±10% (`VOTE_TREND_STABLE_BAND = 0.1` em `electionInsights.ts`); par preferido 2018→2022. -- **E4 cria núcleo para todo município com dado estratégico (≈193) ou só para os ~50 prioritários?** **Recomendação:** default = municípios com qualquer preenchimento estratégico (metas, dobradinha, encaminhamento), flag `--priority-only` para restringir. Definir com produto antes de rodar em produção. +- **E4 cria núcleo para todo município com dado estratégico (≈193) ou só para os ~50 prioritários?** **Cortado (2026-07-19)** — item E4 não será implementado; dados estratégicos entram manualmente via E1+E3. - **Meta estadual (71.000) fica onde?** **Recomendação:** derivada — soma das metas dos núcleos no dashboard; sem campo global novo. Se produto quiser meta editável independente da soma, vira campo em global de campanha (fase posterior). ## Abordagem proposta @@ -42,18 +42,16 @@ flowchart LR E1["E1 Metas em cenários + prioridade
(migration)"] E2["E2 Série TSE 2014/2018
+ tendência derivada"] E3["E3 Dobradinhas + encaminhamentos
manuais (staff-only)"] - E4["E4 Import único da planilha
(pnpm db:seed:mapa)"] E5["E5 Salvador por bairro
(registrado; futuro)"] end A3["A3/A4 baseline TSE 2022 ✓"] --> E2 - E1 --> E4 - E3 --> E4 - E2 -.tendência no import.-> E4 E1 -.metas no coroplético.-> B3["B3 Mapa Leaflet"] E2 -.classe por cor.-> B3 E2 -.dataset votacao_secao.-> E5 ``` +> **E4 (import único `pnpm db:seed:mapa`) — cortado 2026-07-19.** Decisão de produto: preencher metas, prioridade, dobradinhas e encaminhamentos manualmente na UI (E1+E3). O desenho original (script CLI idempotente, sem `Contact`/`leadership`) permanece documentado abaixo como referência histórica. + ### E1 — Metas em cenários + prioridade no Núcleo (migration) - **`electoralNucleus`** (`src/collections/ElectoralNucleus.ts`): grupo `voteGoals` (`good`/`regular`/`minimum`, numbers opcionais, validação `good ≥ regular ≥ minimum`) e `priority` (select `alta|normal`, default `normal`, indexado). Escrita staff via `canUpdateElectoralNucleus` (`geral` ou coordenador designado no núcleo) — **sem** `canSetDerivedNucleusField` (esse helper é só Payload-admin, usado nas estimativas derivadas). Leitura para os três papéis; E3 (`dobradinhaNotes`/`nextSteps`) staff-only via select/VM como `strengths`/`risks`. @@ -75,7 +73,11 @@ flowchart LR - Não conflita com A6 (dobradinha automática pós-TSE-2026) nem C4 (Demandas estruturadas): E3 é a versão manual imediata; os planos futuros complementam sem substituição forçada. - Migration compartilhada com E1 (acima). -### E4 — Import único da planilha (`pnpm db:seed:mapa`) +### E4 — Import único da planilha (`pnpm db:seed:mapa`) — **CORTADO** + +**Status:** cortado em 2026-07-19. Motivo: decisão de produto — preferência por recolocar dados manualmente na UI em vez de bootstrap via planilha. Alternativa: criar/editar núcleos e preencher `voteGoals`, `priority`, `dobradinhaNotes` e `nextSteps` via E1+E3 em `/campanha/nucleos`. + +Desenho original (não implementar): - Script `scripts/seed-mapa-projecao.mjs` que lê `docs/sheets/Mapa_projecao_votos_Solla_2026.xlsx` (a rica) e cria/atualiza núcleos por município via Local API em transação: `voteGoals` (parse "Bom: X | Regular: Y | Mínimo: Z"), `priority` (`alta` quando flagado ou presente na aba PRIORITÁRIAS), `dobradinhaNotes`, `nextSteps` (encaminhamentos + observações). Município → nome canônico via `canonicalizeMunicipalityName` (`src/lib/bahiaMunicipalityCodes.ts`); região derivada no servidor (A1). - Nomes de assessores/lideranças da planilha entram como texto nos campos staff-only — **nunca criam `Contact`/`leadership`** (decisão travada acima). @@ -88,7 +90,7 @@ flowchart LR ## Dependências - **E2 ← A3/A4** (entregues): collections `electionTally`/`electionCandidateVote`/`electionCandidate`, seed `db:seed:tse`, `getNucleusElectoralBaseline`, `computeGapVs2022`. -- **E4 ← E1 + E3** (duras): os campos precisam existir antes do import. **E4 ← E2** (suave): tendência já visível ao revisar o import. +- ~~**E4 ← E1 + E3** (duras)~~ — E4 cortado; E1+E3 atendem operação manual. - **E1/E3** não dependem de nada novo — paralelizáveis com o restante da Janela 2. - Suaves para B3 (mapa Leaflet): metas e classe de tendência como métricas do coroplético. - Reusa: `withPayloadTransaction`, locks advisory, padrões de filtro/overview B1, skill `payload-migrations`. diff --git a/docs/roadmap.md b/docs/roadmap.md index 6fcc1209..ed2bf89e 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -1,6 +1,6 @@ # Roadmap — Teqo -Atualizado em: 2026-07-19 (janela 1 vigente; foco: Onda 0 + ativação com dados reais; último compile) +Atualizado em: 2026-07-19 (E4 import planilha cortado — preenchimento manual via E1+E3; janela 1 vigente; foco: Onda 0 + ativação com dados reais) Registro canônico dos **próximos** planos e débitos. Histórico de entregas: resumo abaixo + planos em [`docs/plans/`](plans/) + notebook [`.cursor/rules/projects/nucleos-eleitorais.mdc`](../.cursor/rules/projects/nucleos-eleitorais.mdc). @@ -38,7 +38,7 @@ Engenharia de núcleos / C2 / C3 / baseline / PWA / Trilha E parcial já em `mai - **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. +- **Trilha E (parcial)** — E1 metas/prioridade + E3 estratégia manual; E2 série TSE 2014/2018 + tendência; E7 F2 int loader; **E4 import planilha cortado** (decisão de produto: dados via UI manual, sem `pnpm db:seed:mapa`). - **Fill-ins** — visitados recentemente, reset senha + perfil, Field Desk polish (Impeccable); B5 F1 lazy geometrias (com B3). ## Próximos — Campanha (`/campanha`) @@ -56,8 +56,7 @@ Engenharia de núcleos / C2 / C3 / baseline / PWA / Trilha E parcial já em `mai - **C** — C10 lista de apoiadores sem N+1 de access / forms com `errorProps` · gatilho: base nominal crescendo · [plano](plans/escala-dry-pos-c9.md) - **C** — C11 feed/loaders de planos sem O(n) no detalhe · gatilho: agenda com uso real / volume medido · [plano](plans/escala-dry-pos-c7.md) - **D** — D2 push + sino in-app · soft: chave `campanha-notificacoes-push` (Onda 0) · [plano](plans/notifications.md) -- **E** — E4 import único da planilha de projeção sem criar `Contact`/`leadership` · [plano](plans/mapa-projecao-municipios.md) -- **E** — E6 aggregate metas/prioridade + DRY geo/UI na lista · gatilho: muitos núcleos / antes de E4 se lista lenta · [plano](plans/escala-dry-pos-e1.md) +- **E** — E6 aggregate metas/prioridade + DRY geo/UI na lista · gatilho: muitos núcleos / lista lenta · [plano](plans/escala-dry-pos-e1.md) - **E** — E7 F1/F3/F4 + extensões F2 pós-A5 (trend VM único, tipos, helpers de teste) · [plano](plans/escala-dry-pos-e2.md) - **Débitos / fill-ins** — O0+, VR+, RS+, FD+, FD2, listas globais, higiene PascalCase (ver abaixo) @@ -78,7 +77,6 @@ Engenharia de núcleos / C2 / C3 / baseline / PWA / Trilha E parcial já em `mai | C4 Demandas | — (encomendar) | [demandas-campanha.md](plans/demandas-campanha.md) | | C5 GOTV _(validar)_ | `Dia-D-GOTV` | sem plano ainda | | D2 Notificações | `Notificacoes-PWA` | [notifications.md](plans/notifications.md) | -| E4 Import planilha | — (reusa Baseline / Overview) | [mapa-projecao-municipios.md](plans/mapa-projecao-municipios.md) | Paleta dos PNGs UX Pilot é legado — implementação usa tokens `data-theme='campaign'`. @@ -126,7 +124,6 @@ flowchart TD 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 @@ -147,11 +144,8 @@ flowchart TD 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) @@ -169,14 +163,13 @@ flowchart TD | Ordem | Item | Plano | Depende de | Paralelizável com | | ----- | ----------------------------------------- | -------------------------------------------------- | ----------------------- | ------------------- | -| 5 | E4 import planilha | [mapa-projecao-municipios.md](plans/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](plans/escala-dry-pos-a4.md) | A4 ✓ | A5, A8, E4, C4 | -| 8 | A8 perfis IBGE | [perfil-eleitorado-ibge.md](plans/perfil-eleitorado-ibge.md) | A1 ✓ | A5, A7, E4 | -| 9 | E7 F1/F3/F4 | [escala-dry-pos-e2.md](plans/escala-dry-pos-e2.md) | E2 ✓ | E6, A7, E4 | -| 10 | C4 Demandas | [demandas-campanha.md](plans/demandas-campanha.md) | A1 ✓ (suave: C3) | A5, A7, E4, D2 | -| 11 | D2 Notificações | [notifications.md](plans/notifications.md) | D1 ✓ + chave push | A5, A7, E4, C4 | -| 12 | B5 F2–F3 / B6 | [B5](plans/escala-dry-pos-b2.md) · [B6](plans/escala-dry-pos-b3.md) | B2 ✓ / B3 ✓ | A7, E4 | +| 5 | A5 mobilização + competitiva | planos A5 acima | A4 ✓ | A7, A8, C4, D2 | +| 6 | A7 F2–F5 | [escala-dry-pos-a4.md](plans/escala-dry-pos-a4.md) | A4 ✓ | A5, A8, C4 | +| 7 | A8 perfis IBGE | [perfil-eleitorado-ibge.md](plans/perfil-eleitorado-ibge.md) | A1 ✓ | A5, A7 | +| 8 | E7 F1/F3/F4 | [escala-dry-pos-e2.md](plans/escala-dry-pos-e2.md) | E2 ✓ | E6, A7 | +| 9 | C4 Demandas | [demandas-campanha.md](plans/demandas-campanha.md) | A1 ✓ (suave: C3) | A5, A7, D2 | +| 10 | D2 Notificações | [notifications.md](plans/notifications.md) | D1 ✓ + chave push | A5, A7, C4 | +| 11 | B5 F2–F3 / B6 | [B5](plans/escala-dry-pos-b2.md) · [B6](plans/escala-dry-pos-b3.md) | B2 ✓ / B3 ✓ | A7 | **Janela 3 — 16/08 → set** @@ -202,11 +195,19 @@ flowchart TD - **Listas globais** _(validar)_ — lideranças / atualizações / territórios no nível raiz - **Higiene PascalCase** — varredura de componentes legados +### Itens cortados + +| Item | Cortado em | Motivo | Alternativa | +| ---- | ---------- | ------ | ----------- | +| **E4** import único da planilha (`pnpm db:seed:mapa`) | 2026-07-19 | Decisão de produto: não importar automaticamente da planilha de exemplo; preferência por recolocar dados manualmente | Preencher metas, prioridade, dobradinhas e encaminhamentos via UI E1+E3 em `/campanha/nucleos` | + +Plano histórico: [mapa-projecao-municipios.md](plans/mapa-projecao-municipios.md) (seção E4 marcada como cortada). + ### 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. +**Cortes seguros** (se o prazo apertar): E5; B4; B6; B5 F2–F3; 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