Skip to content

feat(quality): destrava R1 — medição de redundância de testes (disableBail) - #4322

Merged
diegosouzapw merged 3 commits into
release/v3.8.30from
qg-r1-redundancy
Jun 20, 2026
Merged

diegosouzapw merged 3 commits into
release/v3.8.30from
qg-r1-redundancy

Conversation

@diegosouzapw

Copy link
Copy Markdown
Collaborator

Contexto

Destrava o R1 (prune de testes redundantes) do programa Quality Gate v2. O nightly de mutação baila no 1º kill, então killedBy lista só o primeiro killer — 🟠 redundant fica subestimado e 🟢 unique superestimado (caveat documentado em mutation-radiography.mjs). Sem disableBail não dá para afirmar redundância real.

O que entrega

  1. stryker.disablebail.json — override one-off (extends a base + disableBail:true + incremental:false). Não toca o nightly.
  2. .github/workflows/mutation-redundancy.yml — workflow_dispatch que roda os 6 leaf-batches combo+chatCore (d/e/f/g/h/i, espelhando o nightly) com o override e sobe os mutation.json.
  3. mutation-radiography.mjs --candidates — em vez de um script novo (que duplicaria a lógica e, no rascunho do plano, assumia o schema ERRADO de testFiles), reusa aggregateRadiography (DRY): redundancyCandidates() retorna 🔴 empty ∪ 🟠 redundant (zero kills únicos). Sob disableBail o killedBy é completo → 🟠 redundant fica 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.mjs novo com testFiles mapeado como {id:{name}}. O schema REAL do Stryker é {filePath:{tests:[{id,name}]}} — o mutation-radiography.mjs já o resolve corretamente e já classifica redundant/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.

⚠️ Próximo passo — medição + GATE HUMANO (não-mergeável ainda)

  1. Disparar mutation-redundancy.yml nesta branch (vou disparar agora; ~3h cold, 6 batches paralelos — risco: o batch d ~197min sob bail pode estourar 300min sob disableBail e não gravar report; os outros 5 dão dado mesmo assim).
  2. gh run download <id> --pattern "mutation-nobail-*" → node scripts/quality/mutation-radiography.mjs --candidates mutation-nobail-*/mutation.json.
  3. Filtrar segurança/contrato/repro (routeGuard, OAuth, error-sanitization, *-repro*/*-regression*) e apresentar ao owner.
  4. Nada é deletado sem OK explícito — deleções viram um PR separado, cada uma provando que cobertura + check:test-discovery não regridem.

Este PR entrega só a ferramenta de medição; o prune é um follow-up gated.

Validação local

🤖 Generated with Claude Code

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).
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Warning

You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again!

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@diegosouzapw

Copy link
Copy Markdown
Collaborator Author

Correção: o run de medição é merge-gated (não dispara agora)

Tentei gh workflow run mutation-redundancy.yml --ref qg-r1-redundancy → HTTP 404: o GitHub só registra workflows workflow_dispatch a partir do default branch (main). Como mutation-redundancy.yml é novo (só existe nesta branch), ainda não é disparável. (O a11y do #4321 funcionou porque nightly-resilience.yml já existia em main — lá só o job é novo.)

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 → main, ou via cherry-pick pontual do arquivo para main.

Mitigação — a ferramenta já está provada sem o run:

  • redundancyCandidates() chama o mesmo aggregateRadiography() que o nightly radiography (mutation-radiography.mjs) já usa em produção sobre mutation.json REAL do tap-runner. O consumo do schema real (testFiles[file].tests[].id + killedBy) já é exercitado hoje no CI nightly — não é caminho novo.
  • A adição é puro filtro da classificação existente (empty ∪ redundant), coberta por TDD (6/6).

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:
gh run download <id> --pattern "mutation-nobail-*" && node scripts/quality/mutation-radiography.mjs --candidates mutation-nobail-*/mutation.json

@diegosouzapw
diegosouzapw merged commit facbb19 into release/v3.8.30 Jun 20, 2026
4 checks passed
@diegosouzapw diegosouzapw mentioned this pull request Jun 20, 2026
@diegosouzapw
diegosouzapw deleted the qg-r1-redundancy branch June 21, 2026 12:33
tkgo11 pushed a commit to tkgo11/OmniRoute that referenced this pull request Sep 23, 2026
…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).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant