Repository navigation
feat(quality): destrava R1 — medição de redundância de testes (disableBail) - #4322
Conversation
Estende stryker.conf.json com disableBail:true (killedBy lista TODOS os killers, não só o primeiro) + incremental:false (medição limpa). One-off, não toca o nightly — só roda via mutation-redundancy.yml.
mutation-redundancy.yml (workflow_dispatch): roda os 6 leaf-batches combo+chatCore do nightly com o override disableBail e sobe os reports. Batches granulares (d/e/f/ g/h/i) em vez de 2 mega-batches: disableBail é mais caro e Stryker só grava o report se COMPLETAR, então cada batch cabe nos 300min. zizmor 139->145: +3 drift de base + 3 do workflow (@vn, convenção do repo). Ver nota.
Reusa aggregateRadiography (DRY) em vez de um script novo: redundancyCandidates() retorna 🔴 empty ∪ 🟠 redundant (zero kills únicos) = candidatos a prune. Sob disableBail o killedBy é completo, então 🟠 redundant fica ACURADO. CLI --candidates emite a lista com o aviso do gate humano (excluir segurança/contrato/repro).
|
Warning You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again! |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Correção: o run de medição é merge-gated (não dispara agora)Tentei Consequência: o run de ~3h (Task 3.4) só roda depois que este workflow chegar a um branch disparável — ou seja, após o ciclo v3.8.30 → Mitigação — a ferramenta já está provada sem o run:
Então este PR pode mergear como tooling; a medição + o gate humano ficam como follow-up assim que o workflow estiver disparável. Quando rodar: |
…il (cheaper-inference#4322) * feat(quality): config stryker disableBail para medir redundância (R1) Estende stryker.conf.json com disableBail:true (killedBy lista TODOS os killers, não só o primeiro) + incremental:false (medição limpa). One-off, não toca o nightly — só roda via mutation-redundancy.yml. * feat(quality): workflow on-demand de mutação disableBail (R1) mutation-redundancy.yml (workflow_dispatch): roda os 6 leaf-batches combo+chatCore do nightly com o override disableBail e sobe os reports. Batches granulares (d/e/f/ g/h/i) em vez de 2 mega-batches: disableBail é mais caro e Stryker só grava o report se COMPLETAR, então cada batch cabe nos 300min. zizmor 139->145: +3 drift de base + 3 do workflow (@vn, convenção do repo). Ver nota. * feat(quality): mutation-radiography --candidates (lista de prune R1) Reusa aggregateRadiography (DRY) em vez de um script novo: redundancyCandidates() retorna 🔴 empty ∪ 🟠 redundant (zero kills únicos) = candidatos a prune. Sob disableBail o killedBy é completo, então 🟠 redundant fica ACURADO. CLI --candidates emite a lista com o aviso do gate humano (excluir segurança/contrato/repro).
Contexto
Destrava o R1 (prune de testes redundantes) do programa Quality Gate v2. O nightly de mutação baila no 1º kill, então
killedBylista só o primeiro killer —🟠 redundantfica subestimado e🟢 uniquesuperestimado (caveat documentado emmutation-radiography.mjs). SemdisableBailnão dá para afirmar redundância real.O que entrega
stryker.disablebail.json— override one-off (extendsa base +disableBail:true+incremental:false). Não toca o nightly..github/workflows/mutation-redundancy.yml—workflow_dispatchque roda os 6 leaf-batches combo+chatCore (d/e/f/g/h/i, espelhando o nightly) com o override e sobe osmutation.json.mutation-radiography.mjs --candidates— em vez de um script novo (que duplicaria a lógica e, no rascunho do plano, assumia o schema ERRADO detestFiles), reusaaggregateRadiography(DRY):redundancyCandidates()retorna🔴 empty ∪ 🟠 redundant(zero kills únicos). SobdisableBailokilledByé completo →🟠 redundantfica acurado. TDD: +1 teste (6/6 na suíte da radiography).Decisão de design (trust-but-verify)
O plano pedia um
check-test-redundancy.mjsnovo comtestFilesmapeado como{id:{name}}. O schema REAL do Stryker é{filePath:{tests:[{id,name}]}}— omutation-radiography.mjsjá o resolve corretamente e já classificaredundant/unique/empty. Escrever o script novo duplicaria a lógica e o teste passaria fake-green contra o schema errado. Por isso estendi a radiography.mutation-redundancy.ymlnesta branch (vou disparar agora; ~3h cold, 6 batches paralelos — risco: o batchd~197min sob bail pode estourar 300min sob disableBail e não gravar report; os outros 5 dão dado mesmo assim).gh run download <id> --pattern "mutation-nobail-*"→node scripts/quality/mutation-radiography.mjs --candidates mutation-nobail-*/mutation.json.*-repro*/*-regression*) e apresentar ao owner.check:test-discoverynão regridem.Este PR entrega só a ferramenta de medição; o prune é um follow-up gated.
Validação local
mutation-radiography.test.ts→ 6/6 (incl. o novoredundancyCandidates).node scripts/check/check-workflows.mjs --ratchet→ OK (145/145). Nota de colisão cross-PR com feat(quality): torna o gate de a11y real (@axe-core/playwright no nightly) (T13) #4321 noquality-baseline.json.stryker.disablebail.json→extendsresolve,disableBail:true/incremental:false.🤖 Generated with Claude Code