fix(OPS62-followup): elimina flake do municipalitiesWithoutUpdateTool — fixture com relógio ancorado #89
Loading…
Reference in a new issue
No description provided.
Delete branch "OPS62-followup-ci-flake-do-municipalitieswithoutupdatetool-u"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #81
OPS62-FOLLOWUP — flake do
municipalitiesWithoutUpdateTool.unit.spec.tseliminado pela raiz (2 ocorrências 2026-08-18: gate local 19:22 + CI run 779 23:53).Causa raiz (reproduzida — refuta a hipótese da Issue de locale/ICU): o bug era do fixture do teste, não do ambiente nem do sort de produção.
daysAgo()chamavaDate.now()por chamada (spec); as duas construçõesdaysAgo(40)deBeta/Alphapodiam cair em milissegundos diferentes sob carga (GC/preempção do fork do vitest em máquina compartilhada), deixando o timestamp deAlphaestritamente mais novo → emsortStale(src/utilities/ai/tools/getMunicipalitiesWithoutUpdate.ts) o sort por timestamp vencia o tie-break por nome → o teste recebia[Beta, Alpha]no lugar de[Alpha, Beta](só o par trocado, resto correto — o sort atuou, sobre timestamps acidentalmente desiguais).Repro mecânica (sort de produção verbatim + fixture,
node /tmp/opencode/ops62-followup-repro.mjs— não commita): fixture atual 0.08% de falhas em 200k runs sem pausa e 100% com pausa de 1 ms injetada (amostra["Mike","Zulu","Beta","Alpha","Gama"]— o diff observado); fixture ancorado: 0 falhas em 2000 runs sob a mesma pausa.Fix (test-only; nada em produção — o sort real é determinístico sobre timestamps fixos do DB):
fixtureNowMs = Date.now()no load do módulo (padrão já usado porprioritiesTool.unit.spec.ts:12), com comentário explicando a classe de flake;const stale40 = daysAgo(40)compartilhado porBeta/Alpha) — a igualdade vira estrutural, imune até a uma regressão da âncora;prioritiesTool(âncora no load) esuggestionCatalog(nowfixo) já seguros; nenhum outro spec combinaDate.now()por chamada com assunção de igualdade.Verificação: spec 30/30 runs; unit full 249 arquivos/2405 testes; int 89/791; tsc/lint/format/
check:cyclesverdes (knip = limitação P3 pré-existente). Changelog:docs/changelog/2026-08-19-ops62-followup.md. Impl plan:docs/plans/ops62-followup-ci-flake-fixture-timestamps-impl.md. /simplify: 3 reviewers aprovaram (1 ajuste aplicado: hoist; 1 processo aplicado: fase de changelog no plano); débito de review restante descartado (dependência do stable sort do V8 é garantida por spec, não é risco).7c73b0c536to39fb3b47f0