From 522e5939c989c65d5809d9ad1b27be43cf2bbf71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Ign=C3=A1cio=20Fontoura=20Solla?= Date: Sun, 2 Aug 2026 20:20:43 -0300 Subject: [PATCH] =?UTF-8?q?docs(plans):=20inten=C3=A7=C3=A3o=20munic=C3=AD?= =?UTF-8?q?pio=20detalhe=20v2=20(B147=E2=80=93B152)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plano pai + seis fatias para a rota paralela /campanha/municipio//v2 (briefing denso, edit-where-you-see; cutover após OK produto). --- docs/plans/municipio-detalhe-v2.md | 99 +++++++++++++++++++++++ docs/plans/municipio-v2-agora.md | 85 +++++++++++++++++++ docs/plans/municipio-v2-conta-local.md | 91 +++++++++++++++++++++ docs/plans/municipio-v2-cutover.md | 79 ++++++++++++++++++ docs/plans/municipio-v2-fab-secundario.md | 79 ++++++++++++++++++ docs/plans/municipio-v2-rede.md | 87 ++++++++++++++++++++ docs/plans/municipio-v2-shell-status.md | 94 +++++++++++++++++++++ 7 files changed, 614 insertions(+) create mode 100644 docs/plans/municipio-detalhe-v2.md create mode 100644 docs/plans/municipio-v2-agora.md create mode 100644 docs/plans/municipio-v2-conta-local.md create mode 100644 docs/plans/municipio-v2-cutover.md create mode 100644 docs/plans/municipio-v2-fab-secundario.md create mode 100644 docs/plans/municipio-v2-rede.md create mode 100644 docs/plans/municipio-v2-shell-status.md diff --git a/docs/plans/municipio-detalhe-v2.md b/docs/plans/municipio-detalhe-v2.md new file mode 100644 index 00000000..dc91be8f --- /dev/null +++ b/docs/plans/municipio-detalhe-v2.md @@ -0,0 +1,99 @@ +# Município detalhe v2 — plano master + +Status: registrado +Atualizado em: 2026-08-02 +Issue: — (lote: #330–#335 / B147–B152; sem Issue-pai no GitHub) +Priority: P1 (lote) +Model: — (por filho) +Impeccable: C — superfície nova em rota paralela +Appetite: lote ~4–6 dias eng em fatias; cutover só após OK produto +Responsável: — + +## Intenção + +O detalhe atual de município (`/campanha/municipios/[slug]`) tem **6 abas** e uma Visão geral em torre de cards. O **Coordenador Geral** não explora bem abas nem scroll longo: lideranças, conta e próximo passo ficam fora do caminho. + +Queremos um **briefing de operação em um olhar** — status → conta → rede → agora — com **edit where you see**, motivo opcional nas mudanças de conjuntura, e ações secundárias no FAB. Desenvolvemos em rota paralela **`/campanha/municipio//v2`**; só após confirmação de produto a v2 substitui a canônica. + +Este arquivo é o **pai de intenção** do lote. Cada Issue filha tem plano próprio e aponta para cá. Planos de **implementação** (`*-impl.md`) nascem em `work-issue` / `agent-work-issue`, não aqui. + +## Persona e fluxo (lote) + +- **Persona / contexto:** Coordenador Geral (e Candidato / assessor staff) na mesa ou no celular, vindo da lista ou do mapa, com pouco tempo. +- **Job principal do lote:** abrir um município e, sem trocar aba, saber como estamos, quem segura, o que falta na meta, e o que fazer agora — e agir no lugar. +- **Fluxo desejado (lote):** + +```text +[Lista/mapa] → /campanha/municipio//v2 + → STATUS (nível · tendência · sinal · classe · agregado) + → CONTA (meta P/M/O · cobertura do cenário ativo · classe) + → REDE (lista; votos na célula) + → AGORA (encaminhamento · sugestão · visita condensada) + → FAB (dossiê / eleições / …) +[Outcome] decide ou age sem explorar abas +``` + +- **Anti-goals de produto (lote):** não redesign do shell inteiro; não spreadsheet mode; não segundo cadastro de pessoa; não % estadual absoluto; não obrigar motivo nas mudanças; não expor estimado a `leader`; não matar a rota antiga até o cutover. + +## Filhos do lote + +| ID | Plano | Outcome em uma linha | +| ---- | ----- | -------------------- | +| B147 (#330) | [municipio-v2-shell-status.md](municipio-v2-shell-status.md) | Rota v2 + faixa de status operável | +| B148 (#331) | [municipio-v2-conta-local.md](municipio-v2-conta-local.md) | Meta P/M/O + cobertura + classe na 1ª dobra | +| B149 (#332) | [municipio-v2-rede.md](municipio-v2-rede.md) | Rede em lista editável (sem aba) | +| B150 (#333) | [municipio-v2-agora.md](municipio-v2-agora.md) | Encaminhamento + sugestão + visita condensada | +| B151 (#334) | [municipio-v2-fab-secundario.md](municipio-v2-fab-secundario.md) | Secundárias no FAB (não na dobra) | +| B152 (#335) | [municipio-v2-cutover.md](municipio-v2-cutover.md) | v2 vira canônica após OK produto | + +**Ordem:** B147 primeiro (shell). B148–B151 dependem de B147 e **serializam** entre si na mesma rota v2 (um agente de cada vez no surface). B152 por último, após validação humana. + +## Decisões de produto do lote _(confirmadas no gate 2026-08-02)_ + +1. Rota paralela: `/campanha/municipio//v2` (singular) até B152. +2. Sinal = **mesmo padrão de seletor** que nível e tendência (não pill → fluxo distinto). +3. Mudança de nível / tendência / sinal → **modal de motivo opcional** (política alinhada a B134). +4. Texto sob o status = **agregado** das últimas notas (nível · tendência · sinal). +5. Explicações = **tooltip** + link para `/campanha/conceitos#…` (não painel inline). +6. Clique no campo P/M/O **ativa** aquele cenário na cobertura. +7. Classe territorial visível na 1ª dobra (Expansão / Reduto / …). +8. Nome / TI **não** competem no corpo — soft-dep B145 (título no header). +9. Página antiga intacta até B152. + +## Soft-deps externos + +- **B145** (#315) — título da entidade no header; v2 não redesenha chrome de nome. +- **B134** (#288) — motivo opcional (wizard/nível); v2 **herda a política**, não espera o merge para começar o shell. + +## Dados (intenção do lote) + +- **Vou apresentar dados?** Sim, nas fatias B148 (conta/classe) e B149 (pledges); status qualitativo em B147. +- **Decisões desbloqueadas:** ver planos filhos. +- **Forma:** adiada aos `*-impl.md`. Restrição de produto: leitura relativa/local; sem % estadual absoluto. + +## Direção no codebase (hipótese do lote) + +- **Áreas prováveis:** nova rota sob `src/app/(campaign)/campanha/(app)/`, composição em `src/components/campaign/municipality/`, loaders já usados pelo detalhe atual / dossiê / conta / pledges / sugestões / visita. +- **Precedente:** detalhe atual + E16 dossiê + E8 conta + lista B9 edit-in-place + FAB B126; canvas de produto na sessão de shaping. +- **Risco de acoplamento:** `leader` lockdown; não duplicar política de voto estimado; não quebrar links da rota antiga até o cutover. + +## Fora de escopo (lote) + +- Implementação técnica detalhada (fica nos `*-impl.md`). +- Redesign de lista/mapa/Início. +- Mudança de glossário de conceitos (só linkar). +- Import CSV, demandas embutidas, comparativo eleitoral na 1ª dobra. + +## Rabbit holes de produto + +- **Epic único “refazer detalhe”.** Explode appetite e review. **Corte:** seis Issues com aceite próprio. +- **Trazer o dossiê inteiro para a dobra.** Mata densidade. **Corte:** dossiê/eleições só no FAB até cutover decidir destinos. +- **Auto-save ao tocar o select.** Perde o rito de motivo. **Corte:** select abre modal; confirmação grava. + +## Referências + +- Issues: [#330](https://github.com/fsolla/teqo/issues/330)–[#335](https://github.com/fsolla/teqo/issues/335) (B147–B152) +- Gate / shaping: sessão canvas `municipio-detalhe-briefing` (ajustes Select+tooltip na intenção). +- Soft: `docs/plans/motivo-opcional-tendencia-e-nivel.md` (B134), issue B145. +- Entregas reusadas: E8, E10/E11, E13, E14, E16, B9, B126. +- Rotas atuais: `/campanha/municipios/[slug]` (abas). diff --git a/docs/plans/municipio-v2-agora.md b/docs/plans/municipio-v2-agora.md new file mode 100644 index 00000000..33fbbdb1 --- /dev/null +++ b/docs/plans/municipio-v2-agora.md @@ -0,0 +1,85 @@ +# Município v2 — Agora (encaminhamento + sugestão + visita) + +Status: registrado +Atualizado em: 2026-08-02 +Issue: #333 +Priority: P1 +Model: composer-2.5 +Impeccable: B — bloco na rota v2 +Appetite: ~0,5–1 dia eng +Responsável: — + +**Plano pai:** [municipio-detalhe-v2.md](municipio-detalhe-v2.md) (lote B147–B152) + +## Intenção + +Depois de status, conta e rede, o coordenador precisa de um bloco **“o que fazer agora”**: próximo passo humano, o que o sistema está pedindo (sugestão), e se a visita do candidato faz sentido — **condensado**, sem a torre de cards da Visão geral atual. + +## Persona e fluxo + +- **Persona / contexto:** CG na mesa, fechando a leitura do município. +- **Job principal:** sair da página com um encaminhamento claro e, se couber, resolver/dispensar uma sugestão. +- **Fluxo desejado:** + 1. Lê/edita **encaminhamento** (próximo passo) no lugar. + 2. Vê **no máximo 1–2** sugestões acionáveis (ou silêncio explícito). + 3. Vê visita do candidato em **uma linha** (elegível / não + motivo curto); detalhe e compositor ficam no FAB (B151). +- **Anti-goals de produto:** lista completa do catálogo E11 na dobra; card de elegibilidade com as cinco condições expandidas sempre; segundo lugar para editar estratégia além deste bloco + status. + +### Esboço de fluxo (B) + +```text +[Agora] + → Encaminhamento (texto editável / auto-save) + → Sugestão (0–2) → Resolver | Dispensar + → Visita: Elegível|Não · uma linha · “abrir giros” no FAB +``` + +## Objetivo e aceite + +- Encaminhamento editável no lugar na v2 (staff com permissão). +- Sugestões: no máximo duas na dobra; resto não compete (Início / FAB se necessário). +- Visita condensada (estado + uma frase); não replica o card E13 completo na dobra. +- Mobile: bloco empilha abaixo da rede sem perder o encaminhamento acima da dobra secundária. + +## Dados (intenção) + +- **Vou apresentar dados?** Sim, derivados (sugestões, elegibilidade resumida). +- **Decisões desbloqueadas:** + - CG: “qual o próximo passo que a equipe combinou?” + - CG: “resolvo esta sugestão agora ou dispenso?” + - CG: “vale levar o candidato — ou só abrir o compositor depois?” +- **Forma:** *adiada ao impl*. Restrição: silêncio é pergunta (não empty state vazio mudo). + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** bloco na v2; `nextSteps` / estratégia; sugestões E11; elegibilidade E13 resumida. +- **Precedente:** OverviewTab atual (sugestões + visita + strategy next steps); motor de sugestões. +- **Risco de acoplamento:** não inventar segundo motor de sugestão; resolve/dispensa reutiliza o fluxo já existente. + +## Dependências + +- Hard: **B147**. +- Pai: [municipio-detalhe-v2.md](municipio-detalhe-v2.md). +- Soft: B151 (atalho giros/dossiê). +- Serializes com irmãos na rota v2. + +## Fora de escopo + +- Compositor de giros completo (só atalho). +- Feed de atualizações completo. +- Triagem statewide (continua no Início). + +## Rabbit holes de produto + +- **Painel E11 completo no município.** **Corte:** 0–2 itens. +- **Checklist E13 expandida sempre.** **Corte:** uma linha + FAB. + +## Questões em aberto (produto) + +- **Encaminhamento = campo `nextSteps` da estratégia ou nota separada?** **Opções:** A) reusar `nextSteps` | B) novo conceito. **Recomendação:** A — um só lugar de verdade. _(assumido)_ + +## Referências + +- GitHub Issue #333 +- Pai: [municipio-detalhe-v2.md](municipio-detalhe-v2.md) +- E11 motor de sugestões; E13 elegibilidade / giros diff --git a/docs/plans/municipio-v2-conta-local.md b/docs/plans/municipio-v2-conta-local.md new file mode 100644 index 00000000..f973112e --- /dev/null +++ b/docs/plans/municipio-v2-conta-local.md @@ -0,0 +1,91 @@ +# Município v2 — conta local (P/M/O + cobertura + classe) + +Status: registrado +Atualizado em: 2026-08-02 +Issue: #331 +Priority: P1 +Model: composer-2.5 +Impeccable: B — bloco na rota v2 (shell B147) +Appetite: ~1 dia eng; conta densa na 1ª dobra +Responsável: — + +**Plano pai:** [municipio-detalhe-v2.md](municipio-detalhe-v2.md) (lote B147–B152) + +## Intenção + +Na v2, o coordenador precisa ver **meta nos três cenários**, **quanto já está comprometido** e **que classe territorial** é aquele município — sem abrir a conta da cadeira completa nem a aba de eleições. Esta fatia densifica a **conta local** na dobra principal. + +## Persona e fluxo + +- **Persona / contexto:** CG / Candidato / assessor staff no detalhe v2, depois de ler o status. +- **Job principal:** responder “qual a meta?”, “falta quanto no cenário que estou olhando?” e “isto é expansão, reduto, marginal…?”. +- **Fluxo desejado:** + 1. Vê P / M / O como campos editáveis no lugar. + 2. **Clicar** (ou focar) um dos três **ativa** aquele cenário para cobertura/déficit. + 3. Lê pledges (cenário de estimativa já usado na campanha) vs meta ativa → cobertura / déficit. + 4. Vê **classe territorial** com destaque (não só num canto do status). + 5. Hover → tooltip (meta, cobertura, classe) + link a conceitos. +- **Anti-goals de produto:** esconder P/M/O atrás de um único número; forçar a grade diagnóstica inteira (potencial, benchmark, etc.) na 1ª dobra; % estadual absoluto; gauge SaaS. + +### Esboço de fluxo (B) + +```text +[Status B147] + → Conta: [P] [M] [O] (clique ativa) + → Meta ativa · pledges · déficit/cobertura + → Classe (pill + fatores curtos opcionais) + → “mais detalhe da conta” sob demanda (não obrigatório nesta Issue) +``` + +## Objetivo e aceite + +- Três metas (pessimista / média / otimista) visíveis e editáveis no lugar (staff com permissão). +- Cenário ativo da cobertura = o P/M/O clicado/focado; feedback claro de qual está ativo. +- Cobertura e déficit/folga do cenário ativo legíveis sem sair da dobra. +- Classe territorial (Reduto / Expansão / Manutenção / Marginal / Sem base) visível nesta seção (além ou em conjunto com o status). +- Tooltips com one-liner + link `#meta`, `#cobertura-da-meta`, `#classe-territorial`. +- Não exige abrir aba Eleições para a leitura local básica. + +## Dados (intenção) + +- **Vou apresentar dados?** Sim, superfície neste item. +- **Decisões desbloqueadas:** + - CG: “aperto ou alivio a meta neste cenário?” + - CG/assessor: “a rede cobre a meta ou há déficit material?” + - CG: “aloco perna como expansão ou defendo reduto?” (classe) +- **Forma:** *adiada ao impl*. Restrições: leitura relativa/local; classe nunca “órfã” sem poder explicar (tooltip/fatores); sem % estadual absoluto. + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** bloco na composição da rota v2; reuso da conta/goal coverage / expectedVotes / classificação territorial já usados no detalhe e na lista. +- **Precedente:** E8 conta da cadeira; coluna Classe na lista; edit-in-place de expectedVotes (B9). +- **Risco de acoplamento:** permissões de edição de meta; não inventar segundo significado de “cenário” divergente do resto da campanha. + +## Dependências + +- Hard: **B147** (shell v2). +- Pai: [municipio-detalhe-v2.md](municipio-detalhe-v2.md). +- Serializes com B149–B151 na mesma rota v2. + +## Fora de escopo + +- Baseline TSE / comparativo de candidatos (permanecem secundários / FAB / cutover). +- Rede de lideranças (B149). +- Sugestões e visita (B150). +- Redesenhar o card completo da conta da cadeira na dobra (detalhe sob demanda OK). + +## Rabbit holes de produto + +- **Trazer todos os diagnósticos E8 para a dobra.** **Corte:** P/M/O + cobertura + classe; resto sob demanda. +- **Três coberturas simultâneas (uma por cenário) sempre.** **Corte:** uma cobertura do cenário ativo; os três números de meta ficam visíveis. + +## Questões em aberto (produto) + +- **Classe só na conta, só no status, ou nos dois?** **Opções:** A) nos dois (status = glance, conta = com fatores) | B) só na conta. **Recomendação:** A — status já prevê pill; conta reforça com contexto. _(confirmado no shaping — manter)_ + +## Referências + +- GitHub Issue #331 +- Pai: [municipio-detalhe-v2.md](municipio-detalhe-v2.md) +- `docs/plans/conta-da-cadeira.md` (E8, histórico) +- Conceitos: `#meta`, `#cobertura-da-meta`, `#classe-territorial` diff --git a/docs/plans/municipio-v2-cutover.md b/docs/plans/municipio-v2-cutover.md new file mode 100644 index 00000000..20e9fc03 --- /dev/null +++ b/docs/plans/municipio-v2-cutover.md @@ -0,0 +1,79 @@ +# Município v2 — cutover para detalhe canônico + +Status: registrado +Atualizado em: 2026-08-02 +Issue: #335 +Priority: P2 +Model: composer-2.5 +Impeccable: A — N/A (migração de rota / remoção do paralelo) +Appetite: ~0,5–1 dia eng; só após OK produto humano +Responsável: — + +**Plano pai:** [municipio-detalhe-v2.md](municipio-detalhe-v2.md) (lote B147–B152) + +## Intenção + +Enquanto a v2 vive em `/campanha/municipio//v2`, a campanha tem **dois detalhes**. Depois que produto confirmar que a v2 é melhor, **uma** URL canônica deve bastar: a experiência nova no lugar da de abas, sem obrigar o time a lembrar do `/v2`. + +## Persona e fluxo + +- **Persona / contexto:** time de campanha + agentes; CG não deve “escolher versão”. +- **Job principal:** passar a abrir sempre o briefing novo; links antigos não quebram. +- **Fluxo desejado:** + 1. Produto valida B147–B151 em uso real (demo / semana de paralelo). + 2. Cutover: canônica passa a ser a experiência v2; `/v2` redireciona ou some; links internos (lista, mapa, giros, dossiê, recentes) apontam certo. + 3. Abas antigas saem do caminho (não ficam como segunda UI). +- **Anti-goals de produto:** manter duas UIs indefinidamente; cutover sem OK humano; quebrar bookmarks sem redirect. + +### Esboço de fluxo + +```text +[OK produto] → canônica = briefing + → redirects dos URLs antigos/paralelos + → limpeza da UI de abas do caminho principal + → smoke: lista → detalhe → leader lockdown → print dossiê +``` + +## Objetivo e aceite + +- Após merge desta Issue, staff chega ao briefing **sem** precisar de `/v2` na URL. +- Links internos relevantes atualizados ou cobertos por redirect. +- Lockdown de `leader` intacto. +- Não reintroduz tab nav de 6 itens como modelo default. +- Critério de go/no-go: confirmação explícita de produto (comentário na Issue / checklist). + +## Dados (intenção) + +- **Dados: N/A** — roteamento e aposentadoria de UI. + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** rotas campaign município(s); links em lista/mapa/giros/quick actions/recent visits; remoção ou redirect da UI de abas. +- **Precedente:** renomes de rota na campanha (ex. planos→atividades); B129 remover overview. +- **Risco de acoplamento:** não deixar `/v2` e abas convivendo sem redirect; não esquecer print do dossiê. + +## Dependências + +- Hard: **B147, B148, B149, B150, B151** entregues. +- Pai: [municipio-detalhe-v2.md](municipio-detalhe-v2.md). +- Gate humano: OK produto antes do claim/exec desta Issue (marcar blocked até lá, se útil). + +## Fora de escopo + +- Novas features de briefing (vão em Issues novas pós-cutover). +- Redesign do dossiê em si. + +## Rabbit holes de produto + +- **Big-bang sem semana de paralelo.** **Corte:** B152 só após OK; paralelo existe de propósito. +- **Preservar abas “por um tempo” ao lado da v2 canônica.** **Corte:** uma experiência; secundárias no FAB. + +## Questões em aberto (produto) + +- **URL canônica final?** **Opções:** A) `/campanha/municipios/[slug]` (plural histórico) com UI nova | B) `/campanha/municipio/[slug]` (singular da v2). **Recomendação:** A — menos churn de links externos/hábitos; singular `/municipio/.../v2` foi só paralelo. _(assumido — validar no OK de cutover)_ + +## Referências + +- GitHub Issue #335 +- Pai: [municipio-detalhe-v2.md](municipio-detalhe-v2.md) +- Filhos B147–B151 diff --git a/docs/plans/municipio-v2-fab-secundario.md b/docs/plans/municipio-v2-fab-secundario.md new file mode 100644 index 00000000..ffdcdca5 --- /dev/null +++ b/docs/plans/municipio-v2-fab-secundario.md @@ -0,0 +1,79 @@ +# Município v2 — ações secundárias no FAB + +Status: registrado +Atualizado em: 2026-08-02 +Issue: #334 +Priority: P2 +Model: composer-2.5 +Impeccable: B — encaixe no FAB da campanha / detalhe v2 +Appetite: ~0,5 dia eng +Responsável: — + +**Plano pai:** [municipio-detalhe-v2.md](municipio-detalhe-v2.md) (lote B147–B152) + +## Intenção + +Abas (dossiê, eleições, atualizações, …) e CTAs secundários **não devem competir** com a dobra de operação. Na v2, o que era “outra aba” vira **ação no FAB** (ou equivalente já estabelecido na campanha), para quem deliberadamente quer preparar visita, ver eleições, etc. + +## Persona e fluxo + +- **Persona / contexto:** CG que às vezes precisa do dossiê ou do comparativo — mas não na maioria das aberturas. +- **Job principal:** alcançar secundárias **sem** poluir status/conta/rede/agora. +- **Fluxo desejado:** + 1. Na v2, abre o FAB (precedente B126 / ações rápidas). + 2. Escolhe: preparar visita (dossiê), ver eleições, registrar sinal (atalho), nova liderança, compositor de giros — conforme papel. + 3. Print / leitura de dossiê não mostra o FAB. +- **Anti-goals de produto:** recriar a barra de 6 abas no topo da v2; esconder ações críticas de operação no FAB (nível/meta/rede ficam na dobra); FAB como único jeito de editar status. + +### Esboço de fluxo (B) + +```text +[Dobla principal intacta] + → FAB (+) → lista curta de secundárias do município + → navega / abre superfície já existente (dossiê, eleições, …) +``` + +## Objetivo e aceite + +- Na v2, secundárias listadas acima estão alcançáveis via FAB (ou chassis de ações rápidas já adotado), **sem** tab nav de 6 itens. +- Itens respeitam papel (ex.: escrita de nível/sinal só quem pode). +- Não remove a dobra de operação; complementar a B147–B150. +- Dossiê/print sem chrome de FAB. + +## Dados (intenção) + +- **Dados: N/A** — navegação / atalhos; dados vivem nas superfícies destino. + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** integração com FAB / quick actions do município; links para dossiê/eleições/giros/nova liderança já existentes. +- **Precedente:** B126 FAB; B80 ações rápidas municípios; tab nav atual a **não** replicar. +- **Risco de acoplamento:** não duplicar um segundo FAB só da v2 se o chassis global já cobre; não quebrar mobile Sheet. + +## Dependências + +- Hard: **B147**. +- Pai: [municipio-detalhe-v2.md](municipio-detalhe-v2.md). +- Soft: B150 (visita condensada aponta para cá). +- Serializes com irmãos na rota v2. + +## Fora de escopo + +- Reescrever dossiê ou eleições. +- Cutover de URLs (B152). +- Novas ações de domínio não listadas no shaping. + +## Rabbit holes de produto + +- **FAB com dezenas de ações.** **Corte:** só as que eram abas/CTAs secundários do detalhe. +- **Registrar sinal só no FAB e tirar o select da faixa.** **Corte:** select na faixa (B147); FAB é atalho opcional. + +## Questões em aberto (produto) + +- **“Registrar sinal” no FAB se já há select na faixa?** **Opções:** A) omitir do FAB | B) atalho que foca/abre o mesmo fluxo. **Recomendação:** B só se o FAB for o hábito mobile; senão A. _(assumido: A na v1 do FAB da v2)_ + +## Referências + +- GitHub Issue #334 +- Pai: [municipio-detalhe-v2.md](municipio-detalhe-v2.md) +- B126 FAB; ações rápidas municípios diff --git a/docs/plans/municipio-v2-rede.md b/docs/plans/municipio-v2-rede.md new file mode 100644 index 00000000..38ef08d3 --- /dev/null +++ b/docs/plans/municipio-v2-rede.md @@ -0,0 +1,87 @@ +# Município v2 — rede (lista edit-in-place) + +Status: registrado +Atualizado em: 2026-08-02 +Issue: #332 +Priority: P1 +Model: composer-2.5 +Impeccable: B — bloco na rota v2 +Appetite: ~1 dia eng; top-N + edição no lugar +Responsável: — + +**Plano pai:** [municipio-detalhe-v2.md](municipio-detalhe-v2.md) (lote B147–B152) + +## Intenção + +Hoje as lideranças do município moram numa **aba** que o coordenador não abre. Na v2, a **rede** precisa estar na dobra principal, em **lista densa**, com declarado/estimado editáveis **onde se vê** — sem card por pessoa e sem mandar para outra rota só para ajustar um número. + +## Persona e fluxo + +- **Persona / contexto:** CG / assessor no detalhe v2, depois de status/conta (ou direto na rede). +- **Job principal:** ver quem segura o município e ajustar pledges sem mudar de aba. +- **Fluxo desejado:** + 1. Vê lista (desktop: tabela; mobile: lista densa) com top-N lideranças relevantes (ex. por estimado/declarado). + 2. Edita declarado e estimado **na célula / na linha** (auto-save no espírito B9). + 3. “Ver todas” / criar liderança **não** incham a dobra (CTA ou FAB — B151). +- **Anti-goals de produto:** card empilhado por liderança; spreadsheet de todas as colunas da ficha; expor estimado a `leader`; edição em massa sem pedido. + +### Esboço de fluxo (B) + +```text +[Rede] + → lista top-N (nome · status · declarado · estimado) + → edita número na célula → grava / feedback + → [Ver todas] / [Nova] → fora da dobra principal (CTA/FAB) +``` + +## Objetivo e aceite + +- Rede visível na v2 sem aba “Lideranças”. +- Forma de **lista** (não cards), utilizável no mobile. +- Declarado e estimado (staff) editáveis no lugar, com feedback de pending/erro. +- `leader` não vê nem edita estimado (assimetria intacta). +- Top-N com caminho claro para o restante do cadastro. +- Não substitui a ficha completa da liderança (link para detalhe da pessoa quando fizer sentido). + +## Dados (intenção) + +- **Vou apresentar dados?** Sim — pledges por liderança × município. +- **Decisões desbloqueadas:** + - Staff: “quem está abaixo do combinado?” / “atualizo a estimativa agora?” + - CG: “a rede cobre o discurso da meta (B148)?” +- **Forma:** *adiada ao impl*. Restrição: lista densa; sem dashboard de vaidade de rede. + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** painel/lista na composição v2; loaders de leaderships/pledges do detalhe atual; padrões de edit-in-place da lista de municípios / painel de pledges. +- **Precedente:** aba Lideranças do detalhe atual; B9 edit-where-you-see; assimetria de votos. +- **Risco de acoplamento:** access de pledge; não abrir escrita a quem não pode; não duplicar ficha de liderança. + +## Dependências + +- Hard: **B147**. +- Pai: [municipio-detalhe-v2.md](municipio-detalhe-v2.md). +- Soft: B151 para “nova liderança” no FAB (CTA textual nesta Issue basta se FAB ainda não existir). +- Serializes com B148/B150/B151 na rota v2. + +## Fora de escopo + +- Wizard completo de nova liderança (pode só encaixar entrada). +- Feed de atualizações / sinais (status B147 + FAB). +- Conta P/M/O (B148). +- Import CSV de apoiadores. + +## Rabbit holes de produto + +- **Trazer todas as colunas da lista global de lideranças.** **Corte:** nome, status de apoio, declarado, estimado. +- **Optimistic UI sem refresh do agregado da conta.** **Corte:** honestidade do resultado (Feel the action) — conta pode atualizar após revalidate. + +## Questões em aberto (produto) + +- **Ordenação default do top-N?** **Opções:** A) estimado (senão declarado) desc | B) última atividade. **Recomendação:** A — conversa direto com a conta. _(assumido)_ + +## Referências + +- GitHub Issue #332 +- Pai: [municipio-detalhe-v2.md](municipio-detalhe-v2.md) +- Detalhe atual: aba leaderships / pledges panel diff --git a/docs/plans/municipio-v2-shell-status.md b/docs/plans/municipio-v2-shell-status.md new file mode 100644 index 00000000..e4dcef0b --- /dev/null +++ b/docs/plans/municipio-v2-shell-status.md @@ -0,0 +1,94 @@ +# Município v2 — shell + faixa de status + +Status: registrado +Atualizado em: 2026-08-02 +Issue: #330 +Priority: P1 +Model: cursor-grok-4.5-medium +Impeccable: C — fluxo novo na rota `/campanha/municipio//v2` +Appetite: ~1–1,5 dia eng; rota + status operável (sem conta/rede/agora) +Responsável: — + +**Plano pai:** [municipio-detalhe-v2.md](municipio-detalhe-v2.md) (lote B147–B152) + +## Intenção + +Abrir o município na v2 e, na **primeira dobra**, ler e alterar a conjuntura (nível, tendência, sinal) sem abas, sem `/editar` e sem scroll de cards. Esta fatia entrega o **chão** da v2: rota paralela + faixa de status densa. Conta, rede, agora e FAB ficam nos filhos. + +## Persona e fluxo + +- **Persona / contexto:** Coordenador Geral (e staff unrestricted / assessor no município), vindo da lista ou do mapa, com pressa. +- **Job principal:** em poucos segundos responder “como estamos neste município?” e registrar mudança de nível, tendência ou sinal. +- **Fluxo desejado:** + 1. Abre `/campanha/municipio//v2`. + 2. Vê três **seletores** equivalentes (nível, tendência, sinal) + classe territorial + indicador de silêncio/frescor. + 3. Ao mudar qualquer um dos três → **modal de motivo opcional** → Confirmar (vazio OK). + 4. Sob os controles, lê o **agregado** das últimas notas (nível · tendência · sinal). + 5. Hover/focus em cada chip/controle → **tooltip** com one-liner + link para o conceito em `/campanha/conceitos`. +- **Anti-goals de produto:** painel de ajuda inline no lugar de tooltip; fluxo de sinal diferente do de nível/tendência; motivo obrigatório; hero com nome/TI no corpo (B145); auto-gravar ao tocar o select. + +### Esboço de fluxo (C) + +```text +[Abrir v2] + → faixa: [Select nível] [Select tendência] [Select sinal] [Classe] … + → [mudou select] → [Modal motivo opcional] → [Confirmar] + → agregado atualiza + → (placeholders ou vazio para conta/rede/agora — filhos) +``` + +## Objetivo e aceite + +- Rota v2 acessível a staff do município; **leader** não entra (lockdown). +- Nível, tendência e sinal usam o **mesmo padrão de seletor** + modal de motivo opcional. +- Agregado de texto mostra as últimas notas disponíveis dos três eixos (e ausência de sinal / idade quando couber). +- Tooltips nos sinais da faixa (nível, tendência, sinal, classe) com resumo + link a conceitos. +- Página `/campanha/municipios/[slug]` **intacta**. +- Mobile: faixa legível sem exigir scroll horizontal de abas. +- Nome do município / TI não competem como hero no corpo (respeitar B145 / chrome existente). + +## Dados (intenção) + +- **Vou apresentar dados?** Sim, sobretudo qualitativos (nível, tendência, tipo/idade de sinal, classe). +- **Decisões desbloqueadas:** + - CG: “subo/desço envolvimento?” / “marco conjuntura?” / “registro sinal agora?” + - Staff: “este município está frio (silêncio)?” +- **Forma:** *adiada ao plano de implementação*. Restrição: silêncio/frescor alinhado à regra de produto já usada na lista (ordem de grandeza de dias frios). + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** nova rota sob `src/app/(campaign)/campanha/(app)/municipio/…/v2`; composição em `components/campaign/municipality/`; reuso de loaders/view models de detalhe/estratégia/updates; tooltips no precedente de hover da campanha; glossário via conceitos. +- **Precedente a olhar:** detalhe atual; B134 (motivo opcional); B145 (título no header); E14 nível; registro de sinal na lista. +- **Risco de acoplamento:** escrita de nível só unrestricted; não expor campos staff a leader; não quebrar rota antiga. + +## Dependências + +- Soft: B145 (chrome de título), B134 (política de motivo opcional). +- Pai: [municipio-detalhe-v2.md](municipio-detalhe-v2.md). +- Filhos que esperam este: B148–B151 (hard), B152 (hard). + +## Fora de escopo + +- Conta P/M/O e cobertura (B148). +- Lista de lideranças / pledges (B149). +- Encaminhamento, sugestões, visita (B150). +- FAB de secundárias (B151). +- Cutover (B152). +- Comparativo eleitoral / dossiê completo na dobra. + +## Rabbit holes de produto + +- **Reimplementar o dossiê na home da v2.** **Corte:** só status nesta Issue. +- **Wizard completo de nível (histerese/override) redesenhado do zero.** **Corte:** respeitar ritos de produto já decididos (E14 + B134); só o encaixe na faixa. +- **Tooltip = página de conceito embutida.** **Corte:** one-liner + link. + +## Questões em aberto (produto) + +- **Select de sinal com município “frio” mostra o quê como valor atual?** **Opções:** A) valor sentinela “Sem sinal / frio (N dias)” | B) último tipo + idade na label. **Recomendação:** A na faixa + idade no agregado/tooltip — deixa óbvio que dá para registrar. _(assumido — validar na demo da v2)_ + +## Referências + +- GitHub Issue #330 +- Pai: [municipio-detalhe-v2.md](municipio-detalhe-v2.md) +- B134 / `docs/plans/motivo-opcional-tendencia-e-nivel.md` +- Conceitos: `#nivel-de-envolvimento`, `#classe-territorial`, `#pauta-do-silencio`