E2E flake — C113 (feed vivo) falha sob 4 workers: feed global + not.toContain colide com atividade de worker paralelo às 11:00 #122

Closed
opened 2026-08-20 01:39:19 +00:00 by fsolla · 4 comments
Owner
id depends serializes priority model
E2E-FLAKE-C113
P2 cursor-grok-4.5-high

Débito registrado no fechamento da #113 (capture-review-debts autônomo, 2026-08-20) após o verify do deploy falhar 1x no e2e full.

Sintoma

tests/e2e/campaignAgendaFeed.e2e.spec.ts:119 (C113 "serves a live feed") falha (3 tentativas) no e2e full com 4 workers, mas passa no run isolado/retry. Erro: expect(received).not.toContain("DTSTART:20260819T140000Z") — o feed retornado contém o DTSTART 14:00Z de uma atividade "Comício na agenda--4" (título do fixture de OUTRO spec, ex. campaignActivity) criada por um worker paralelo às 11:00 de hoje — a mesma hora do startAtB original da C113 (que é editado para 12:00). O feed vivo é global (todas as atividades confirmadas da campanha), a DB de e2e é compartilhada entre os 4 workers → o assert not.toContain colide com atividades alheias no mesmo dia/horário.

Causa

  • Feed /campanha/agenda/ical/<slug> sem escopo por município/autor → qualquer teste que crie atividade "confirmado" às 11:00 (14:00Z) do dia atual polui a C113.
  • Retry não ajuda porque os outros workers continuam criando a mesma atividade no mesmo horário.

Correção candidata (a decidir no item)

  • A (provável): escopar o feed de teste — a C113 cria o feed com um escopo que a isole (ex. filtrar por município e usar município próprio das fixtures; ou filtrar por createdBy), de modo que atividades de outros workers não entrem.
  • B: a C113 verificar só as atividades da própria spec por UID (mudar not.toContain(horário) para not.toContain(UID) da atividade B — UIDs são únicos por spec).
  • C: reduzir workers no full — perde o propósito do verify.

Nota: o verify do deploy é a suíte full com 4 workers; flake como esse bloqueia dispatches de forma probabilística (1 falha em 2 runs na mesma noite).

Escopo

  • tests/e2e/campaignAgendaFeed.e2e.spec.ts (+ helpers de fixture, se preciso).
  • Validar: e2e full verde em 2 runs consecutivos (ou o spec em paralelo repetido).
  • Sem migration/schema; sem UI.
--- id: E2E-FLAKE-C113 depends: [] serializes: [] priority: P2 model: cursor-grok-4.5-high --- Débito registrado no fechamento da #113 (capture-review-debts autônomo, 2026-08-20) após o verify do deploy falhar 1x no e2e full. ## Sintoma `tests/e2e/campaignAgendaFeed.e2e.spec.ts:119` (C113 "serves a live feed") falha (3 tentativas) no **e2e full com 4 workers**, mas passa no run isolado/retry. Erro: `expect(received).not.toContain("DTSTART:20260819T140000Z")` — o feed retornado contém o DTSTART 14:00Z de uma atividade **"Comício na agenda-<uuid>-4"** (título do fixture de OUTRO spec, ex. campaignActivity) criada por um worker paralelo às 11:00 de hoje — a mesma hora do `startAtB` original da C113 (que é editado para 12:00). O feed vivo é **global** (todas as atividades confirmadas da campanha), a DB de e2e é compartilhada entre os 4 workers → o assert `not.toContain` colide com atividades alheias no mesmo dia/horário. ## Causa - Feed `/campanha/agenda/ical/<slug>` sem escopo por município/autor → qualquer teste que crie atividade "confirmado" às 11:00 (14:00Z) do dia atual polui a C113. - Retry não ajuda porque os outros workers continuam criando a mesma atividade no mesmo horário. ## Correção candidata (a decidir no item) - **A (provável): escopar o feed de teste** — a C113 cria o feed com um escopo que a isole (ex. filtrar por município e usar município próprio das fixtures; ou filtrar por `createdBy`), de modo que atividades de outros workers não entrem. - B: a C113 verificar só as atividades da própria spec por UID (mudar `not.toContain(horário)` para `not.toContain(UID)` da atividade B — UIDs são únicos por spec). - C: reduzir workers no full — perde o propósito do verify. Nota: o verify do deploy é a suíte full com 4 workers; flake como esse bloqueia dispatches de forma probabilística (1 falha em 2 runs na mesma noite). ## Escopo - `tests/e2e/campaignAgendaFeed.e2e.spec.ts` (+ helpers de fixture, se preciso). - Validar: e2e full verde em 2 runs consecutivos (ou o spec em paralelo repetido). - Sem migration/schema; sem UI.
fsolla added the
kind:chore
prio:P2
labels 2026-08-20 01:39:24 +00:00
Author
Owner

Atualização após o 2º verify falho (run 32321780616, mesmo SHA 6cf5ea58): desta vez o C113 passou (2.3s) e falharam campaignLeaderships B34 (chips, toHaveAttribute link 'Aurelino Leal' não encontrado, 3 tentativas), B32 (auto-save, 1.0m — falhou também no 1º run) e campaignMunicipalities:382 (B176, filtros, 1.0m). Padrão comum aos 2 runs: timeouts de 60–90s em specs de UI de listas (lideranças/municípios) sob 4 workers, com o webServer processando PATCHes devagar. Nenhuma regressão de código: o verify do mesmo fluxo passou full às 01:13 com SHA 02c1e4f3 (mesmo runtime do 6cf5ea58 — o delta é docs/CI). Re-dispatch é o caminho do runbook; se o flake persistir em runs seguidos, vale investigar carga do runner hosted (2 vCPU) vs. 4 workers.

Atualização após o 2º verify falho (run 32321780616, mesmo SHA 6cf5ea58): desta vez o C113 **passou** (2.3s) e falharam `campaignLeaderships` B34 (chips, `toHaveAttribute` link 'Aurelino Leal' não encontrado, 3 tentativas), B32 (auto-save, 1.0m — **falhou também no 1º run**) e `campaignMunicipalities:382` (B176, filtros, 1.0m). Padrão comum aos 2 runs: **timeouts de 60–90s em specs de UI de listas (lideranças/municípios)** sob 4 workers, com o webServer processando PATCHes devagar. Nenhuma regressão de código: o verify do mesmo fluxo passou full às 01:13 com SHA 02c1e4f3 (mesmo runtime do 6cf5ea58 — o delta é docs/CI). Re-dispatch é o caminho do runbook; se o flake persistir em runs seguidos, vale investigar carga do runner hosted (2 vCPU) vs. 4 workers.
Author
Owner

3º verify falho (run 32330313520, SHA aeb33eb4 — agora inclui feat(S8)/feat(S9)/refactor(S11), runtime real): specs campaignSavedFilters:26 (strict mode violation — getByRole('link', { name: 'Municípios' }) resolveu para 2 elementos, 3x), admin:138 (login.ok() === false no login do admin, 1.3s), campaignContacts:171 (dialog 'Novo contato' visível quando esperava hidden, 2x), campaignMunicipalities:638/859 (2x/1x). Espalhamento maior do que timing puro: 3 runs falhos em 4, specs diferentes, com 1 full verde no meio (01:13, SHA 02c1e4f3). Hipóteses para o item: (a) carga do runner hosted (2 vCPU) vs. 4 workers + webServer Next + Payload + Postgres; (b) o spec S11 novo (admin:138 Instagram sync) pode ter ficado sensível a estado do global social-feed-settings no seed; (c) strict-mode do sidebar pode ser estado induzido por spec anterior (filtros salvos deixam o menu expandido). Proposta: rodar o full com 2 workers como teste (se estabiliza, é CPU; senão, são os specs), ou investigar o S11 antes do próximo deploy.

3º verify falho (run 32330313520, SHA aeb33eb4 — agora inclui feat(S8)/feat(S9)/refactor(S11), runtime real): specs `campaignSavedFilters:26` (strict mode violation — `getByRole('link', { name: 'Municípios' })` resolveu para 2 elementos, 3x), `admin:138` (`login.ok() === false` no login do admin, 1.3s), `campaignContacts:171` (dialog 'Novo contato' visível quando esperava hidden, 2x), `campaignMunicipalities:638/859` (2x/1x). Espalhamento maior do que timing puro: 3 runs falhos em 4, specs diferentes, com 1 full verde no meio (01:13, SHA 02c1e4f3). Hipóteses para o item: (a) carga do runner hosted (2 vCPU) vs. 4 workers + webServer Next + Payload + Postgres; (b) o spec S11 novo (`admin:138` Instagram sync) pode ter ficado sensível a estado do global social-feed-settings no seed; (c) strict-mode do sidebar pode ser estado induzido por spec anterior (filtros salvos deixam o menu expandido). Proposta: rodar o full com 2 workers como teste (se estabiliza, é CPU; senão, são os specs), ou investigar o S11 antes do próximo deploy.
Author
Owner

Síntese após o 4º verify falho (run 32332230751): as falhas têm causas mapeadas e a suíte full sob 4 workers está probabilisticamente vermelha (~20% de sucesso em 5 runs na noite).

  • campaignMunicipalities:638 — falhou nos runs 1, 3 e 4 (recorrente).
  • campaignSavedFilters:26 — strict mode violation: getByRole('link', { name: 'Municípios' }) resolve 2 elementos (sidebar data-sidebar="menu-button" + bottom nav mobile text-[10px]) quando o drawer do sidebar está aberto + bottom nav visível; o locator é sem escopo e o próprio spec admite flake conhecido com >1 worker no comentário do arquivo.
  • admin:138 — login.ok() === false: colisão do login do usuário de teste em paralelo — causa conhecida na Issue #116 (unificar logins com advisory lock).
  • campaignContacts:171, campaignDemandVisibility, campaignPeople (C117/C125), campaignSollinhaContext, campaignMunicipalities:1510 — timeouts/estados com retry resolvendo em parte.

Recomendação para destravar o deploy: resolver #116 (advisory lock do login) + escopar o locator do savedFilters antes do próximo dispatch, OU rodar o full com 2 workers como medida temporária. O runner self-hosted em si está validado — o job deploy pegou o runner em todos os 5 runs e executou o deploy-homeserver.sh com os guards corretos (stale-run idempotente); o que falta é apenas 1 verify verde.

Síntese após o 4º verify falho (run 32332230751): as falhas têm causas mapeadas e a suíte full sob 4 workers está probabilisticamente vermelha (~20% de sucesso em 5 runs na noite). - `campaignMunicipalities:638` — falhou nos runs 1, 3 e 4 (recorrente). - `campaignSavedFilters:26` — strict mode violation: `getByRole('link', { name: 'Municípios' })` resolve 2 elementos (sidebar `data-sidebar="menu-button"` + bottom nav mobile `text-[10px]`) quando o drawer do sidebar está aberto + bottom nav visível; o locator é sem escopo e o próprio spec admite flake conhecido com >1 worker no comentário do arquivo. - `admin:138` — `login.ok() === false`: colisão do login do usuário de teste em paralelo — causa conhecida na Issue #116 (unificar logins com advisory lock). - `campaignContacts:171`, `campaignDemandVisibility`, `campaignPeople` (C117/C125), `campaignSollinhaContext`, `campaignMunicipalities:1510` — timeouts/estados com retry resolvendo em parte. Recomendação para destravar o deploy: resolver #116 (advisory lock do login) + escopar o locator do savedFilters antes do próximo dispatch, OU rodar o full com 2 workers como medida temporária. O runner self-hosted em si está validado — o job deploy pegou o runner em todos os 5 runs e executou o `deploy-homeserver.sh` com os guards corretos (stale-run idempotente); o que falta é apenas 1 verify verde.
Author
Owner

Tracker migrado para o GitHub — continue em #gh763 (github.com/fsolla/teqo/issues/763). Esta Issue Forgejo está fechada.

Tracker migrado para o GitHub — continue em #gh763 (github.com/fsolla/teqo/issues/763). Esta Issue Forgejo está fechada.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: fsolla/teqo#122
No description provided.