diff --git a/docs/plans/atualizacao-unificada-polaridade-urgente.md b/docs/plans/atualizacao-unificada-polaridade-urgente.md new file mode 100644 index 00000000..344dbc59 --- /dev/null +++ b/docs/plans/atualizacao-unificada-polaridade-urgente.md @@ -0,0 +1,87 @@ +# C87 — Atualização unificada (texto + polaridade + urgente) + +Status: blocked (plano local; promove após merge em main) +Atualizado em: 2026-08-06 +Issue: #396 +Priority: P1 +Model: cursor-grok-4.5-medium +Model-local: deepseek-v4-high +Impeccable: C — reformula o formulário/feed/wizard de atualização do município (não é só copy) +Canvas UI: /home/fsolla/.cursor/projects/home-fsolla-cursor-worktrees-teqo-hin1/canvases/plan-c87-ui-draft.canvas.tsx +Appetite: ~1–1,5 dia eng; um outcome verificável (registrar o que aconteceu sem escolher tipo de registro) +Responsável: — + +## Intenção + +Hoje o staff escolhe entre semanal / urgente / nota / sinal (e, no sinal, ainda um tipo). Em campo isso atrasa e confunde. Queremos **um** jeito de anotar o que aconteceu: texto livre, classificação boa / neutra / ruim, e um toggle urgente. Tendência política do município (favorável / neutra / desfavorável) continua onde já está — não é este seletor. + +## Persona e fluxo + +- **Persona / contexto:** Alex (coordenador) e Casey (assessor) no detalhe do município, na lista (“último sinal”) ou no wizard “Registrar o que aconteceu”, sob pressão de tempo. +- **Job principal:** registrar o fato do dia em poucos segundos, sem taxonomia de tipo. +- **Fluxo desejado:** escolhe o município (se ainda não estiver nele) → escreve o texto → marca Boa / Neutra / Ruim → opcionalmente liga Urgente → registra → o feed e o frescor refletem o registro. +- **Anti-goals de produto:** segundo seletor que copie a Tendência; spreadsheet de atualizações; reabrir os cinco tipos de sinal; relatório semanal de três caixas obrigatórias; misturar deliberação (responsável / thread / resolvido) neste item — isso é **C88**. + +### Esboço de fluxo (C) + +```text +[detalhe / lista / wizard] + → formulário único: texto + polaridade + urgente? + → Registrar + → feed mostra chip polaridade (+ Urgente) e o texto +``` + +## Objetivo e aceite + +- Staff registra atualização com **apenas** texto livre + polaridade (Boa / Neutra / Ruim) + toggle Urgente. +- Não há mais escolha de “tipo de registro” (semanal / urgente / nota / sinal) nem tipo de sinal tipado na UI de campanha. +- Polaridade da atualização **não** altera nem substitui a Tendência do município. +- Frescor / “último sinal” continua refletindo o registro (e pledges, como já faz). +- Leader lockdown intacto (liderança não entra no fluxo staff de atualização). +- Decisão explícita no gate sobre o que substitui o gatilho E11 de “sinal de adversário” (ver questões). + +## Dados (intenção) + +- **Vou apresentar dados?** Sim, só aggregate para outro consumidor (frescor; eventualmente sugestões E11). +- **Decisões desbloqueadas:** + - Coordenação: “o que ouvi hoje é bom, neutro ou ruim — e é urgente?” + - Fila: onde o município ficou sem registro recente (inalterado em intenção). +- **Forma:** _adiada ao plano de implementação_ — restrição: sem % estadual absoluto; polaridade é classificação do **registro**, não KPI estadual. + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** `src/lib/schemas/municipalityUpdate.ts`, collection/form/feed de atualização do município, wizard `registrar-sinal` / ações rápidas, loaders do detalhe/dossiê, gatilhos em `municipalityTriggers` / catálogo de sugestões, notificações de criação de atualização. +- **Precedente a olhar:** C12 / B62 (modelo de sinal), B26 / B63 (lista + wizard de sinal), formulário e feed atuais de `municipalityUpdate`. +- **Risco de acoplamento:** E11 lê presença de sinal tipado de adversário; wizards e copy do Início ainda falam “sinal”; imutabilidade histórica do registro staff. + +## Dependências + +- Nenhuma dura. Suave: alinhar copy do catálogo de ações do Início e wizards encadeados depois do cutover. +- **C88** depende deste item (deliberação assume o modelo unificado). + +## Fora de escopo + +- Thread de discussão, responsável e “resolvido” → **C88**. +- Mudar Tendência política do município (já existe; wizard B64). +- Redesign do shell do município v2 além do bloco de atualizações. +- Backfill semântico fino de registros antigos além do mínimo para o feed não quebrar (executor decide migração de dados no impl). + +## Rabbit holes de produto + +- **"Já que unificou, coloca responsável e thread aqui."** Vira dois jobs. **Corte:** C88. +- **"Polaridade = Tendência."** Confunde estado do município com tom do fato. **Corte:** rótulos Boa/Neutra/Ruim na atualização; Tendência intacta. +- **"Mantém os tipos de sinal como opcional."** Volta a complexidade. **Corte:** fora da UI de campanha neste item. +- **"Relatório semanal estruturado volta como template."** **Corte:** um campo de texto; quem quiser estrutura escreve no próprio texto. + +## Questões em aberto (produto) + +- **Com a saída do sinal tipado, o que alimenta o nível 1 do E11 (adversário)?** **Opções:** A) polaridade Ruim + Urgente conta como alerta frouxo; B) um único toggle extra “Alerta de adversário?” (ainda mais simples que 5 tipos); C) dropar o gatilho automático — só frescor/silêncio. **Recomendação:** B se a coordenação ainda quer fila de risco confirmado; C se o custo de um campo a mais não vale na mesa. _(assumido B — validar)_ +- **Polaridade é obrigatória?** **Opções:** A) sim; B) opcional (default Neutra). **Recomendação:** A — força o gesto de classificar sem custo real. _(assumido)_ +- **Registros antigos (semanal/sinal/…)** no feed: **Opções:** A) mostrar como atualização genérica com polaridade Neutra + texto concatenado; B) badge “legado” até sumirem. **Recomendação:** A — sem segunda UI. _(assumido)_ + +## Referências + +- GitHub Issue: [#396](https://github.com/fsolla/teqo/issues/396) +- Canvas UI (gate): [/home/fsolla/.cursor/projects/home-fsolla-cursor-worktrees-teqo-hin1/canvases/plan-c87-ui-draft.canvas.tsx](/home/fsolla/.cursor/projects/home-fsolla-cursor-worktrees-teqo-hin1/canvases/plan-c87-ui-draft.canvas.tsx) +- `docs/plans/simplificar-modelo-sinal.md` (B62, entregue) · `docs/plans/registro-fundacao.md` (C12) · `docs/plans/wizard-registro-sinal.md` (B63) +- Superfícies vivas: formulário/feed de atualização do município, coluna “Último sinal”, wizard de registrar sinal, `campaignIntelligenceConcepts` (pauta do silêncio) diff --git a/docs/plans/deliberacao-atualizacao-responsavel-thread.md b/docs/plans/deliberacao-atualizacao-responsavel-thread.md new file mode 100644 index 00000000..86eede19 --- /dev/null +++ b/docs/plans/deliberacao-atualizacao-responsavel-thread.md @@ -0,0 +1,92 @@ +# C88 — Deliberação na atualização (responsável, thread, resolvido) + +Status: blocked (plano local; promove após merge em main) +Atualizado em: 2026-08-06 +Issue: #397 +Priority: P1 +Model: cursor-grok-4.5-medium +Model-local: deepseek-v4-high +Impeccable: C — fluxo novo de deliberação em cima do feed de atualizações +Canvas UI: /home/fsolla/.cursor/projects/home-fsolla-cursor-worktrees-teqo-hin1/canvases/plan-c88-ui-draft.canvas.tsx +Appetite: ~1–1,5 dia eng; um outcome verificável (coordenação atribui, discute e fecha uma atualização) +Responsável: — + +## Intenção + +Com a atualização virando o lugar único do “o que aconteceu” (**C87**), a coordenação precisa **deliberar ali mesmo**: apontar um responsável, conversar na própria atualização e marcar resolvido — sem abrir demanda, atividade ou Zap paralelo para cada fato. + +## Persona e fluxo + +- **Persona / contexto:** Alex (coordenador/candidato) vendo um registro Ruim/Urgente no município; Casey (assessor) recebendo a bola e respondendo no fio. +- **Job principal:** transformar um fato registrado em ação acompanhada — quem resolve, o que se falou, e se fechou. +- **Fluxo desejado:** abre a atualização no feed/detalhe → (coordenação) escolhe responsável → as partes comentam no fio → alguém marca Resolvido → a atualização deixa de gritar como aberta. +- **Anti-goals de produto:** virar tracker estilo Jira; segundo cadastro de pessoa; chat em tempo real; misturar com Demandas/Atividades como substituto; liderança participando do fio staff; editar o texto original da atualização via comentários. + +### Esboço de fluxo (C) + +```text +[feed da atualização] + → card com texto + polaridade (+ urgente) + → Responsável: [selecionar staff] + → Thread: comentários em ordem + → Ação: Marcar resolvido / Reabrir (se preciso) +``` + +## Objetivo e aceite + +- Staff com poder de deliberação pode atribuir **um responsável** (usuário de campanha staff) a uma atualização. +- Na própria atualização existe **fio de discussão** (comentários em sequência) visível para quem já lê atualizações daquele município. +- Existe ação explícita **Resolvido** (e caminho claro para reabrir, se o gate confirmar). +- Atualização resolvida permanece legível no histórico; o estado aberto/resolvido é óbvio no card. +- Leader lockdown: liderança **não** vê nem participa deste fio. +- Depende do modelo unificado de **C87** (sem reintroduzir kinds/tipos de sinal). + +## Dados (intenção) + +- **Vou apresentar dados?** Sim, superfície neste item (lista/filtro opcional de “abertas com responsável”, se couber no appetite — senão só no card). +- **Decisões desbloqueadas:** + - Coordenação: “quem resolve este fato?” + - Responsável: “o que falta / o que já fiz?” (no fio) + - Coordenação: “podemos dar por encerrado?” +- **Forma:** _adiada_ — sem dashboard de tickets; restrição: não inventar KPI estadual a partir do fio. + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** domínio de `municipalityUpdate` (detalhe/feed/form), actions de campanha do município, padrão de feed de atualizações de **atividade** (comentário append-only), notificações se já houver gancho de criação. +- **Precedente a olhar:** `Activity` updates feed + append; C87 plano irmão; imutabilidade do corpo da atualização (C12). +- **Risco de acoplamento:** access por município (assessor só no portfólio); não criar “pessoa” fora de `campaignUser`/`Contact`; serialização de migrations com outros itens C. + +## Dependências + +- **Dura:** **C87** (modelo unificado de atualização). +- Suave: notificações push/in-app para o responsável (pode ficar fora se estourar appetite — ver questões). + +## Fora de escopo + +- Unificar com Demandas ou Atividades. +- Mentions @, anexos, rich text, reações. +- SLA, filas kanban, prioridade além do Urgente já em C87. +- Participação de liderança / apoiador no fio. +- Editar ou apagar o texto original da atualização (correção = nova atualização ou comentário no fio). + +## Rabbit holes de produto + +- **"Vira um ticket tracker."** Labels, epics, board. **Corte:** só responsável + fio + resolvido no card da atualização. +- **"Comentário edita o fato."** Mistura histórico. **Corte:** corpo da atualização imutável; fio é aparte. +- **"Qualquer um atribui."** **Corte no gate:** quem pode atribuir / resolver (recomendação abaixo). +- **"Notifica WhatsApp."** Canal externo. **Corte:** no máximo notificação interna já existente; Zap fora. + +## Questões em aberto (produto) + +- **Quem pode atribuir responsável e marcar resolvido?** **Opções:** A) só coordinator/candidate; B) qualquer staff que já pode criar atualização naquele município; C) autor + unrestricted. **Recomendação:** A para atribuir/resolver; B pode comentar. _(assumido)_ +- **Responsável pode ser qualquer staff ou só assessores do município?** **Opções:** A) staff do município (advisors + unrestricted); B) qualquer campaignUser staff. **Recomendação:** A — evita atribuir a quem não vê o território. _(assumido)_ +- **Reabrir depois de resolvido?** **Opções:** A) sim, ação explícita; B) não — nova atualização. **Recomendação:** A — deliberação real precisa de reabrir. _(assumido)_ +- **Notificar o responsável ao atribuir / ao comentar?** **Opções:** A) sim, via canal interno já existente; B) só badge no produto nesta fatia. **Recomendação:** A se o gancho for barato; senão B e item sucessor. _(assumido B nesta fatia se o appetite apertar)_ +- **Atualização sem responsável ainda pode ter fio e resolvido?** **Opções:** A) sim (resolvido = “já tratamos o fato”); B) responsável obrigatório para resolver. **Recomendação:** A — nem todo fato precisa de dono. _(assumido)_ + +## Referências + +- GitHub Issue: [#397](https://github.com/fsolla/teqo/issues/397) +- Canvas UI (gate): [/home/fsolla/.cursor/projects/home-fsolla-cursor-worktrees-teqo-hin1/canvases/plan-c88-ui-draft.canvas.tsx](/home/fsolla/.cursor/projects/home-fsolla-cursor-worktrees-teqo-hin1/canvases/plan-c88-ui-draft.canvas.tsx) +- Depende: [atualizacao-unificada-polaridade-urgente.md](atualizacao-unificada-polaridade-urgente.md) (C87) +- Precedente de feed: atualizações em Atividade; feed atual de município