From e72c144eef070e318419516e260416bfea2a6a66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Ign=C3=A1cio=20Fontoura=20Solla?= Date: Sun, 2 Aug 2026 18:32:51 -0300 Subject: [PATCH 1/2] =?UTF-8?q?docs(plans):=20inten=C3=A7=C3=A3o=20B135=20?= =?UTF-8?q?=E2=80=94=20Voltar=20=3D=20passo=20anterior=20na=20cadeia=20do?= =?UTF-8?q?=20wizard?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Related #289 --- .../wizard-voltar-passo-anterior-cadeia.md | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 docs/plans/wizard-voltar-passo-anterior-cadeia.md diff --git a/docs/plans/wizard-voltar-passo-anterior-cadeia.md b/docs/plans/wizard-voltar-passo-anterior-cadeia.md new file mode 100644 index 00000000..c66c2744 --- /dev/null +++ b/docs/plans/wizard-voltar-passo-anterior-cadeia.md @@ -0,0 +1,94 @@ +# Wizard — Voltar = passo imediatamente anterior (também na cadeia) + +Status: registrado +Atualizado em: 2026-08-02 +Issue: #289 +Priority: P1 +Model: composer-2.5 +Impeccable: B — chrome/navegação nos passos `/campanha/acoes/*` (Voltar + back do SO) +Appetite: ~0,5–1 dia eng; um contrato de “passo anterior” coerente na cadeia B98; sem migration +Responsável: — + +## Intenção + +Depois de Ajustar votos → município → salvar votos, o fluxo encadeia em Mudar tendência. Ao tocar **Voltar** (ou o back do aparelho) nessa tela, a pessoa cai de novo na **seleção de município** — como se o ritual tivesse recomeçado. O esperado é voltar **um** passo: a tela de ajustar votos **do mesmo município**, sem reescolher território. + +Isso quebra Continuity no meio do ritual mais comum do Início (A1). A cadeia B98 avançou bem; o Voltar entre elos ainda mente. + +## Persona e fluxo + +- **Persona / contexto:** CG/assessor no polegar, no meio do ritual “Ajustar votos”; acabou de gravar os números e caiu em tendência; percebeu que quer revisar o ajuste (ou só desfazer o avanço). +- **Job principal:** Voltar **um** passo previsível — o ajuste anterior no mesmo município — nunca a busca de município. +- **Fluxo desejado:** Início → Ajustar votos → município → votos → tendência → **Voltar** → votos (mesmo município) → Voltar → busca de município → Voltar/X → origem/Início. +- **Anti-goals de produto:** “Voltar” = dismiss do ritual; forçar reescolher município entre elos; second-guess do Pular/X; inventar um tutorial de histórico do browser. + +### Esboço de fluxo (B/C/D) + +```text +Início → Ajustar votos + → [busca município] + → [ajustar votos] ← gravou + → [mudar tendência] ← elo B98 + Voltar / Android back + → [ajustar votos] ← mesmo município (NÃO a busca) + Voltar + → [busca município] +``` + +Mesma regra nos outros elos: do 1º passo de um subfluxo encadeado, Voltar = último passo útil do elo anterior (mesmo município), não a busca daquele slug. + +## Objetivo e aceite + +- No caminho Ajustar votos → tendência, **Voltar** (header mobile) e **back do SO/browser** levam ao passo de **ajustar votos** do mesmo município — não à seleção de município. +- Em fluxo **standalone** (entrou só em Mudar tendência), Voltar no 1º passo pós-município continua indo à **busca** desse fluxo (não inventa elo inexistente). +- Dentro de um subfluxo (ex. nota de tendência → escolha de tendência), Voltar permanece o passo interno anterior. +- Header Voltar e Android/browser back têm a **mesma** semântica neste fluxo. +- O contrato de “passo imediatamente anterior” fica **reutilizável** pelos wizards `/campanha/acoes/*` que ainda são stub (hoje: **Registrar pedido** / A5), sem implementar esses fluxos aqui. +- Guardrails: staff only; sem migration/Consent; leader lockdown intacto; `returnPath` (B110) não é corrompido pelo Voltar entre elos. + +## Dados (intenção) + +- **Vou apresentar dados?** Não +- **Decisões desbloqueadas:** staff decide se revisa o ajuste anterior ou segue o ritual — sem perder o município já escolhido. +- **Forma:** *adiada ao plano de implementação* + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** `/campanha/acoes/*`; chrome `CampaignWizardShell` / top bar; helpers de cadeia e hrefs em `src/lib/` (`wizardActionChain`, rotas de ação); passos de tendência/votos/sinal/liderança sob `components/campaign/`. +- **Precedente a olhar:** B98 (`encadear-ajustes-wizard.md`, #106); B110 retorno `from`; chrome de Voltar já no shell/top bar. +- **Risco de acoplamento:** avanços da cadeia hoje podem apagar o passo anterior do histórico do browser — Voltar “cego” ≠ passo lógico; não confundir Pular/X com Voltar. Ao fechar Continuity, preferir um dono único de “passo anterior” que A5 (registrar-pedido) possa plugar depois — sem construir A5 neste item. + +## Dependências + +- Soft: B98 ✓ (cadeia). +- Duras: nenhuma aberta. + +## Fora de escopo + +- **Implementar Registrar pedido (A5)** — ainda stub após município; **não** é desta task. Continuidade: quando A5 nascer, usa a mesma regra de Voltar (passo imediatamente anterior / Continuity), sem inventar navegação paralela. +- Incluir demanda na matriz de encadeamento B98 (já rejeitado na v1 da cadeia). +- Reordenar a matriz de encadeamento B98. +- Mudar copy de Pular / quando X aparece (B96/B104). +- Redesign visual de tiles/tendência (B113). +- Persistência de rascunho mid-Zap. +- Restaurar entregas revertidas de outras issues de navegação — fora; este item só o aceite de “passo imediatamente anterior”. + +## Rabbit holes de produto + +- **“Já que mexo em Voltar, refaço o history inteiro do app.”** Explode appetite. **Corte neste item:** só passos `/campanha/acoes` e a cadeia B98. +- **“Voltar deve desfazer o save do elo anterior.”** Não pedido. **Corte:** Voltar navega; dados já gravados ficam até novo save. +- **“Já que Continuity, implemento A5 neste PR.”** Fora. **Corte:** só deixar o contrato plugável; wizard de pedido é item próprio. + +## Questões em aberto (produto) + +- **Escopo dos elos?** **Fechado:** todos os elos da matriz B98 (não só votos→tendência). Registrar pedido fora da implementação; Continuity preparada para quando A5 existir. +- **Voltar para um elo já salvo:** **Opções:** A) reabre o passo editável; novo Salvar atualiza e segue a cadeia de novo | B) Voltar só “olha” read-only. **Recomendação:** **A** — mesmo formulário de sempre; Continuity. _(assumido)_ +- **Paridade Android/browser?** **Opções:** A) header e SO iguais | B) só corrigir o botão Voltar. **Recomendação:** **A**. _(assumido)_ + +## Referências + +- GitHub Issue #289 +- Relato de produto 2026-08-02 (Ajustar votos → tendência → Voltar → busca município) +- Issue B98 #106 · B110 #149 · UX-1 A5 em `fluxos-acao-primeiro-inicio.md` (stub hoje) +- `docs/plans/encadear-ajustes-wizard.md` · `docs/plans/fluxos-acao-primeiro-inicio.md` +- Rotas `/campanha/acoes/atualizar-votos`, `/campanha/acoes/mudar-tendencia` (e demais elos B98); `registrar-pedido` só como consumidor futuro From d92ef9424fbdb22448af36cdc2d543657aa827b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Ign=C3=A1cio=20Fontoura=20Solla?= Date: Sun, 2 Aug 2026 18:34:31 -0300 Subject: [PATCH 2/2] docs(plans): format B135 intention plan Related #289 --- docs/plans/wizard-voltar-passo-anterior-cadeia.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/plans/wizard-voltar-passo-anterior-cadeia.md b/docs/plans/wizard-voltar-passo-anterior-cadeia.md index c66c2744..b5961851 100644 --- a/docs/plans/wizard-voltar-passo-anterior-cadeia.md +++ b/docs/plans/wizard-voltar-passo-anterior-cadeia.md @@ -50,7 +50,7 @@ Mesma regra nos outros elos: do 1º passo de um subfluxo encadeado, Voltar = úl - **Vou apresentar dados?** Não - **Decisões desbloqueadas:** staff decide se revisa o ajuste anterior ou segue o ritual — sem perder o município já escolhido. -- **Forma:** *adiada ao plano de implementação* +- **Forma:** _adiada ao plano de implementação_ ## Direção no codebase (hipótese)