style(OPS30): prettier no changelog pós-rebase

This commit is contained in:
Francisco Solla 2026-08-12 07:44:52 -03:00
parent 39e6e9405c
commit 1326d54413

View file

@ -51,7 +51,6 @@ Conteúdo movido do `AGENTS.md` em 2026-07-30 (fatiamento do paradigma de agente
**Recently resolved (2026-08-10):** **OPS30** (Issue #586) — hardening do e2e em dev contra o compile-frio do Next dev (a classe que faz `pnpm test:e2e` local acusar vermelho com `main` verde). **Prewarm completo no setup** (`setup.e2e.spec.ts`): lista GET 13→26 rotas (o audit por grep achou `/campanha/municipios/<slug>/editar` — o flake ERR_ABORTED de `:78` —, alvos de redirect invisíveis a grep de goto como `/campanha/demandas/[slug]`, rotas de wizard `acoes/*`, agenda/atividades/nova/contatos/atualizacoes/offline e os artefatos PWA `sw.js`/`manifest.webmanifest` que toda página busca no load) e POST ganhou `/campanha/municipios/next-steps`, `/campanha/home-search` (suggest do overlay FAB) e as rotas do chat Sollinha `/campanha/api/ai-chat`+`ai-transcribe` (montadas em toda página autenticada — 1º hit compila frio no meio da suíte e o reload aborta a navegação de um teste irmão). **Prewarm GET com retry-único** (`prewarmGet`): o próprio compile pode abortar a conexão do prewarm (socket hang up medido na lista original sob load ~50); asserção só no retry. Budget `test.slow()`→`setTimeout(420s)` (26 módulos × ~60s frios sob carga; CI quente em segundos). **Login resiliente** (`campaign.login`): retry-único do submit inteiro (re-fill+re-click) com grace-wait de 5s do destino exato antes do re-submit (guard de prefixo casava `/campanha/login` — corrigido); budget sozinho não recupera submit abortado. **Refactor mínimo do spec `campaignMunicipalities`** (evidência de execução): `:518` (B24) — botão de tendência só existe no estágio largo B158 e o locator pegava a cópia mobile escondida → `ensureWideMunicipalityList`+escopo container+`.filter(visible)`; re-clique pós-reload era pré-hydration (P3-C) e o trigger **toggles** (toPass com clique cego fecha o popover para sempre) → `networkidle` pós-reload + clique só com popover fechado; `:713` (demanda) — server action de criação compila fria no 1º POST (não prewarmável) → retry do submit em toPass; `:1063` (FAB suggest) — **root cause = paridade de seed**: o CI roda `db:seed:minimal` (pinna `priority:'alta'` em salvador-ze-1/camacari) e o suggest do coordinator é vazio sem isso → achado registrado para o OPS28 (worktrees provisionam DBs e2e sem o seed mínimo, em progresso); retry blur+focus do suggest em toPass como defesa do stream truncado. **P4-L fechado com evidência** (TECH-DEBT row 59): `campaignLeaderships` ×3 verde em dev a 2 workers (load 4–10) + ×1 `E2E_PROD=1`; TESTING.md caveat atualizado. Aceite: `campaignMunicipalities` **17/17 ×3 consecutivos em dev a 2 workers** (16:00–16:03, load 5–18) — antes: `:78` 3/4 vermelho e `:518` 1/2. Sem migration/access/Consent/UI. Intenção [`hardening-e2e-dev-compile-frio.md`](plans/hardening-e2e-dev-compile-frio.md); impl [`hardening-e2e-dev-compile-frio-impl.md`](plans/hardening-e2e-dev-compile-frio-impl.md).
**Recently resolved (2026-08-10):** **OPS34** (Issue #599) — o job `e2e` do CI (o mais longo da cascata, 435 s medidos no run 31412425553: ~67 s fixos + build 172 s + testes 196 s) roda agora **em 2 shards paralelos** (`--shard=N/2`, matrix `fail-fast: false`, build por shard — opção A da intenção validada pela medição: por shard ≈ 5–5,5 min; artefato de build compartilhado rejeitado porque os shards só começam após o build → wall maior). **Cadeia de projetos do Playwright (`setup → campaign → frontend → admin`) + prewarm do `setup` viraram dev-only:** `playwright.config.ts` ganhou `isProdMode = CI || E2E_PROD=1` (mesma condição do `webServer.command`, agora reusada) — em prod o projeto `setup` sai do array (arquivo não casado = não coletado) e as `dependencies` zeram (famílias em paralelo contra o build de produção, onde não há compile a preaquecer); dev intocado (provado: `--list` mostra `[setup]` só sem CI; smoke e2e dev rodou setup→campaignAuth). `ci-pr.yml`: o job `scope` emite `e2e_matrix`/`e2e_shards` via novo `e2eShardConfig(mode)` em `scripts/lib/test-affected-core.mjs` (fonte única, unit-pinada: full → `[1,2]`/2, selected/none → `[1]`/1 — pagar 2 builds por 3 specs é desperdício); `ci.yml` hardcodeia `[1,2]`/2 com comentário apontando o single-source. `PLAYWRIGHT_WORKERS: 2` explícito no env dos jobs e2e (aceite: explícito, default local intocado). Armadilha registrada nos workflows: flags do playwright vão **sem** o separador `--` — pnpm repassa o `--` literal ao playwright e a flag vira file pattern ("No tests found"). Specs intactas (o `setup` não foi removido — virou dev-only, já documentado como prewarm dev-only); sem migration/access/Consent/UI. **Medição pós-merge (main, run 31418206512):** job e2e 435 s → **326 s (shard 1) / 369 s (shard 2)** — shard 2 = fixo 68 s + build 176 s + testes 124 s (a fase de testes caiu de 196 s seriais para 124 s — metade da suite por runner + cadeia removida; o shard 2 ainda pagou retry da flake conhecida de `campaignMunicipalities`; shard 1: testes ~82 s); gate completo do pipeline (checks) ~7,5 → ~6,4 min. Build passou a dominar o shard — gatilho da intenção (opção B, artefato compartilhado) reavaliável quando os testes encolherem mais. Intenção [`ci-e2e-paralelizar-job.md`](plans/ci-e2e-paralelizar-job.md); impl [`ci-e2e-paralelizar-job-impl.md`](plans/ci-e2e-paralelizar-job-impl.md).
**Recently resolved (2026-08-10):** **OPS22** (Issue #562) — CI de `main` vermelho determinístico desde o merge do B188 (05:54): os 3 e2e da agenda mobile (`campaignAgendaMobile` :96/:242/:295) falhavam com todas as retries → deploy bloqueado. **Root cause (reproduzida no prod build local + error-contexts com o drawer aberto):** o login e2e roda em **viewport desktop** → o settle de B167 abre o chat (`open=true`) → o **efeito persist do B188** (status `ready` já nasce) grava `{open:true}` no `sessionStorage` → o spec muda para 390px na **mesma aba** → o **restore do B188** reabre o **drawer mobile sozinho** → o modal Radix **aria-hide + inert** a página e cobre o viewport (combobox fora da a11y tree no :242, swipe cai no drawer no :96, clique do seletor bloqueado no :295; teclado/:173 passam por não usarem hit-testing). **Defeito real de produto** (aba desktop → mobile na mesma aba faz o chat "saltar"), não só timing de teste. **Fix na origem:** `SollinhaChatSession` ganhou **`openBy: 'user' | 'settle'`** (opcional — sessão legada sem o campo = `'settle'`, fail-closed; sem bump de versão) e o provider agora distingue **intenção do usuário** (`setOpen`/`toggle` do context value marcam `userToggledOpenRef`; FAB/header/drawer já passam por eles) de **verdade de layout** (settle B167 usa o setter cru): o **restore espera o `measured`** (viewport real) e honra `open:true` em mobile **só quando `openBy==='user'`**; o persist grava `openBy` conforme a intenção. Todos os contratos B188/resize mantidos (reload restaura conversa; drawer aberto por usuário volta aberto; visita mobile nova fechada; crossing ao vivo B167 intocado). Testes: unit (round-trip/invalidez/legado de `openBy`) + **e2e pin OPS22** no spec B188 (login desktop → poll do persist `open:true` → viewport 390 → `/campanha/agenda` → sem dialog + botão do Sollinha visível); spec da agenda intacto (4/4 no prod build). Sem migration/access/Consent/schema. Intenção [`ci-e2e-agenda-mobile-regressao-b188.md`](plans/ci-e2e-agenda-mobile-regressao-b188.md); impl [`ci-e2e-agenda-mobile-regressao-b188-impl.md`](plans/ci-e2e-agenda-mobile-regressao-b188-impl.md).