4 KiB
OPS42: e2e dev — navegação RSC do login commita tarde e remonta o layout (interação silenciosamente perdida)
Status: registrado Atualizado em: 2026-08-11 Issue: #691 Priority: P3 Model: composer-2.5 Appetite: ~0,5 dia eng — um helper de "quiescência do router" no fixture
Intenção
Em dev mode (e2e local, compile a frio), a navegação RSC do login pode commitar
~1,8 s depois do goto('/campanha') do teste: o fixture resolve o
waitForURL no redirect otimista, o teste segue para goto + interação
imediata, e a payload RSC do redirect — ainda em voo — commit por cima,
remontando o subtree do layout (provider do chat novo, textarea novo com
defaultValue=''). A interação (fill + Enter) cai no textarea velho e é
silenciosamente perdida: input volta a '', o envio nunca dispara, o teste
estoura em toBeVisible. CI (prod mode) é imune — por isso main está verde.
Persona e fluxo
- Persona: agente rodando e2e local em dev mode com a máquina sob carga (worktrees paralelos compilando).
- Fluxo quebrado: login →
page.goto('/campanha')→'Olá! Eu sou o Sollinha'visível →fill+Enter→ nada acontece; o teste falha com o input vazio e "Enviar" disabled, aparentemente sem causa. - Fluxo desejado: o teste só interage depois que o router estabilizou (nenhuma framenav/navegação RSC pendente), ou a interação sobrevive à remontagem.
Objetivo e aceite
- Interagir com a página em dev mode nunca mais perde o fill/Enter para uma remontagem tardia do layout.
- Sem impacto em prod mode (CI) — o helper é dev-only ou inócuo em prod.
- Precedentes a seguir:
checkRadixWhenHydrated(fixture, retry até o estado certo) e o hardening OPS30 (login resiliente a compile frio).
Dados (intenção)
Dados: N/A — infraestrutura de e2e (fixture), sem servidor/banco.
Direção no codebase (hipótese)
- Área provável:
tests/e2e/fixtures/campaignE2EFixtures.ts— ologinresolve nowaitForURL(redirect otimista) antes do commit RSC; e/ou um helperwaitForRouterSettled(page)chamado apósgotonos journeys que interagem logo após o load (espera por uma janela de ~500 ms semframenavigated). - Evidência da sessão (B199, 2026-08-11): em dev mode sob carga, o teste
B188 "reload na mesma aba" falhou 5/5 com esse mecanismo:
FRAMENAV /campanha(sem request document) ~1,0–1,9 s após oHELLO, textareata2criada comdefaultValue=''no instante do fill, zero writes de.valueno textarea (React nunca commitou o valor digitado — o estado do useChat resetou na remontagem do provider). - Risco: esperar demais (networkidle nunca chega em dev com HMR ativo) — a janela de quiescência deve ser baseada em ausência de framenav, não em network idle.
Dependências
- #586 (OPS30 — hardening e2e dev: login resiliente a compile frio) — mesma
família de robustez; destrava sozinha quando o pai flipar
done.
Fora de escopo
- Consertar o comportamento do Next dev (a remontagem em si é da framework).
- O flake de
googleCalendarSyncsob carga (#686 já registra). - Mudanças em prod mode/CI (imunes por construção).
Rabbit holes de produto
- Espera longa demais por teste: multiplicar o tempo de cada spec em dev. Corte: o helper só espera a quiescência (janela sem framenav), não network idle; e só é chamado onde o journey interage imediatamente após o load.
- Camuflar falha real: esperar quiescência pode mascarar um problema de app. Corte: o helper tem timeout curto (fallback) e a falha original do app continua aparecendo no assertion seguinte.
Questões em aberto (produto)
- Nenhuma — é infraestrutura de teste.
Referências
- Evidência completa da sessão B199 (mensagens de debug
TMPDEBUG2–8no worktree B199, 2026-08-11):NAVREQ/FRAMENAV/LOADtimestamps,SET defaultValue ta2="", setter devaluenunca chamado. tests/e2e/campaignSollinhaContext.e2e.spec.ts(B188 "reload na mesma aba" é o teste que flakeia),tests/e2e/fixtures/campaignE2EFixtures.ts.