teqo/docs/plans/wizard-header-x-vs-pular.md
Cursor Agent 746030d253
docs: registra OPS11 + B95–B99 (#102–#107) pós-gate
Matriz B98 confirmada (cadeia completa nos 4 entries). Cabeçalhos
dos planos com Issue # e status registrado.
2026-08-01 10:48:04 +00:00

6.5 KiB
Raw Permalink Blame History

Header do wizard — X na config principal, “Pular” só nas encadeadas

Status: registrado Atualizado em: 2026-08-01 Issue: #104 Priority: P1 Model: composer-2.5 Impeccable: B — chrome direito do CampaignMobileTopBar / prop skip do shell Appetite: ~0,5–1d eng; alinhar resolvers de skip (tendência + parity sinal/liderança); sem migration Responsável: —

Design (Impeccable)

Âncoras: PRODUCT.md / DESIGN.md · B75 header Mandate Red · tema campaign.

Na implementação: craft compacto → critique → polish.

Brief compacto:

  • Persona: CG/assessor no meio do ritual; acabou de escolher o município.
  • Job principal: sair da ação sem executar a config principal = X; pular um ajuste opcional depois da principal = “Pular …”.
  • Estratégia de cor: inalterada (ghost no header vermelho).
  • Edit where you see: não — chrome.
  • Anti-goals: X e Pular juntos; “Pular” quando ainda não houve commit da ação disparada; mudar copy do fluxo no centro do header.

Wireframe (texto)

Ação disparada = Mudar tendência (standalone)
┌─ header ────────────────────────────────────────────┐
│ [Voltar?]   Mudar tendência · Cairu              [X]│  ← X (ainda sem salvar tendência)
└─────────────────────────────────────────────────────┘

Depois de Ajustar votos (principal OK) → encadeada tendência
┌─ header ────────────────────────────────────────────┐
│ [Voltar]    Mudar tendência · Cairu     [Pular … →] │  ← Pular (votos já gravados)
└─────────────────────────────────────────────────────┘

Dados → decisão → apresentação

Dados: N/A — chrome de fluxo.

Contexto

B75 ✓ definiu: slot direito = X (dismissHref) exceto quando skip está setado → aí vira “Pular <fluxo>”.

Hoje:

Fluxo Skip quando? Comportamento
Sinal entryAction ≠ register-signal Correto (standalone = X)
Liderança showLeadershipWizardSkip(entryAction) Alinhado ao sinal
Tendência resolveWizardTrendSkip() sempre Errado — standalone mostra “Pular mudança de tendência →”

Pedido de produto (2026-08-01): na primeira configuração da ação disparada (após município), o direito é X (sair sem executar a config principal). Configurações encadeadas (após a principal concluída) recebem “Pular”. Vale para todos os fluxos até a principal fechar.

Objetivos

  • resolveWizardTrendSkip(entryAction) espelha o sinal: só retorna skip quando a tendência é encadeada (entryAction presente e ≠ change-trend); standalone → undefined → header mostra X.
  • Auditar votos / demanda / stubs: main config sem skip até B98 passar entryAction nas encadeadas.
  • Unit: tendência standalone = sem skip; com entryAction: 'update-votes' = skip label + href.
  • Guardrails: sem migration; dismiss continua Início; não inventar segundo botão.

Decisões travadas

  • Regra canônica: skip iff o passo atual é subfluxo encadeado (origem ≠ ação dona do passo). Fonte: produto 2026-08-01 + B75 + precedente B63 sinal. Rejeitado: skip sempre na tendência (B64 as-written — supersedido); X+Pular juntos.
  • Corrigir tendência agora; wiring de cadeia completa = B98. Este item só alinha o chrome quando entryAction já existe (sinal/liderança/tendência embutidos). Rejeitado: implementar toda a matriz de encadeamento aqui (explode appetite).
  • Label de skip permanece específica do subfluxo (“Pular mudança de tendência →”, etc.). Rejeitado: “Pular” genérico sem nome (B75 pede nome do fluxo).
  • i18n: entryAction, resolveWizardTrendSkip; copy existente.

Questões em aberto

  • Href do skip encadeado: Início vs próximo da cadeia? Opções: A Início (hoje) | B próximo passo / fim da cadeia (B98). Recomendação: A neste item; B98 redefine o destino do Pular quando houver fila. (assumido)

Abordagem proposta

flowchart TD
  Step["Wizard*Step"] --> Resolve["resolve*Skip(entryAction)"]
  Resolve -->|undefined| Shell["skip omitido"]
  Shell --> Bar["TopBar → X dismissHref"]
  Resolve -->|skip| Shell2["skip label+href"]
  Shell2 --> Bar2["TopBar → Pular"]

Componentes:

  • src/lib/politicalTrendWizardUi.ts: resolveWizardTrendSkip(entryAction?) no padrão de resolveWizardSignalSkip; shouldShowWizardTrendSkip.
  • WizardTrendChoiceStep / WizardTrendNoteStep: passar entryAction ao resolver; trailingAction só se skip.
  • Parity check em wizardSignalUi / leadership skip helpers (já ok) — pin unit compartilhado se extrair predicado isChainedWizardStep(entry, owner) com 3º call site; senão duplicar o predicado de uma linha.
  • Migration: Sem migration.

Dependências

  • Soft: B75 ✓, B63/B64/B70. Dura para ver Pular “de verdade” após votos: B98.
  • Não bloqueia B97 (fechar no Salvar).

Não escopo

  • Orquestrar cadeia de passos → B98.
  • Fechar wizard no Salvar da tendência → B97.
  • Skip no desktop no header vermelho (já adiado em B75).

Rabbit holes

  • State machine global de “fase principal vs encadeada”. Mitigação: entryAction query já é o sinal; B98 só popula.
  • Renomear todos os labels de Pular. Mitigação: fora.

Adiado com gatilho

  • Destino do Pular = próximo da fila. Revisitar em B98.

Referências

  • src/lib/politicalTrendWizardUi.ts · src/lib/wizardSignalUi.ts
  • src/components/campaign/municipality/WizardTrendChoiceStep.tsx / WizardTrendNoteStep.tsx
  • src/components/campaign/shell/CampaignMobileTopBar.tsx
  • header-mobile-wizard-campanha.md (B75) · wizard-mudar-tendencia.md (B64 — skip sempre, supersedido aqui)
  • PRODUCT.md / DESIGN.md

Qualidade de decisão: 5/5